美文网首页
改善既有代码的设计笔记(三)代码的坏味道

改善既有代码的设计笔记(三)代码的坏味道

作者: 红发_SHANKS | 来源:发表于2018-07-11 13:45 被阅读7次

    前面两篇笔记涉及到了部分重构的时机,本篇笔记全部为重构代码的时机。重构时机,不是僵硬死板的必须在什么时候执行,下面这些时机可以作为一种重构时机的参考。

    Duplicated code(重复代码)

    如果我们在一个地点以上看到了相同的程序结构,那么可以肯定,将他们合二为一是一个不错的选择。
    重复代码出现的位置可能有以下几种:

    • 同一个类中的不同方法。使用Extra Method 抽取公共代码,提取方法
    • 两个互为兄弟的类含有相同的表达式。使用 Extra Method抽取方法,然后使用 Pull Up Method
    • 两个毫不相关的类出现重复代码。那么可能应该使用 Extra Class提取另外一个工具类,提供对应的方法。也有可能某个方法只能在某一个类内部,这时候新抽取的方法究竟放在那里,视情况而定。

    Long Method(过长方法)

    很早之前人们就认识到了,过长的方法不利于理解,不易于复用,而且容易隐藏 bug。

    如果我们感觉在一个方法中,需要写一些代码来说明什么,那么可能这里需要被分割成更小的方法,并且根据方法的行为取一个合适的名字,让方法具有自解释性。分割新的方法的时候常用的是 Extra Method

    如果一个方法中有太多的参数和临时变量,那么可能会妨碍我们提取新的方法,这时候最好消灭掉那些不必要的临时变量 (Replace Temp with Query)。

    条件表达式也是一种重构的节点,这时候使用 Decompose Conditional(分解条件表达式)。如果 if 条件表达式过于复杂,那么对 if 条件表达式进行抽取,如果 if 语句块中的代码过于复杂,也应该进行抽取。参考下面的示例:
    重构以前

    if (date.before (SUMMER_START) || date.after(SUMMER_END))
      charge = quantity * _winterRate + _winterServiceCharge;
    else charge = quantity * _summerRate;
    

    重构以后

    if (notSummer(date))
      charge = winterCharge(quantity);
    else charge = summerCharge (quantity);
    

    如果方法内包含大块的循环语句体,应该将它抽取为一个单独的方法。

    Large Class(过大的类 )##

    如果单个类中想要做太多的事情,就可能有太多的实例变量,这时候重复代码就出现了。我们应该对过大的类使用 Extra Class 进行抽取,注意,相关联的各个实例变量应该抽取到一个方法内。也可以抽取子类或者是接口来拆分过大的类。

    Long Parameter List(过长参数)

    如果向已有对象发送一两个请求就可以取代一个参数,那么就应该取消参数。但是,如果我们不想要传递对象进去,那么保持参数也是个不错的选择。

    Divergent Change(发散变化)

    如果我们新增一个功能,需要修改某个类的好多个方法,那么可能需要提取一个新的对象,保证所有的修改都在一个类中。从而避免一个类受到多种变化的影响

    Shotgun Surgery(散弹式变化)##

    如果每次有某种变化,都必须在许多不同的类内做出许多小的修改是很糟糕的,在修改的过程中,很可能会遗忘某些地方,造成 bug 。这时候应该 Move Method 或者 Move Field 将所需要修改的代码放进一个类中。从而避免一中变化引发多多个类的修改

    Feature Envy(依恋情节)

    对象技术的全部要点在于:这是一种“将数据和对数据的操作放在一起”的技术。有一种经典的问题:某个方法对其他类的兴趣大过了对本类的兴趣,这时候应该把方法移动到最“依恋”的类中。如果方法依恋了多个类,那么将方法切割为更小的方法,每个方法放到合适的地方。

    Switch Statement##

    Switch 出现的地方应该尽可能的使用多台替换,方便修改和扩展。

    Lazy Class##

    随着版本的迭代,某些类不再需要,应该适时的消除他们

    Temporary Field(令人迷惑的暂时字段)##

    某个实例变量仅为特定情况而设。这样的代码让人不易理解,因为你通常认为对象在所有时候都需要他的所有对象。使用 Extra Class把所有和这个变量相关的代码都放进新的类中。

    相关文章

      网友评论

          本文标题:改善既有代码的设计笔记(三)代码的坏味道

          本文链接:https://www.haomeiwen.com/subject/rkdhpftx.html