分解方法(Extract Method)

  一个较大的方法往往也会分为多个小的段落,step1,step2,step3,在每一个步骤都会考虑添加注释说明。而这些相对较为独立的步骤可以分解为不同的方法,在分解后方法名可以自解释方法的功能而不再需要额外的注释。在一个类里面如果方法里面有一段代码在多个方法中重复出现,需要抽取该类的公用方法。在多个不同的类中有一段代码重复出现,需要考虑将公用代码放到公用类中形成公用方法。

  方法名需要很好的自解释方法的功能,方法的返回尽量单一,方法的入口参数太多的时候应该考虑使用集合,结构或数据对象进行参数的传递。参数的传递可能出传递的是引用,但不要去修改入口参数的值。

  不要因为一个方法里面只有一行,两行很短而不考虑去分解,分解的时候更多的是考虑代码的自解释性。代码本身不是解释的技术实现机制,而是解释的业务规则和需求。如果代码不是解释的业务规则和需求,那么其它人员很难快速理解。

  引入方法对象来取代方法,当发现一个方法只用到该类里面的几个关键属性,方法和类里面其它的方法交互很少,输出单一。由于该方法和这几个属性内聚性很强而和该类其它部分松耦合,因此可以考虑将方法和这部分属性移出形成一个单独的方法对象。

  移动方法,类的职责要单一,一个类的方法更多用到了别的类的属性,这个方法可能更适合定义在那个类中。

  class Account...

  private AccountType_type;

  private int_daysOverdrawn;

  double overdraftCharge(){

  if (_type.isPremium()){

  double result = 10;

  if (_daysOverdrawn > 7) result += (_daysOverdrawn -7)* 0.85;

  return result;

  }

  else return _daysOverdrawn * 1.75;

  }

  double bankCharge(){

  double result = 4.5;

  if (_daysOverdrawn > 0) result +=overdraftCharge();

  return result;

  }

  重构为:

  classAccount...

  private AccountType _type;

  private int _daysOverdrawn;

  double overdraftCharge(){

  return _type.overdraftCharge(_daysOverdrawn);

  }

  double bankCharge(){

  double result = 4.5;

  if (_daysOverdrawn > 0)

  result += _type.overdraftCharge(_daysOverdrawn);