薄情先生|你所需要知道的代码整洁之道( 二 )


把具有相同特征或相似功能的类 , 抽象成接口或抽象类 , 让具体的实现类继承这个抽象类(或实现对应的接口) 。 抽象类(接口)负责定义统一的方法 , 实现类负责具体功能的实现 。
是否一定要遵循这些设计原则

  • 软件设计是一个逐步优化的过程
  • 不是一定要遵循这些设计原则
没有这么充足的时间遵循这些原则去设计 , 或遵循这些原则设计的实现成本太大 。 在受现实条件所限不能遵循五大原则来设计时 , 我们还可以遵循下面这些更为简单、实用的原则 。
简单、实用的原则LoD原则(Law of Demeter)Each unit should have only limited knowledge about other units: onlyunits "closely"related to the current unit.Only talk to your immediatefriends,don't talk to strangers.
每一个逻辑单元应该对其他逻辑单元有最少的了解:也就是说只亲近当前的对象 。 只和直接(亲近)的朋友说话 , 不和陌生人说话 。
这一原则又称为迪米特法则 , 简单地说就是:一个类对自己依赖的类知道的越少越好 , 这个类只需要和直接的对象进行交互 , 而不用在乎这个对象的内部组成结构 。
例如 , 类A中有类B的对象 , 类B中有类C的对象 , 调用方有一个类A的对象a , 这时如果要访问C对象的属性 , 不要采用类似下面的写法:
a.getB().getC().getProperties()复制代码而应该是:
a.getProperties()复制代码KISS原则(Keep It Simple and Stupid)Keep It Simple and Stupid.
保持简单和愚蠢 。
  • “简单”就是要让你的程序能简单、快速地被实现;
  • “愚蠢”是说你的设计要简单到任何人都能理解 , 即简单就是美!
DRY原则(Don't Repeat Yourself)DRY原则(Don't Repeat Yourself)
不要重复自己 。
不要重复你的代码 , 即多次遇到同样的问题 , 应该抽象出一个共同的解决方法 , 不要重复开发同样的功能 。 也就是要尽可能地提高代码的复用率 。
要遵循DRY原则 , 实现的方式非常多:
  • 函数级别的封装:把一些经常使用的、重复出现的功能封装成一个通用的函数 。
  • 类级别的抽象:把具有相似功能或行为的类进行抽象 , 抽象出一个基类 , 并把这几个类都有的方法提到基类去实现 。
  • 泛型设计:Java 中可使用泛型 , 以实现通用功能类对多种数据类型的支持;C++中可以使用类模板的方式 , 或宏定义的方式;Python中可以使用装饰器来消除冗余的代码 。
DRY原则在单人开发时比较容易遵守和实现 , 但在团队开发时不太容易做好 , 特别是对于大团队的项目 , 关键还是团队内的沟通 。
YAGNI原则(You Aren't Gonna Need It)You aren't gonna need it,don't implement something until it isnecessary.
你没必要那么着急 , 不要给你的类实现过多的功能 , 直到你需要它的时候再去实现 。
  • 只考虑和设计必需的功能 , 避免过度设计 。
  • 只实现目前需要的功能 , 在以后需要更多功能时 , 可以再进行添加 。
  • 如无必要 , 勿增加复杂性 。
Rule Of Three原则Rule of three 称为“三次法则” , 指的是当某个功能第三次出现时 , 再进行抽象化 , 即事不过三 , 三则重构 。
  • 第一次实现一个功能时 , 就尽管大胆去做;
  • 第二次做类似的功能设计时会产生反感 , 但是还得去做;
  • 第三次还要实现类似的功能做同样的事情时 , 就应该去审视是否有必要做这些重复劳动了 , 这个时候就应该重构你的代码了 , 即把重复或相似功能的代码进行抽象 , 封装成一个通用的模块或接口 。
CQS原则(Command-Query Separation)