跳转到内容

编程原则

面向对象编程(OOP)通过四大特性为构建复杂软件提供了基础表达能力:

  • 抽象 (Abstraction): 忽略非本质的细节,只关注与当前目标相关的特征,提取公共接口和行为。
  • 封装 (Encapsulation): 将数据与操作数据的方法绑定,隐藏对象的内部实现细节,仅暴露安全的公共访问方式。
  • 继承 (Inheritance): 允许子类复用父类的属性和方法,实现代码重用与类型层次划分。
  • 多态 (Polymorphism): 允许同一接口在运行时根据接收对象的实际类型表现出不同的行为,实现接口与实现的解耦。

为了使软件系统更加可维护、可扩展和易于理解,需遵循以下经典设计原则:

2.1. 单一职责原则 (Single Responsibility Principle, SRP)

Section titled “2.1. 单一职责原则 (Single Responsibility Principle, SRP)”
  • 定义: 一个类或模块应该有且只有一个引起它变化的原因。
  • 核心逻辑: 避免同一个类承担过多不相关的业务职责。如果一个类承载了太多功能,当其中一个功能需要修改时,可能会意外地破坏或影响该类中的其他功能。

2.2. 开放-封闭原则 (Open-Closed Principle, OCP)

Section titled “2.2. 开放-封闭原则 (Open-Closed Principle, OCP)”
  • 定义: 软件实体(类、模块、函数等)应当对扩展开放,对修改封闭。
  • 核心逻辑: 当需求发生变更时,我们应该通过增加新的代码(扩展)来适应变化,而不是去修改已有的、经过测试的源代码(修改)。这通常通过面向抽象和接口设计来实现。

2.3. 合成聚合复用原则 (Composite Reuse Principle, CRP)

Section titled “2.3. 合成聚合复用原则 (Composite Reuse Principle, CRP)”
  • 定义: 尽量使用组合/聚合,而不是继承来达到复用的目的。
  • 核心逻辑: 继承(White-box reuse)属于强耦合关系,子类必须暴露父类的内部细节,且在运行时无法动态改变。而组合/聚合(Black-box reuse)通过在对象中包含其他对象的引用,在运行时动态指定行为,保持了高内聚与低耦合。

2.4. 依赖倒置原则 (Dependency Inversion Principle, DIP)

Section titled “2.4. 依赖倒置原则 (Dependency Inversion Principle, DIP)”
  • 高层模块(关注“做什么”)不应该依赖于 低层模块(关注“怎么做”),二者都应该依赖于 抽象
  • 抽象 不应该依赖于 细节(Details),细节 应该依赖于 抽象
  • 核心逻辑: 传统自顶向下的开发导致高层逻辑强依赖底层具体实现。依赖倒置通过引入接口,让底层实现反向依赖接口,实现了层与层之间的物理隔离,方便进行 Mock 测试和底层组件的无感知替换。

2.5. 里氏替换原则 (Liskov Substitution Principle, LSP)

Section titled “2.5. 里氏替换原则 (Liskov Substitution Principle, LSP)”
  • 定义: 子类对象必须能够替换掉所有父类对象,而程序执行的逻辑行为不发生任何变化。
  • 核心逻辑: 子类可以扩展父类的功能,但不能改变父类原有的行为契约。具体约束包括:
    • 方法参数: 子类覆盖或实现父类方法时,入参的范围或类型应比父类更加宽松或一致(逆变)。
    • 方法返回值: 子类方法的返回值范围或类型应比父类更加严格或一致(协变)。
    • 异常抛出: 子类方法抛出的异常应当是父类方法抛出异常的子类或相同类型,不得抛出更宽泛的异常。
    • 契约约束: 子类必须遵守父类声明的契约与不变条件。

第一性原理(First Principles Thinking)是突破经验主义与思维定势的重要思考模型: