第三章 代码的坏味道(一)

来源:互联网 发布:51单片机智能交通灯 编辑:程序博客网 时间:2024/04/29 22:48

3.1 Duplicated Code (重复的代码)
  问题一:同一个class内的两个函数含有相同的表达式(expression).
  解决办法:采用Extract Method(110)提炼出重复的代码,然后让这两个地点都调用被提炼出来的那一段代码。

  问题二:两个互为兄弟(sibling)的subclasses内含相同表达式
  解决办法:对两个classes都使用Extract Method(110),然后再对被提炼出来的代码使用Pull Up Method(332),将它推入superclass内。

  问题三:代码之间只是类似,并非完全相同
  解决办法:运用Extract Method(110)将相似部分和差异部分分隔开,构成单独一个函数。然后可能发现或许可以运用Form Template Method(345)获得一个Template Method设计模式。

  问题四:有些函数以不同的算法做相同的事
  解决办法:选择其中较清晰的一个,并使用Substitue Algorithm(139)将其他函数的算法替换掉。

  问题五:两个毫不相关的classes内出现Duplicated Code
  解决办法:考虑对其中一个使用Extract Class(149),将重复代码提炼到一个独立class中,然后再另一个class内使用这个新class.但是,重复代码所在的函数也可能的确只应该属于某个class,另一个class只能调用它,抑或这个函数可能属于第三个class,而另两个classes应该引用这第三个class。你必须决定这个函数放在哪儿最合适,并确保它被安置后就不会再在其他任何地方出现。

3.2 Long Method(过长函数)
  百分之九十九的场合里,要把函数变小,只需使用Extract Method(110).找到函数中适合集在一起的部分,将它们提炼出来形成一个新函数。
  如果函数内有大量的参数和临时变量,可以经常运用Replace Temp with Query(120)来消除这些暂时元素。introduce Parameter Object(295)和Preserve Whole Object(288)则可以将郭仓的参数列表变得更简洁一些。
  问题一:如何确定提炼哪一段代码
  解决办法:寻找注释;条件式和循环常常也是提炼的信号。可以使用Decompose Conditional(238)处理条件式。至于循环,应该将循环和其内的代码提炼到一个独立函数中。

3.3 Large Class(过大类)
   单一的类做太多的事情,出现太多instance变量

3.4 Long ParameterList(过长参数列)
    如果手上没有你所需要的东西,可以叫另一个对象给你。有了对象,就不必把函数需要的所有东西都以参数传递给它了,你只需传给它足够的东西,让函数能从中获得自己需要的东西就可以了,函数需要的东西多半可以在函数的宿主类(host class)中找到。
    Replace Parameter with Method(292)
    Preserve Whole Object(288)
    Introduce Parameter Object(295)

3.5 Divergent Change(发散式变化)
 问题:某个class经常因为不同的原因在不同的方向上发生变化,Divergent Change就出现了。
 解决:把这个对象分成两个,这样每个对象就可以只因一种变化而需要修改。找出因某特定原因而造成的所有变化,然后运用Extract Class(149)将它们提炼到另一个class中。
3.6 Shotgun Surgery(散弹式)
  问题:每遇到某种变化,你都必须在许多不同的classes内作出许多小修改以响应值。
  解决:使用Move Method(142)和Move Field(146)把所有需要修改的代码放进同一个class。如果眼下没有合适的class可以安置这些代码,就创造一个。通常可以运用Inline Class(154)把一系列相关行为放入同一个class。这可能会造成少量Divergent Change, 但你可以轻易处理它。
    Divergent Change是一个class受多种变化的影响,Shotgun Surgery是一种变化引发多个classes响应修改。
3.7 Feature Envy(依恋情结)
  问题:某个函数为了计算某值,从另一个对象那儿调用几乎半打的取值函数(getting method).
  解决:把这个函数移至另一个地点。使用Move Method(142)把它移到它该去的地方。
3.8 Data Clumps(数据泥团)
  问题:常常可以在很多地方看到相同的三或四笔数据项;两个classes内的相同值域(field)、许多函数签名式(signature)中的相同参数。
  解决:首先找出这些数据的值域形式(field)出现点,运用Extract Class(149)将它们提炼到一个独立对象中;
        然后将注意力转移到函数签名式(signature)上头,运用Introduce Parameter Object(295)或Preserve Whole Object(288)为它减肥。这么做的直接好处是可以将很多参数列缩短,简化函数调用动作。不必因为Data Clump只用上新对象的一部分值域而在意,只要你以新对象取代两个(或更多)值域,你就值回票价了。
   评判方法:删掉众多数据中的一笔。其他数据有没有因而失去意义?如果它们不再有意义,这就是个明确信号:你应该为它们产生一个新对象。

原创粉丝点击