设计原则有哪些?

设计原则是软件开发和系统设计中的核心指导思想,用于提高代码的可维护性、可扩展性、复用性和灵活性。以下是常见的设计原则分类及详细说明:


一、SOLID 原则(面向对象设计)

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

    • 定义:一个类或模块只应有一个引起变化的原因(即只负责一项职责)。
    • 作用:降低复杂度,提高可读性,减少修改带来的风险。
    • 示例
      // 违反 SRP:订单类同时处理订单逻辑和数据库操作
      class Order {
          void calculateTotal() { ... }
          void saveToDatabase() { ... } // 应拆分到独立类
      }
      
  2. 开闭原则 (OCP, Open-Closed Principle)

    • 定义:软件实体(类、模块、函数)应对扩展开放,对修改关闭。
    • 实现方式:通过抽象(接口、继承)、策略模式、依赖注入等。
    • 示例
      interface PaymentProcessor { void process(); }
      class CreditCardProcessor implements PaymentProcessor { ... } // 扩展时无需修改原有代码
      
  3. 里氏替换原则 (LSP, Liskov Substitution Principle)

    • 定义:子类必须能够替换父类且不影响程序的正确性。
    • 关键点:子类不应强化前置条件或弱化后置条件。
    • 反例
      class Bird { void fly() { ... } }
      class Penguin extends Bird { 
          void fly() { throw "Penguins can't fly!"; } // 违反 LSP
      }
      
  4. 接口隔离原则 (ISP, Interface Segregation Principle)

    • 定义:客户端不应依赖它不需要的接口。应将大接口拆分为更小、更具体的接口。
    • 示例
      // 违反 ISP:多功能接口
      interface Worker {
          void code();
          void cook();
      }
      // 拆分后
      interface Programmer { void code(); }
      interface Chef { void cook(); }
      
  5. 依赖倒置原则 (DIP, Dependency Inversion Principle)

    • 定义
      • 高层模块不应依赖低层模块,二者都应依赖抽象。
      • 抽象不应依赖细节,细节应依赖抽象。
    • 实现方式:依赖注入(DI)、控制反转(IoC)。
    • 示例
      class UserService {
          private UserRepository repository; // 依赖抽象接口
          public UserService(UserRepository repo) { ... } // 构造函数注入
      }
      

二、通用设计原则

  1. DRY (Don’t Repeat Yourself)

    • 定义:避免重复代码,通过抽象或工具类复用逻辑。
    • 反模式:复制粘贴代码导致维护困难。
  2. KISS (Keep It Simple, Stupid)

    • 定义:设计应尽可能简单,避免过度工程化。
    • 应用场景:优先选择直接方案而非复杂模式。
  3. YAGNI (You Aren’t Gonna Need It)

    • 定义:不要提前实现未来可能需要的功能,避免不必要的复杂性。
  4. Law of Demeter (最少知识原则)

    • 定义:一个对象应尽可能少地了解其他对象的内部结构(“只和朋友说话”)。
    • 示例
      // 违反迪米特法则
      user.getAccount().getBalance().subtract(100); 
      // 改进:封装调用链
      user.deductBalance(100); 
      
  5. 高内聚低耦合 (High Cohesion, Low Coupling)

    • 内聚性:模块内部元素关联紧密(如一个类的方法共同完成单一目标)。
    • 耦合性:模块间依赖应尽可能松散(如通过接口而非具体类交互)。

三、并发与系统设计原则

  1. CAP 定理

    • 定义:分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)三者不可兼得。
  2. 最终一致性 (Eventual Consistency)

    • 应用场景:分布式系统(如数据库、消息队列)允许短暂不一致,但最终达成一致。
  3. 幂等性 (Idempotency)

    • 定义:多次执行同一操作的结果与一次执行相同(如支付系统的重试机制)。

四、架构设计原则

  1. 分层原则 (Layered Architecture)

    • 示例:Web 应用分为表现层、业务层、数据访问层。
  2. CQRS (Command Query Responsibility Segregation)

    • 定义:读写操作分离,使用不同模型(如命令更新数据库,查询使用缓存)。
  3. 领域驱动设计 (DDD) 原则

    • 核心:通过领域模型(Entity、Value Object、Aggregate)反映业务逻辑。

五、代码实践原则

  1. 防御性编程

    • 做法:校验输入参数、处理异常、避免空指针。
  2. 契约式设计 (Design by Contract)

    • 定义:明确方法的前置条件、后置条件和不变式(如 Java 的 assert)。
  3. 避免魔术数字/字符串

    • 改进:使用常量或枚举替代硬编码值。

总结

原则分类核心原则适用场景
SOLID单一职责、开闭、里氏替换等面向对象设计、类与接口设计
通用原则DRY、KISS、YAGNI代码编写、模块设计
系统设计CAP、幂等性、最终一致性分布式系统、高并发场景
架构设计分层、CQRS、DDD大型系统架构规划

实际应用:根据具体问题权衡原则(如性能 vs 可维护性),避免教条化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java干货仓库

觉得写的不错,就给博主投币吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值