论坛首页 Java企业应用论坛

一段弱智代码引发的一些思考(我们是不是该进行BDD了?)

浏览 32586 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-03-31   最后修改:2012-03-31
icelander 写道
jinnianshilongnian 写道
icelander 写道
一个方法里最好只有一个return


当然 越少越好,但实际可能吗?


这很难吗,编程规范最基本的东西

private boolean canPay(List<SaleOrderModel> saleOrderList) {  
       if (CollectionUtils.isEmpty(saleOrderList)) {  
           return false;  
       }  
       SaleOrderModel saleOrder = saleOrderList.get(0);  
       if (saleOrder.getOrderUuid() <= 0) {  
           return false;  
       }  
       if (saleOrder.getOrder().getState() != OrderStateEnum.wait_pay.getType()) {  
           return false;  
       }  
       return true;  
   }  


private boolean canPay(List<SaleOrderModel> saleOrderList) {  
       boolean canPay = true;
       if (CollectionUtils.isEmpty(saleOrderList)) {  
           canPay = false;  
       }  
       SaleOrderModel saleOrder = saleOrderList.get(0);  
       if (saleOrder.getOrderUuid() <= 0) {  
           canPay = false;  
       }  
       if (saleOrder.getOrder().getState() != OrderStateEnum.wait_pay.getType()) {  
           canPay = false;  
       }  
       return canPay;  
   }  



你这样可能会有问题


SaleOrderModel saleOrder = saleOrderList.get(0); 



       if (saleOrder.getOrderUuid() <= 0) { 
           canPay = false; 
       } 

//此处如果saleOrder.getOrderUuid() <= 0    saleOrder.getOrder()将为null

       if (saleOrder.getOrder().getState() != OrderStateEnum.wait_pay.getType()) { 
           canPay = false; 
       } 




编码规范我懂, 但我想要背后的事情,我很懒 我不想去记编码规范------- 我们需要工具来帮我们检查代码的规范!

我想听一些代码分析的建议。对不?
0 请登录后投票
   发表时间:2012-04-01  
最大的问题还是在于个人编程习惯,也就是格式化代码这块,使你的条件判断清晰起来,我一向都是要求我的组员按照我的这种方式来格式化代码,而不是一味的使用的alt+shift+f。
     if(
          saleOrderList.size() == 0
            &&
          saleOrderList.get(0).getOrderUuid <=0
            &&
          saleOrder.getOrder().getState() != OrderStateEnum.wait_pay.getType()) 
        ){
        
        ActionContext.getContext().put("orderUuid", saleOrderList.get(0).getOrderUuid());
        return "redirectToPay";     
     }


并不是一味追求重构,要善于利用重构里面的“招式”,像楼主那样之后的重构只是无疑导致代码另外一种坏味道——“过长函数”

以上仅仅是我个人的一点见解。
0 请登录后投票
   发表时间:2012-04-01  
言日星极 写道
最大的问题还是在于个人编程习惯,也就是格式化代码这块,使你的条件判断清晰起来,我一向都是要求我的组员按照我的这种方式来格式化代码,而不是一味的使用的alt+shift+f。
     if(
          saleOrderList.size() == 0
            &&
          saleOrderList.get(0).getOrderUuid <=0
            &&
          saleOrder.getOrder().getState() != OrderStateEnum.wait_pay.getType()) 
        ){
        
        ActionContext.getContext().put("orderUuid", saleOrderList.get(0).getOrderUuid());
        return "redirectToPay";     
     }


并不是一味追求重构,要善于利用重构里面的“招式”,像楼主那样之后的重构只是无疑导致代码另外一种坏味道——“过长函数”

以上仅仅是我个人的一点见解。



自动格式化我也不推荐,这种方式是死的!可能并不能很好的符合团队的习惯!

“过长函数” 我们定义是超过80行才是过长的函数

我想表达的不是谁的好谁的坏,而是如何保证所有队员都能按照一致的约定编程?如使用checkstyle等工具自动化的检查。想学习一下相关的经验。
0 请登录后投票
   发表时间:2012-04-01  
chrhust 写道
saleOrder.getOrder().getState()这种我一般分开写,
Order order = saleOrder.getOrder();
if(order!=null && order.getState()...)虽然觉得很麻烦


这样子,程序执行的步程数少很多!!!
0 请登录后投票
   发表时间:2012-04-01  
