关于代码重构的一些疑问

hflkl1314 2011-11-24 10:10:48
今天在看代码重构方面,有点疑问,不知道如果解决

在参考书上有这样一个列子:

public class Order
{
Some Method//方法如下有如下逻辑
{
1、求订单总额
2、订单总额减去一定的优惠价格,得到一个优惠价格
3、优惠价格的基础上,再打一定的折扣优惠。
}
}


代码重构以后,将上面的三个逻辑提取了变成如下
public class Order
{
Method(1)
{
求订单总额
}

Method(2)
{
订单总额减去一定的优惠价格,得到一个优惠价格
}
Method(3)
{
优惠价格的基础上,再打一定的折扣优惠。
}
}


毋庸置疑,上面的代码的确清晰了很多,三个方法很清晰。

如果知道的人 ,那肯定会按照Method(1)、Method(2)、Method(3)的方法进行调用。


但是如果不知道的人 Method(1)、Method(3)、Method(2)的方式调用,那就出现错误了。违背了当初的逻辑。

我想问下,为什么要这样重构代码呢,这样的重构会带来怎么样的好处和坏处呢
...全文
145 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
重构说白了就是功能最小化,相互之间解耦
还有就是重用
铜臂阿铁木 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hflkl1314 的回复:]

恩,我觉得是要按照实际情况来重构,看到这个例子,有疑问。所以想请教下大家
[/Quote]

重构的做法是从因需求的改变而产生的,
最被期待的重构结果也是能应需求的改变,
智能的重构则是举一反三。

既然取之于民,则用之于民。
hflkl1314 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sunzongbao2007 的回复:]
重构之前,如果出现不打折的情况,要怎么处理。如果要修改折扣百分比修改逻辑要修改多少。

重构之后,可以处理的情况更多了。比如不打折,只Method1就好了。
打一次折, Method1 Method2 或者 Method1 Method3
打两次折 Method1 method2 method3

重构之后修改打折的逻辑也可以单独修改,修改完成后重新组合又可以使用。

====……
[/Quote]
恩,我觉得是要按照实际情况来重构,看到这个例子,有疑问。所以想请教下大家
hflkl1314 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wanghui0380 的回复:]

1.这样重构是为了保证最小功能,解耦。耦合越小,修改越方便

2.有关调用顺序,由Some Method方法本身保证,Method(1)、Method(3)、Method(2)如果都是内部使用,外面的人没必要知道细节,他声明为私有即可。也就是说只有编写和修改代码的人才知道,既然此人是负责该事情滴,那么自然知道调用顺序

3.如果Method(1)、Method(3)、Method(2)是……
[/Quote]

我个人认为在此项逻辑关系中,不应该拆分,
对于耦合性很小的,这样的重构我觉得是有意义的 。不知道这样的理解对不对。
铜臂阿铁木 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 hflkl1314 的回复:]
我想问下,为什么要这样重构代码呢,这样的重构会带来怎么样的好处和坏处呢
[/Quote]
书中有解释,不要只看书里面的代码。重构跟编码是两回事儿,学习方法不一样。
铜臂阿铁木 2011-11-24
  • 打赏
  • 举报
回复


重构之前,如果出现不打折的情况,要怎么处理。如果要修改折扣百分比修改逻辑要修改多少。

重构之后,可以处理的情况更多了。比如不打折,只Method1就好了。
打一次折, Method1 Method2 或者 Method1 Method3
打两次折 Method1 method2 method3

重构之后修改打折的逻辑也可以单独修改,修改完成后重新组合又可以使用。

======================================================================================
这个重构例子说的不是让所有方法都这么拆分,而是要根据具体的需求,将逻辑变得能够应变更多的修改,应变更多的组合。
这本《Refactor》原版我看过,后面解释为何要这么重构,分析跟上面我说的好像是类似的。


最后,学重构不要痴,重构过度就不好了。
=======================================================================================
重构过度的例子:还是上面的代码,但是这次是输出“我爱你”三个字,后期不会修改,程序只用一次。
非要分成三个方法分别输出三个字……这就过度了。
wanghui0380 2011-11-24
  • 打赏
  • 举报
回复
1.这样重构是为了保证最小功能,解耦。耦合越小,修改越方便

2.有关调用顺序,由Some Method方法本身保证,Method(1)、Method(3)、Method(2)如果都是内部使用,外面的人没必要知道细节,他声明为私有即可。也就是说只有编写和修改代码的人才知道,既然此人是负责该事情滴,那么自然知道调用顺序

3.如果Method(1)、Method(3)、Method(2)是对外公开方法,那么就有调用顺序问题。此时一般还是声明为保护级别,由继承者参考文档说明去实现。如果非要是公开方法,则需要内部检查调用顺序(当然这种方式并不合理,只是在某些特殊场合才会看到这种强制的调用顺序规定)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