稳定抽象原则(Stable Abstractions Principle):构建可靠软件的基石
稳定抽象原则是软件设计中的一个重要概念,它强调在设计软件时应该依赖于稳定的抽象,而不是依赖于变化的具体实现。这个原则有助于提高软件的可维护性和可扩展性。
肖哥弹架构 跟大家“弹弹” 代码设计技巧,需要代码关注
欢迎 点赞,点赞,点赞。
关注公号Solomon肖哥弹架构获取更多精彩内容
历史热点文章
- 依赖倒置原则:支付网关设计应用案例
- Holder模式(Holder Pattern):公司员工权限管理系统实战案例分析
- 一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO
- 写代码总被Dis:5个项目案例带你掌握SOLID技巧,代码有架构风格
- 里氏替换原则在金融交易系统中的实践,再不懂你咬我
2. 稳定抽象原则设计图:
稳定抽象原则创建稳定的接口和抽象类,这些抽象定义了系统的高层行为,而将具体的变化和实现细节封装在底层实现中。
3. 稳定抽象原则解决什么:
稳定抽象原则解决了由于底层实现变化导致的高层逻辑频繁变动的问题,有助于降低模块间的耦合度。
4. 稳定抽象原则特点:
- 稳定性:高层模块依赖于稳定的抽象,而不是易变的具体实现。
- 解耦:通过抽象层将变化隔离,减少模块间的直接依赖。
5. 稳定抽象原则缺点:
- 设计难度:可能需要更多的设计工作来识别和定义稳定的抽象。
- 性能考量:在某些情况下,抽象层可能会引入轻微的性能开销。
6. 稳定抽象原则使用场景:
当面临需求频繁变更或预期将来会有变更时,应考虑使用稳定抽象原则来设计系统。
7. 稳定抽象原则案例
7.1 电商平台商品推荐系统案例
考虑一个电商平台的商品推荐系统,该系统需要根据不同的算法推荐商品。
重构前:
public class RecommendationEngine {
public List<Product> recommendProducts(User user) {
// 直接使用特定算法推荐商品
return specificAlgorithm.recommend(user);
}
}
问题分析:
- 依赖具体实现:
RecommendationEngine
直接依赖于一个具体的算法实现specificAlgorithm
,这违反了稳定抽象原则,因为它依赖于不稳定的底层实现。
- 缺乏灵活性:
- 由于直接依赖具体实现,当推荐算法的业务需求发生变化时,可能需要修改并重新部署
RecommendationEngine
,这限制了系统的灵活性。
- 由于直接依赖具体实现,当推荐算法的业务需求发生变化时,可能需要修改并重新部署
- 维护成本高:
- 当需要更新推荐算法或引入新的推荐策略时,可能会影响到
RecommendationEngine
的稳定性,增加了维护成本。
- 当需要更新推荐算法或引入新的推荐策略时,可能会影响到
- 测试复杂性:
- 直接依赖具体实现使得对
RecommendationEngine
的单元测试变得复杂,因为需要模拟具体算法的行为。
- 直接依赖具体实现使得对
- 违反开闭原则:
- 系统对修改开放,但对扩展不够开放,因为每次添加新的推荐策略都需要修改
RecommendationEngine
的代码。
- 系统对修改开放,但对扩展不够开放,因为每次添加新的推荐策略都需要修改
重构后:
public interface RecommendationStrategy {
List<Product> recommend(User user);
}
public class UserBasedRecommendationStrategy implements RecommendationStrategy {
public List<Product> recommend(User user) {
// 实现基于用户的推荐逻辑
return userBasedRecommendation(user);
}
}
public class RecommendationEngine {
private RecommendationStrategy strategy;
public RecommendationEngine(RecommendationStrategy strategy) {
this.strategy = strategy;
}
public List<Product> recommendProducts(User user) {
return strategy.recommend(user);
}
}
解决的问题:
- 提高抽象稳定性:
- 通过引入
RecommendationStrategy
接口,RecommendationEngine
现在依赖于一个稳定的抽象,而不是变化的具体实现。
- 通过引入
- 降低耦合度:
RecommendationEngine
与具体推荐算法的实现解耦,减少了模块间的直接依赖,使得系统更加灵活。
- 增强可维护性:
- 当推荐算法需要更新或优化时,只需更改相应的策略实现,而不必修改
RecommendationEngine
,降低了维护成本。
- 当推荐算法需要更新或优化时,只需更改相应的策略实现,而不必修改
- 简化测试:
- 可以更容易地为
RecommendationEngine
编写单元测试,因为测试现在可以集中在策略接口的实现上,而不是具体的算法实现。
- 可以更容易地为
- 提升系统的可扩展性:
- 新的推荐策略可以通过实现
RecommendationStrategy
接口轻松集成到系统中,而无需对RecommendationEngine
进行任何修改。
- 新的推荐策略可以通过实现
- 遵循开闭原则:
- 系统现在对扩展开放(可以添加新的推荐策略),同时对修改关闭(不需要修改现有代码),这符合稳定抽象原则的设计理念。
- 实现灵活性:
- 系统可以根据配置或用户需求动态选择不同的推荐策略,提高了系统的灵活性和适应性。
8.推荐算法库
- Apache Mahout:
- 一个提供可扩展的机器学习算法的库,包括协同过滤、矩阵分解等推荐算法。
- LibRec:
- 一个Java库,专注于推荐系统的研究和实现,提供了多种推荐算法。
- Deeplearning4j:
- 一个专门为Java和JVM设计的深度学习库,可以用来实现深度学习推荐算法。
9. 稳定抽象原则与稳定依赖原则区别
区别
- 侧重点:
- 稳定抽象原则更侧重于设计层面,强调在系统设计中使用稳定的抽象来隔离变化。
- 稳定依赖原则更侧重于实现层面,强调在代码实现中依赖于抽象而不是具体实现。
- 应用范围:
- 稳定抽象原则可以应用于整个软件系统的架构设计,包括但不限于面向对象设计。
- 稳定依赖原则主要应用于面向对象设计,指导类和模块之间的依赖关系。
- 目的:
- 稳定抽象原则旨在通过抽象来提高系统的可维护性和可扩展性。
- 稳定依赖原则旨在通过减少依赖来降低模块间的耦合度,提高系统的灵活性。
10. 参考开源框架:
许多开源项目,如Apache Spark,通过定义稳定的API和抽象类来允许底层实现的变化,遵循稳定抽象原则。
11. 总结:
稳定抽象原则是软件开发中的一个重要指导原则,它提醒开发者依赖于稳定的抽象来构建系统。遵循此原则有助于提高代码的可读性、可维护性和可扩展性,同时减少因底层实现变化导致的高层逻辑变动。虽然在某些情况下可能需要权衡设计复杂性和系统稳定性,但稳定抽象原则为构建健壮、可持续发展的软件提供了坚实的基础。
转载自:https://juejin.cn/post/7392249407226069046