jinnianshilongnian 写道
youarestupid 写道
devroller2 写道
devroller2 写道
lz你的if条件并不是很难理解,原因是只有&&,人理解还是比较容易,所以你的第一个方法是可行的。

那种既包含&&又包含||、()的,让人读了半天绕不过来的才需要重构,否则格式化一下代码就可以了。


当然,你项目中有很多相同的这段逻辑,那么重构为一个方法是一定的。

楼主重构的思路是正确的,楼主的第一段例子代码中,即使不把&&写错成&,也是很不好的一种写法,因为,那段代码的主要问题不是因为if()条件太长,也不是因为条件内夹杂了&& 和 ||,而是在同一个if()条件内混合了不同层次的条件判断,像这种场景是应该进行楼主第二段的重构的。



我们水平再高,也避免不了犯错误。

一下是我的思考与问题:

工具、框架 需求相对稳定,而应用程序 需求可能随时变化,那应该如何进行单元测试呢?
1、工具、框架 应该进行单元测试吗? 哪些组件及如何进行单元测试?
     它们相对来说 需求稳定,而且尽量对所有组件进行单元测试,如spring框架 做的相当好。 TDD吗?
2、应用程序 应该进行单元测试吗?  哪些组件及如何进行单元测试?
     但应用程序 需求可能随时会变而且变化会很大,那应该进行单元测试吗?及何时进行单元测试?单元测试应该如何应对随时变化的需求呢? BDD吗?

一起讨论下!

工具、框架、应用程序 应该分别如何写单元测试 来避免我们遇到的问题


你理解错也!工具、框架和应用程序都是由代码组成的,思想和方法都是一样的。他们有很多共性,比如需求的的变化。你应该用框架的设计思想和方法应用到你的应用程序中去。应用程序只不过是在某个业务领域内的专业软件,他们也有稳定需求的地方,那么你把这些稳定需求设计到所谓的“应用程序框架”中去,把不稳定的抽象出来,那就能适应需求的不断变化。像框架spring,它的定位是面向非常广阔的业务领域,那些公共的基础设施(ioc、事务管理等)是它的稳定需求,所以spring实现的时候把他们纳入框架中。spring做的好,也不是它用了什么TDD的方法,而是它的定位和设计。一个软件的好坏应该看它的定位和是否有可维护性、可扩展性。
0 请登录后投票
   发表时间:2012-04-01  
  wo ca  又是这哥们,又是一对字。
0 请登录后投票
   发表时间:2012-04-01  
devroller2 写道
jinnianshilongnian 写道
youarestupid 写道
devroller2 写道
devroller2 写道
lz你的if条件并不是很难理解,原因是只有&&,人理解还是比较容易,所以你的第一个方法是可行的。

那种既包含&&又包含||、()的,让人读了半天绕不过来的才需要重构,否则格式化一下代码就可以了。


当然,你项目中有很多相同的这段逻辑,那么重构为一个方法是一定的。

楼主重构的思路是正确的,楼主的第一段例子代码中,即使不把&&写错成&,也是很不好的一种写法,因为,那段代码的主要问题不是因为if()条件太长,也不是因为条件内夹杂了&& 和 ||,而是在同一个if()条件内混合了不同层次的条件判断,像这种场景是应该进行楼主第二段的重构的。



我们水平再高,也避免不了犯错误。

一下是我的思考与问题:

工具、框架 需求相对稳定,而应用程序 需求可能随时变化,那应该如何进行单元测试呢?
1、工具、框架 应该进行单元测试吗? 哪些组件及如何进行单元测试?
     它们相对来说 需求稳定,而且尽量对所有组件进行单元测试,如spring框架 做的相当好。 TDD吗?
2、应用程序 应该进行单元测试吗?  哪些组件及如何进行单元测试?
     但应用程序 需求可能随时会变而且变化会很大,那应该进行单元测试吗?及何时进行单元测试?单元测试应该如何应对随时变化的需求呢? BDD吗?

一起讨论下!

工具、框架、应用程序 应该分别如何写单元测试 来避免我们遇到的问题


