稳定依赖原则(Stable Dependencies Principle):构建健壮系统的黄金法则_可维护性

稳定依赖原则是软件设计中的关键原则之一,它强调依赖于稳定的抽象,而不是依赖于易变的具体实现。这一原则有助于提高软件系统的稳定性和可维护性。

肖哥弹架构 跟大家“弹弹” 代码设计技巧,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

历史热点文章

2. 稳定依赖原则设计图:

稳定依赖原则鼓励开发者在设计系统时,优先考虑依赖那些不太可能发生变化的抽象概念或接口,从而降低因底层实现变化导致的上层结构的变动风险。

稳定依赖原则(Stable Dependencies Principle):构建健壮系统的黄金法则_架构设计_02

3. 稳定依赖原则解决什么:

稳定依赖原则解决了因底层实现频繁变动导致的上层依赖也需要不断更新的问题,减少了系统的脆弱性和维护成本。

4. 稳定依赖原则特点:
  • 稳定性:依赖的抽象层是稳定的,不随底层实现的变化而变化。
  • 可预测性:系统行为更加可预测,因为抽象层定义了明确的接口和行为。
5. 稳定依赖原则缺点:
  • 可能忽略新技术:过度依赖现有稳定技术可能会忽略新兴技术的潜力。
  • 过度抽象:在某些情况下,为了追求稳定性可能会创建过度抽象的接口。
6. 稳定依赖原则使用场景:

当面临业务需要长期维护和扩展的系统设计时,应考虑使用稳定依赖原则。

7. 稳定依赖原则案例
7.1 电商平台优惠券系统案例

电商平台的优惠券系统,该系统需要根据不同的促销策略应用不同的优惠券规则。

重构前:

public class CouponService {
    public void applyCoupon(PromotionStrategy strategy, Order order) {
        // 直接依赖于具体的促销策略实现
        strategy.apply(order);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

问题分析:

  1. 硬编码依赖
    • CouponService 直接依赖于具体的 PromotionStrategy 实现,这使得代码不够灵活。
  2. 低内聚性
    • CouponService 的职责不清晰,它不仅管理优惠券的逻辑,还直接与促销策略的实现交互。
  3. 扩展性差
    • 当需要添加新的促销策略时,可能需要修改 CouponService 的代码,这增加了扩展的难度。
  4. 测试困难
    • 直接依赖具体实现使得单元测试变得复杂,因为需要模拟外部策略的行为。
  5. 违反开闭原则
    • 系统对修改开放,但对扩展不够开放,因为每次添加新的促销策略都需要修改 CouponService

重构后:

public interface PromotionStrategy {
    void apply(Order order);
}

public class PercentageDiscountStrategy implements PromotionStrategy {
    public void apply(Order order) {
        // 具体的优惠券应用逻辑
    }
}

public class CouponService {
    private List<PromotionStrategy> strategies;

    public CouponService(List<PromotionStrategy> strategies) {
        this.strategies = strategies;
    }

    public void applyCoupons(Order order) {
        for (PromotionStrategy strategy : strategies) {
            strategy.apply(order);
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

解决的问题:

  1. 降低耦合度
    • CouponService 现在依赖于抽象的 PromotionStrategy 接口,而不是具体的实现,降低了耦合度。
  2. 提高内聚性
    • CouponService 专注于其核心职责——应用优惠券,而具体的促销逻辑由实现 PromotionStrategy 的类处理。
  3. 增强可扩展性
    • 新的促销策略可以通过实现 PromotionStrategy 接口轻松添加,而无需修改 CouponService 的代码。
  4. 简化测试
    • 可以更容易地为 CouponService 编写单元测试,因为测试现在可以集中在策略接口的实现上,而不是具体的实现。
  5. 遵循开闭原则
    • 系统现在对扩展开放(可以添加新的促销策略),同时对修改关闭(不需要修改 CouponService 的代码)。
  6. 实现灵活性
    • 系统可以根据配置或用户需求动态选择不同的促销策略,提高了系统的灵活性和适应性。

CouponService 遵循了稳定依赖原则,依赖于稳定的抽象而不是变化的具体实现。这种设计提高了系统的可维护性、可扩展性和灵活性,同时降低了模块间的耦合度。遵循稳定依赖原则有助于构建一个健壮、易于维护和扩展的软件系统

8. 稳定抽象原则与稳定依赖原则区别
区别
  • 侧重点
    • 稳定抽象原则更侧重于设计层面,强调在系统设计中使用稳定的抽象来隔离变化。
    • 稳定依赖原则更侧重于实现层面,强调在代码实现中依赖于抽象而不是具体实现。
  • 应用范围
    • 稳定抽象原则可以应用于整个软件系统的架构设计,包括但不限于面向对象设计。
    • 稳定依赖原则主要应用于面向对象设计,指导类和模块之间的依赖关系。
  • 目的
    • 稳定抽象原则旨在通过抽象来提高系统的可维护性和可扩展性。

    • 稳定依赖原则旨在通过减少依赖来降低模块间的耦合度,提高系统的灵活性。

9. 参考开源框架:

许多开源项目,如Apache Kafka和Spring Framework,通过提供稳定的API和抽象层,遵循稳定依赖原则来设计。

10. 总结:

稳定依赖原则是软件开发中的一个重要指导原则,它提醒开发者依赖于稳定的抽象来构建系统。遵循此原则有助于提高代码的可读性、可维护性和可扩展性,同时减少因底层实现变化导致的高层逻辑变动。虽然在某些情况下可能需要权衡设计复杂性和系统稳定性,但稳定依赖原则为构建健壮、可持续发展的软件提供了坚实的基础。