一、单一职责原则
概念:
一个类只负责一项功能,例如一个订单类,就只负责对订单的操作,不能去涉及到对用户或者商品的操作。(注意,一般情况下单一职责原则是作用于类上,但是如果一类的方法数量足够少,也可以把单一职责原则作用于方法上)
二、开闭原则
概念:
开闭原则是编程中最基础最重要的原则。一个软件实体,如类,函数,模块应该对扩展开放,对修改关闭。(当软件需求发生变化时,尽量通过扩展软件实体的行为来实现变化,而不是修改已有的代码来实现方法)
三、接口隔离
概念:
- 使用多个专用的接口,而不是单一的总接口。
- 一个类对另外一个类的依赖性应当是建立在最小的接口上的。
四、依赖倒置
概念:
程序要依赖于抽象接口,不要依赖于具体实现。
简单的说就是面向抽象编程,这样能降低了客户与实现模块间的耦合。
五、里氏代换
概念:
一个软件实体如果适用一个父类的话,那一定适用于其子类,所有引用父类的方法必须能透明地使用其子类的对象,子类对象能够替换父类对象,而程序逻辑不变。
子类可以扩展父类的功能,但不能改变父类原有的功能。就是说,子类可以实现父类的抽象方法,但尽量不要覆盖父类的非抽象方法。子类中可以增加自己特有的方法。
(通俗的说,不要乱用继承关系 or 不要乱写父类,否则可能会违反里氏代换。
问:违反了又怎么样? 答:容易出问题)
六、合成复用
概念:
软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。
通常类的复用分为继承复用和合成复用两种。
继承复用虽然有简单和易实现的优点,但它也存在以下缺点。
- 继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,这种复用又称为“白箱”复用。
- 子类与父类的耦合度高。这不利于类的扩展与维护。
- 它父类限制了复用的灵活性。从继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。
采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点。
- 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
- 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
- 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。
七、迪米特法则
概念:
通俗的来讲,就是一个类对自己依赖的类知道的越少越好。
对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。