单一职责原则
Single Responsibility Principle - SRP,就一个类而言,应该仅有一个引起它变化的原因。
单一职责原则的优点是,类的责任划分的很清楚,可以提高代码的可读性,减少维护的成本。
以京东为例,例如:
1 | @interface jder : NSObject |
这样看来这个类就有三个职责,第一个是保存员工信息,第二个是写 App,第三个是送快递。这样,日后如果需要增加员工职能,则只好在这个类中增加,从而增加了维护成本和减少了代码可读性。
遵从单一职责原则,可以修改为:
1 | @interface JDer : NSObject |
由此可以看出,开发和快递抽出放在两个类中,分工明确。代码可读性高,如果都挤在员工类,那么后期修改起来就很麻烦。如果后期开发想升级 IM 模块,那直接在开发类中指定某一个员工去升级 IM 模块,或者在快递类中增加一个某员工去分拣某天的快递。
开闭原则
Open Close Principle - OCP,程序中的对象应该对应扩展是开放的,对于修改是封闭的。
以一个论坛模型模型为例,假设一开始只有 item 的名称,描述和图片,在后期的迭代中,需要加入小视频,允许用户上传音频,需要加入音频。如果在一个 model 类中实现,可能会造成如下问题, 如果后期还需要增加别的东西:
- 反复修改最早创建的 Model 类
- 有些开发者上传音频或视频,有些不上传,这就造成了冗余
例如:
1 | @interface App : NSObject |
这样的做法,不遵从对扩展开放,修改关闭,而是直接修改了这个类。可以通过继承的方式将其拆分。
定义一个 App model 基类(假定所有 App 都需要展示名称、描述和图片):
1 | @interface Item : NSObject |
定义一个视频 App:
1 | @interface VideoItem : Item |
定义一个音频 App:
1 | @interface MusicItem : Item |
这样在以后的迭代中,如果要增加 HD 视频和音频,那么直接在对应的 Item 子类中添加即可。
里氏替换原则
Liskov Substitution Principle - LSP
依赖倒置原则
Dependency Inversion Principle - DIP,模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。即依赖抽象,而不依赖具体的实现。
对于定义,通俗的,可以理解为,针对 api 编程,而不是针对实现编程,不要从具体的类派生,而是通过继承抽象类或者实现接口去实现功能。
以一个宴会为例,一个宴会有中餐厨师和西餐厨师,并且已经订好了晚宴菜谱,有中餐和西餐,分别建立两个类:
1 | @interface ChineseCook: NSObject |
接着有一个做菜类,等宾客到来,就开始做菜了:
1 | @interface Cooking: NSObject |
接口隔离原则
Interface Segregation Principle - ISP
迪米特法则
Law of Demeter(Least Knowledge Principle)- LoD