问题描述
今天在看代码重构方面,有点疑问,不知道如果解决在参考书上有这样一个列子:publicclassOrder{SomeMethod//方法如下有如下逻辑{1、求订单总额2、订单总额减去一定的优惠价格,得到一个优惠价格3、优惠价格的基础上,再打一定的折扣优惠。}}
代码重构以后,将上面的三个逻辑提取了变成如下publicclassOrder{Method(1){求订单总额}Method(2){订单总额减去一定的优惠价格,得到一个优惠价格}Method(3){优惠价格的基础上,再打一定的折扣优惠。}}
毋庸置疑,上面的代码的确清晰了很多,三个方法很清晰。如果知道的人,那肯定会按照Method(1)、Method(2)、Method(3)的方法进行调用。但是如果不知道的人Method(1)、Method(3)、Method(2)的方式调用,那就出现错误了。违背了当初的逻辑。我想问下,为什么要这样重构代码呢,这样的重构会带来怎么样的好处和坏处呢
解决方案
解决方案二:
1.这样重构是为了保证最小功能,解耦。耦合越小,修改越方便2.有关调用顺序,由SomeMethod方法本身保证,Method(1)、Method(3)、Method(2)如果都是内部使用,外面的人没必要知道细节,他声明为私有即可。也就是说只有编写和修改代码的人才知道,既然此人是负责该事情滴,那么自然知道调用顺序3.如果Method(1)、Method(3)、Method(2)是对外公开方法,那么就有调用顺序问题。此时一般还是声明为保护级别,由继承者参考文档说明去实现。如果非要是公开方法,则需要内部检查调用顺序(当然这种方式并不合理,只是在某些特殊场合才会看到这种强制的调用顺序规定)
解决方案三:
重构之前,如果出现不打折的情况,要怎么处理。如果要修改折扣百分比修改逻辑要修改多少。重构之后,可以处理的情况更多了。比如不打折,只Method1就好了。打一次折,Method1Method2或者Method1Method3打两次折Method1method2method3重构之后修改打折的逻辑也可以单独修改,修改完成后重新组合又可以使用。======================================================================================这个重构例子说的不是让所有方法都这么拆分,而是要根据具体的需求,将逻辑变得能够应变更多的修改,应变更多的组合。这本《Refactor》原版我看过,后面解释为何要这么重构,分析跟上面我说的好像是类似的。最后,学重构不要痴,重构过度就不好了。=======================================================================================重构过度的例子:还是上面的代码,但是这次是输出“我爱你”三个字,后期不会修改,程序只用一次。非要分成三个方法分别输出三个字……这就过度了。
解决方案四:
引用楼主hflkl1314的回复:
我想问下,为什么要这样重构代码呢,这样的重构会带来怎么样的好处和坏处呢
书中有解释,不要只看书里面的代码。重构跟编码是两回事儿,学习方法不一样。
解决方案五:
引用1楼wanghui0380的回复:
1.这样重构是为了保证最小功能,解耦。耦合越小,修改越方便2.有关调用顺序,由SomeMethod方法本身保证,Method(1)、Method(3)、Method(2)如果都是内部使用,外面的人没必要知道细节,他声明为私有即可。也就是说只有编写和修改代码的人才知道,既然此人是负责该事情滴,那么自然知道调用顺序3.如果Method(1)、Method(3)、Method(2)是……
我个人认为在此项逻辑关系中,不应该拆分,对于耦合性很小的,这样的重构我觉得是有意义的。不知道这样的理解对不对。
解决方案六:
引用2楼sunzongbao2007的回复:
重构之前,如果出现不打折的情况,要怎么处理。如果要修改折扣百分比修改逻辑要修改多少。重构之后,可以处理的情况更多了。比如不打折,只Method1就好了。打一次折,Method1Method2或者Method1Method3打两次折Method1method2method3重构之后修改打折的逻辑也可以单独修改,修改完成后重新组合又可以使用。====……
恩,我觉得是要按照实际情况来重构,看到这个例子,有疑问。所以想请教下大家
解决方案七:
引用5楼hflkl1314的回复:
恩,我觉得是要按照实际情况来重构,看到这个例子,有疑问。所以想请教下大家
重构的做法是从因需求的改变而产生的,最被期待的重构结果也是能应需求的改变,智能的重构则是举一反三。既然取之于民,则用之于民。
解决方案八:
重构说白了就是功能最小化,相互之间解耦还有就是重用