导读:
不知道你是不是吃过无花果,或者听说过无花果?无花果不是没花,而是开放的花我们看不到而已,为了给无花果传递花粉,遗传后代,
造物主创造了另个事物容小蜂,专门为无花果一一传递花粉,当然容小蜂也就寄居在无花果的花囊里繁殖自己的后代。在自然界这种关系叫互利共生。
这样就遇到了这样的问题,在设计类的时候,无花果与容小蜂会用到同样的方法,那么这样怎么设计类呢?怎样进行重构呢?
而MOVE METHOD就为我们找到了方法:
计算机是模拟现实而存在的,在编码的时候,通常会遇到A类与B类之间的互利共生(相互依赖),究竟该把共用的方法写到那个类文件里面比较好?
遇到这种问题,一般处理的思路是将共用的方法,放到最后谁在用该方法的类里面。
一下是自己扒掉一点代码,中文画图画出来的,没什么实际意义,仅仅只是帮助理解才写到这里面的
重构前:
共用方法写在无花果里面
1 public class 无花果
2 {
3 public 无花果(int 雌花, int 雄花, 榕小蜂 榕小蜂)
4 {
5 A雌花 = 雌花;
6 C雄花 = 雄花;
7 C榕小蜂 = 榕小蜂;
8 }
9 public int A雌花 { get; private set; }
10 public int C雄花 { get; private set; }
11 public 榕小蜂 C榕小蜂 { get; private set; }
12
13 public double 榕小蜂为无花果授粉()
14 {
15 if (A雌花 + C雄花 + C榕小蜂都存在授粉成功)
16 return 1;//"榕小蜂也有自己房子了+食物";
17 //C雄花 + C雄花
18 if (缺少成分的时候)
19 return 0.5;//"榕小蜂没地方可住了";
20 return 0;//"什么也没有";
21 }
22 }
23
24 public class 榕小蜂
25 {
26 public 无花果 A无花果 { get; private set; }
27 public 榕小蜂(无花果 无花果)
28 {
29 A无花果 = 无花果;
30 }
31 public double 榕小蜂有房子了
32 {
33 get { return A无花果.榕小蜂为无花果授粉(); }
34 }
35 public bool 榕小蜂我得到房子吗
36 {
37 get { return A无花果.榕小蜂为无花果授粉() < 0.05; }
38 }
39 }
40 }
重构后:
重构后
1 public class 无花果
2 {
3 public 无花果(int 雌花, int 雄花, 榕小蜂 榕小蜂)
4 {
5 A雌花 = 雌花;
6 C雄花 = 雄花;
7 A榕小蜂 = 榕小蜂;
8 }
9 public int A雌花 { get; private set; }
10 public int C雄花 { get; private set; }
11 //调用榕小蜂的一个方法
12 public 榕小蜂 A榕小蜂 { get; private set; }
13 }
14
15
16 public class 榕小蜂
17 {
18 public 无花果 A无花果 { get; private set; }
19 public 榕小蜂(无花果 无花果)
20 {
21 A无花果 = 无花果;
22 }
23 public double 榕小蜂有房子了
24 {
25 get { return 榕小蜂为无花果授粉(); }
26 }
27 public bool 榕小蜂我得到房子吗
28 {
29 get { return 榕小蜂为无花果授粉() < 0.05; }
30 }
31 public double 榕小蜂为无花果授粉()
32 {
33 if (A雌花 + C雄花 + C榕小蜂都存在授粉成功)
34 return 1;//"榕小蜂也有自己房子了+食物";
35 //C雄花 + C雄花
36 if (缺少成分的时候)
37 return 0.5;//"榕小蜂没地方可住了";
38 return 0;//"什么也没有";
39 }
40 }
总结:
如果 ClassA 的某个函数对 ClassB 有过多的依赖, 可以考虑将这个函数搬到 ClassB 中, 在 ClassA 的这个函数中直接调用 ClassB中这个函数的返回值.
这样做的好处是减少物件与物件之间的耦合度, 很多情况下这样做更利于进一步的重构.
写给自己的:在看书,看DEMO的时候最主要的是自己的感触,自己的想法,最近发现自己还是对形象的东西比较感兴趣,比如物理学的弹簧振子,压力,重力一些抽象的东 只要自己用形象的东西去思考,用实际上存在的东西去比较,原来是这么有意思,这么好玩。