你理解错也!工具、框架和应用程序都是由代码组成的,思想和方法都是一样的。他们有很多共性,比如需求的的变化。你应该用框架的设计思想和方法应用到你的应用程序中去。应用程序只不过是在某个业务领域内的专业软件,他们也有稳定需求的地方,那么你把这些稳定需求设计到所谓的“应用程序框架”中去,把不稳定的抽象出来,那就能适应需求的不断变化。像框架spring,它的定位是面向非常广阔的业务领域,那些公共的基础设施(ioc、事务管理等)是它的稳定需求,所以spring实现的时候把他们纳入框架中。spring做的好,也不是它用了什么TDD的方法,而是它的定位和设计。一个软件的好坏应该看它的定位和是否有可维护性、可扩展性。


工具、框架需求相对稳定,使用TDD开发这个咱没有疑问。
但应用程序,比如订单流程,今天可能支付成功送100积分,明天可能支付1000赠送5本书,这个需求是变化很快的,是不是BDD更适合呢?

还有spring之所以稳定难道不是单元测试造就的吗?(架构和设计造就了它灵活、可维护、可扩展等,但单元测试绝对是稳定性的基础)
0 请登录后投票
   发表时间:2012-04-01  
lianglove_0 写道
  wo ca  又是这哥们,又是一对字。


??
0 请登录后投票
   发表时间:2012-04-01  
jinnianshilongnian 写道
devroller2 写道
jinnianshilongnian 写道
youarestupid 写道
devroller2 写道
devroller2 写道
lz你的if条件并不是很难理解,原因是只有&&,人理解还是比较容易,所以你的第一个方法是可行的。

那种既包含&&又包含||、()的,让人读了半天绕不过来的才需要重构,否则格式化一下代码就可以了。


当然,你项目中有很多相同的这段逻辑,那么重构为一个方法是一定的。

楼主重构的思路是正确的,楼主的第一段例子代码中,即使不把&&写错成&,也是很不好的一种写法,因为,那段代码的主要问题不是因为if()条件太长,也不是因为条件内夹杂了&& 和 ||,而是在同一个if()条件内混合了不同层次的条件判断,像这种场景是应该进行楼主第二段的重构的。



我们水平再高,也避免不了犯错误。

一下是我的思考与问题:

工具、框架 需求相对稳定,而应用程序 需求可能随时变化,那应该如何进行单元测试呢?
1、工具、框架 应该进行单元测试吗? 哪些组件及如何进行单元测试?
     它们相对来说 需求稳定,而且尽量对所有组件进行单元测试,如spring框架 做的相当好。 TDD吗?
2、应用程序 应该进行单元测试吗?  哪些组件及如何进行单元测试?
     但应用程序 需求可能随时会变而且变化会很大,那应该进行单元测试吗?及何时进行单元测试?单元测试应该如何应对随时变化的需求呢? BDD吗?

一起讨论下!

工具、框架、应用程序 应该分别如何写单元测试 来避免我们遇到的问题


你理解错也!工具、框架和应用程序都是由代码组成的,思想和方法都是一样的。他们有很多共性,比如需求的的变化。你应该用框架的设计思想和方法应用到你的应用程序中去。应用程序只不过是在某个业务领域内的专业软件,他们也有稳定需求的地方,那么你把这些稳定需求设计到所谓的“应用程序框架”中去,把不稳定的抽象出来,那就能适应需求的不断变化。像框架spring,它的定位是面向非常广阔的业务领域,那些公共的基础设施(ioc、事务管理等)是它的稳定需求,所以spring实现的时候把他们纳入框架中。spring做的好,也不是它用了什么TDD的方法,而是它的定位和设计。一个软件的好坏应该看它的定位和是否有可维护性、可扩展性。


工具、框架需求相对稳定,使用TDD开发这个咱没有疑问。
但应用程序,比如订单流程,今天可能支付成功送100积分,明天可能支付1000赠送5本书,这个需求是变化很快的,是不是BDD更适合呢?

还有spring之所以稳定难道不是单元测试造就的吗?(架构和设计造就了它灵活、可维护、可扩展等,但单元测试绝对是稳定性的基础)


我想订单流程肯定有稳定的地方,那些积分送什么的逻辑可以认为是扩展,假设你设计订单流程用模板方法模式,积分送书、送MP3啊都是可以扩展的。这些通过OO的多态来代替你的if判断,你看是不是避免了你把&&误写为&了

spring的作者也推崇单元测试,这个对软件的稳定是有帮助的,也是必须的。但如果设计不做好,单元测试也很难执行到位,想我们干脆就上集成测试,单元测试就免了。
0 请登录后投票
   发表时间:2012-04-01  
多了一个&,&和两个&&是不一样的逻辑关系。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics