目录

面向抽象原则

开闭原则

开闭原则的关键点

开闭原则的好处

多用组合少用继承原则

原则解释

为什么优先使用组合

高内聚低耦合原则

1. 高内聚(High Cohesion)

2. 低耦合(Low Coupling)

高内聚与低耦合的关系


面向抽象原则

面向抽象原则(Dependence on Abstraction Principle),也称为依赖倒置原则(Dependency Inversion Principle, DIP),是面向对象设计中的重要原则之一,属于SOLID设计原则中的一部分。它的核心思想是:高层模块不应该依赖于低层模块,两者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象

要点:

  1. 高层模块不依赖低层模块

    • 在软件系统中,高层模块通常是指那些负责业务逻辑或核心功能的部分,而低层模块是指底层的实现细节,如数据库访问、网络通信等。依赖倒置原则认为,高层模块不应该直接依赖于低层模块的实现细节。
  2. 两者都应该依赖抽象

    • 为了降低模块之间的耦合度,高层模块和低层模块都应该依赖于抽象(如接口或抽象类),而不是具体实现。这样一来,当底层实现发生变化时,不需要修改高层模块的代码,只需修改抽象的实现部分。
  3. 抽象不依赖细节,细节依赖抽象

    • 抽象通常是指接口或抽象类,它们定义了系统中的行为契约。具体实现细节应该依赖于这些抽象,而不是反过来。也就是说,设计系统时,应先定义抽象层,然后在低层实现这些抽象。

开闭原则

开闭原则(Open-Closed Principle, OCP)是面向对象设计中的一项重要原则,属于SOLID原则之一。它的核心思想是:软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。也就是说,当需求变化或需要添加新功能时,应该通过扩展现有的代码,而不是直接修改已经存在的代码。

开闭原则的关键点

  1. 对扩展开放(Open for extension)

    • 软件系统应该允许在不修改现有代码的前提下增加新功能。这样可以让系统变得灵活、易于扩展,开发者可以通过增加新的类或功能模块来满足新的需求,而不需要更改现有的代码结构。
  2. 对修改关闭(Closed for modification)

    • 一旦类或模块完成并投入使用,开发者应该尽量避免直接修改它。修改现有代码可能会引入新的缺陷,或影响已经稳定的功能。因此,在添加新功能或应对需求变化时,优先选择通过继承、实现接口等方式来扩展功能,而不是修改现有的代码。

开闭原则的好处

  • 提高系统的稳定性:现有的功能不被修改,减少了引入新问题的风险。
  • 增强代码的可维护性:因为不直接修改代码,所以不会破坏原有的逻辑和结构,维护起来更安全、可控。
  • 方便扩展:通过扩展的方式可以更容易地添加新功能,增强系统的灵活性。

多用组合少用继承原则

多用组合,少用继承原则(Favor Composition Over Inheritance)是一项面向对象设计中的重要原则,它建议在设计软件时,优先使用对象组合(Composition)来复用代码,而非继承(Inheritance)。这种方法可以提供更大的灵活性,减少代码耦合,并且更容易维护和扩展系统。

原则解释

  1. 继承(Inheritance)

    • 继承是面向对象编程中常见的机制,它允许一个类(子类)继承另一个类(父类)的属性和方法。这种方式可以让子类重用父类的功能,并通过方法重写(Override)实现一些定制功能。
    • 虽然继承可以复用代码,但它也有一些缺陷,尤其是在父类和子类之间的耦合度较高时。当父类发生变化时,所有继承的子类可能都会受到影响,这增加了代码维护的复杂性。
  2. 组合(Composition)

    • 组合是一种对象之间的关系,通过将一个对象作为另一个对象的成员属性来实现功能复用。组合的核心思想是**“有一个”(Has-a)关系,而继承表示“是一个”**(Is-a)关系。
    • 在组合中,类通过包含其他类的实例来实现复杂功能,这种方式更加灵活,类的行为可以通过组合不同的对象来动态改变,而不会引入过多的依赖关系。

为什么优先使用组合

  1. 灵活性更高

    • 组合允许通过将不同的类组合在一起来创建新功能,而不需要创建复杂的类层次结构。对象的行为可以在运行时通过改变其组成对象的实例来调整,而继承的类结构是静态的,无法在运行时动态调整。
  2. 减少耦合

    • 继承会将子类和父类紧密绑定在一起,当父类发生变化时,子类可能需要进行相应的修改。而组合则不会有这种强依赖关系,每个类可以独立于其他类进行维护。
  3. 符合单一职责原则

    • 继承往往会导致子类继承父类的所有功能,即使有些功能子类并不需要使用。而组合可以更加精准地选择哪些功能应该组合到一起,保持类的单一职责,从而提高系统的可维护性。
  4. 避免“菱形继承”问题

    • 在复杂的继承体系中,可能会出现“菱形继承”问题(即多个父类继承同一个基类),这会导致方法冲突等问题。而组合可以有效避免这种复杂的继承结构。

高内聚低耦合原则

高内聚低耦合原则(High Cohesion and Low Coupling)是面向对象设计和软件架构中的一项关键原则,旨在提高系统的模块化、可维护性和可扩展性。它包括两个方面:高内聚低耦合,这两者是设计健壮、灵活和易于维护的系统的基础。

1. 高内聚(High Cohesion)

内聚指的是一个模块或类内部各个元素之间的紧密程度。高内聚意味着一个模块、类或方法的职责是单一且明确的,内部功能高度相关。

  • 高内聚的特点

    • 模块内的元素(如方法、属性)有紧密的关联性,共同为实现某个单一的功能服务。
    • 模块的职责明确,遵循单一职责原则(Single Responsibility Principle, SRP)。
    • 功能划分清晰,每个模块或类处理特定的逻辑,便于理解和维护。
  • 高内聚的好处

    • 易维护:当模块内部功能相关时,维护该模块会变得容易,因为功能集中在一起,修改一个功能不会影响其他不相关的部分。
    • 易理解:高内聚的模块通常职责单一,理解起来更加简单。
    • 减少依赖:高内聚的模块对外部的依赖较少,通常独立处理自己的逻辑。

2. 低耦合(Low Coupling)

耦合指的是一个模块与其他模块之间的依赖程度。低耦合意味着模块之间的依赖性低,一个模块的变化不会对其他模块产生过多影响。

  • 低耦合的特点

    • 模块之间相互独立,减少直接的依赖关系。
    • 模块之间通过抽象接口、消息或依赖注入等方式进行通信,而不是直接依赖具体的实现。
    • 模块之间的交互是明确且尽量少的,避免不必要的依赖链条。
  • 低耦合的好处

    • 易扩展:低耦合的模块可以很容易地独立扩展或修改,而不会影响其他模块。
    • 易维护:当一个模块变化时,其他模块的代码无需修改,减少了维护成本。
    • 提高复用性:低耦合的模块更具通用性,能够在不同的系统或场景中复用。

高内聚与低耦合的关系

  • 协同作用:高内聚和低耦合相辅相成。高内聚强调模块内部的紧密性,而低耦合强调模块之间的独立性。一个模块内的元素应该紧密相关(高内聚),但模块之间的依赖应尽可能降低(低耦合)。
  • 模块化设计:高内聚和低耦合共同推动模块化设计,通过划分单一功能的模块,使得系统更容易维护、扩展和复用。

更多推荐