在软件工程中,设计模式(Design Patterns)是针对特定场景的具象解决方案,而设计原则(Design Principles)则是指导我们构建可维护、可扩展、低耦合、高内聚代码体系的底层哲学与架构心智模型。


SOLID 面向对象五大原则

SOLID 是由 Robert C. Martin(Uncle Bob)总结提炼的面向对象设计五大核心原则,是构建健壮 OO 系统的基石。

单一职责原则

开闭原则

里氏替换原则

接口隔离原则

依赖倒置原则

D2 Diagram
qtopie.github.io

面向对象经典核心法则

除了 SOLID,面向对象领域还有两条极为关键的互补设计原则:

迪米特法则 / 最少知识原则

组合复用原则 / 合成复用原则


软件工程通用心智原则

这些原则不仅适用于面向对象,同样广泛适用于函数式编程、分布式架构及日常工程开发。

不要重复自己

保持简单直白

你用不着它

关注点分离

命令查询分离 / 命令查询职责分离

契约式设计

D2 Diagram
qtopie.github.io
public class BankAccount {
    private double balance; // 类不变量:balance 必须始终 >= 0

    public void withdraw(double amount) {
        // ========== 1. 检验前置条件 (Precondition) ==========
        // 违约属于调用方 Bug,入口立即 Fail-fast
        if (amount <= 0) {
            throw new IllegalArgumentException("取款金额必须大于 0");
        }
        if (amount > this.balance) {
            throw new IllegalStateException("账户余额不足");
        }

        double oldBalance = this.balance;

        // ========== 核心业务逻辑 ==========
        this.balance -= amount;

        // ========== 2. 断言后置条件 (Postcondition) ==========
        // 违约属于当前方法自身逻辑 Bug
        assert this.balance == oldBalance - amount : "扣款后余额计算异常";

        // ========== 3. 断言类不变量 (Class Invariant) ==========
        assert this.balance >= 0 : "账户发生透支,破坏类不变量";
    }
}

原则速查矩阵

中文名称英文全称英文简称解决的核心问题核心收益 / 好处
单一职责原则Single Responsibility PrincipleSRP职责过多导致的高耦合与易碎性降低复杂度、极易单测、减少代码合并冲突
开闭原则Open-Closed PrincipleOCP修改旧代码带来的回归风险零回归风险、插件化扩展、架构生命周期长
里氏替换原则Liskov Substitution PrincipleLSP不当继承破坏多态契约保证多态健壮性、可透明替换、无需类型强转
接口隔离原则Interface Segregation PrincipleISP胖接口导致的无用依赖与污染依赖极低、杜绝空实现样板代码、积木式自由组合
依赖倒置原则Dependency Inversion PrincipleDIP高层依赖低层细节导致的紧耦合业务与技术实现解耦、极易 Mock 测试、方便技术选型替换
迪米特法则Law of DemeterLoD / PLK对象间调用链过深隔离内部变动、消除 NPE 隐患、高内聚封装
组合复用原则Composite Reuse PrincipleCRP / CARP继承层次过深、白箱破坏封装运行时动态插拔、黑箱强封装、架构扁平轻量
不要重复自己Don’t Repeat YourselfDRY逻辑分散导致修改遗漏一处修改全局生效、规则一致性高、维护成本极低
保持简单直白Keep It Simple, StupidKISS过度设计与认知负荷过重极低认知成本、易读易审易交接、排障一目了然
你用不着它You Aren’t Gonna Need ItYAGNI臆想需求带来的多余复杂度缩短交付周期、聚焦核心价值、代码库轻盈无死代码
关注点分离Separation of ConcernsSoC业务与基础能力混杂业务专注业务/架构专注底座、横切关注点独立演进
命令查询分离Command-Query SeparationCQS / CQRS读写混杂导致的副作用隐患纯函数无副作用读、读写针对性独立扩展与缓存调优
契约式设计Design by ContractDbC接口边界与状态假设模糊责任边界分明、Fail-fast 尽早拦截错误、免除冗余防御代码