[TOC]
六大原则
单一职责原则
定义:一个类负责一项职责
优点:
- 降低类的复杂度
- 提高类的可读性,提高系统的可维护性
- 降低变更引起的风险
违反:只有逻辑足够简单,才可以在代码级别上违反单一职责原则;只有类中方法数量足够少,才可以在方法级别上违反单一职责原则。
里氏替换原则
定义:子类可以扩展父类的功能,但不能改变父类原有的功能。
建议:子类继承父类时,尽量不要重写父类的抽象方法。
- 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
- 子类中可以增加自己特有的方法。
- 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
- 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
依赖倒置原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。
解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。
妈妈根据书来讲故事,改成根据报纸讲故事,所以改成妈妈依赖IReader接口,书和报纸实现这个接口。
面向接口编程
定义与实现分离。通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。
面向对象
我们考虑问题时,以对象为单位,考虑它的属性及方法。
特征
- 抽象 提取现实世界中某事物的关键特性,为该事物构建模型的过程。对同一事物在不同的需求下,需要提取的特性可能不一样。得到的抽象模型中一般包含:属性(数据)和操作(行为)。这个抽象模型我们称之为类。对类进行实例化得到对象。
- 封装
只暴露给类外部或者子类必须的属性和操作,类封装的实现依赖类的修饰符(public、protected和private等)。 - 继承 对现有类的一种复用机制。一个类如果继承现有的类,则这个类将拥有被继承类的所有非私有特性(属性和操作)。这里指的继承包含:类的继承和接口的实现。
面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现 - 多态 三要素:继承、重写和父类引用指向子类对象。
接口隔离原则
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
通俗地说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。
解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。
- 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
- 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
- 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
迪米特法则
迪米特法则又叫最少知道原则。软件编程的总的原则是:高内聚,低耦合。迪米特原则正是为了降低耦合提出的。
定义:一个对象应该对其他对象保持最少的了解。还有一个更简单的定义:只与直接的朋友通信。只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖(局部变量、方法的形参,或者对静态方法的调用)、关联(涉及的类在同一个层次,成员变量、方法形参)、组合(构造方法)、聚合(整体与部分,聚合关系一般使用setter方法给成员变量赋值。)等。
以局部变量出现的耦合不属于直接朋友,比如总公司与分公司是朋友,但总公司与分公司的员工不是朋友。
开闭原则
定义:对扩展开放,对修改关闭。
通俗地说,就是用抽象构建框架,用实现扩展细节。