zoukankan      html  css  js  c++  java
  • 小鸡和代码代码重构[2]:MOVE METHOD

    导读:   

    不知道你是不是吃过无花果,或者听说过无花果?无花果不是没花,而是开放的花我们看不到而已,为了给无花果传递花粉,遗传后代,

    造物主创造了另个事物容小蜂,专门为无花果一一传递花粉,当然容小蜂也就寄居在无花果的花囊里繁殖自己的后代。在自然界这种关系叫互利共生。

    这样就遇到了这样的问题,在设计类的时候,无花果与容小蜂会用到同样的方法,那么这样怎么设计类呢?怎样进行重构呢?


    而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的时候最主要的是自己的感触,自己的想法,最近发现自己还是对形象的东西比较感兴趣,比如物理学的弹簧振子,压力,

    重力一些抽象的东     只要自己用形象的东西去思考,用实际上存在的东西去比较,原来是这么有意思,这么好玩。

  • 相关阅读:
    桟错误分析方法
    gstreamer调试命令
    sqlite的事务和锁,很透彻的讲解 【转】
    严重: Exception starting filter struts2 java.lang.NullPointerException (转载)
    eclipse 快捷键
    POJ 1099 Square Ice
    HDU 1013 Digital Roots
    HDU 1087 Super Jumping! Jumping! Jumping!(动态规划)
    HDU 1159 Common Subsequence
    HDU 1069 Monkey and Banana(动态规划)
  • 原文地址:https://www.cnblogs.com/muer/p/movemethod.html
Copyright © 2011-2022 走看看