第 6 章 依赖、接口和契约
张刚
设计分解和职责分配促进了设计元素间的协作。协作就必然需要引入依赖,依赖是软件设计中最复杂的部分。良好的依赖会让代码看起来结构清晰、井井有条;而管理得不好的依赖,有可能让代码乱糟糟的像一团麻,让软件设计不稳定、易出错、难复用。
本章将从依赖的设计原则、接口、契约和事件机制的角度,来讨论如何良好地管理依赖,实现高质量的软件设计。
6.1 依赖的设计原则
软件是一个职责系统。有职责分工,就会有协作,业务需求或者系统的某种职责正是通过模块间的彼此协作达成的。也就是说,在软件系统中,绝大多数模块要想正常发挥作用,离不开其他模块的配合。这意味着模块间普遍存在依赖关系。
管理不良的依赖常常是发生设计问题的根源。在 2.4 节,我们曾经提到过一个设计不良的 AccountService 的例子(读者如想了解该例,请参阅代码清单 2.10 和代码清单 2.12)。我分析了 AccountService 的实际依赖,并把部分结果展示在了图 6.1 中。
不好的设计往往有着复杂的依赖。根据图 6.1 ,AccountService 直接依赖了至少 15 个类,其中有些类还有其他依赖,如 AccountRepository 依赖 Account、LoginResult 依赖 Session 等。复杂的依赖会影响代码易理解、易演进和易复用的能力。
影响易理解:依赖越多,理解 AccountService 所需要掌握的知识就越多。
影响易演进:依赖越多,AccountService 受影响和出错的可能性就越大。
影响易复用:依赖越多,复用时受的约束就更多,要么把依赖的元素一起带上,要么修改相关代码解除依赖。而当依赖层次很深的时候,难免“拔出萝卜带出泥”,会直接导致复用失败。
那么,如何设计依赖才能降低以上的影响呢?袁英杰在《变化驱动:正交设计》[36]一文中做了如下总结。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了软件设计中依赖、接口和契约的重要性以及相关设计原则。作者指出,良好的依赖管理是实现高质量软件设计的关键,而不良的依赖会导致代码难以理解、易出错、难以复用。为解决这一问题,文章介绍了依赖最小化原则和稳定依赖原则,并详细阐述了面向接口编程的优势。通过面向接口编程,依赖方不会受到被依赖接口具体实现方式的影响,同时也能有效阻断依赖传递,使设计更加稳定。此外,文章还介绍了依赖倒置原则和接口分离原则,强调了它们在软件设计中的重要性。 文章还探讨了接口的两种视角:需求方接口和提供方接口。需求方接口的概念被强调为设计稳定性的保证,同时也是达成依赖倒置原则的手段。通过一个示例,阐述了需求方接口的定义思路及价值。此外,文章还提到了不良的依赖结构对设计稳定性的影响,并强调了从提供方视角看到的接口依赖并非真正的依赖倒置。 另外,文章还介绍了依赖注入和防腐层等重要概念,为读者提供了更深入的技术视角和应用实践。最后,文章讨论了设计契约的重要性,强调了精确定义接口的重要性,并提出了设计契约的概念。 总的来说,本文通过对软件设计中依赖、接口和契约的深入探讨,以及相关设计原则的介绍,为读者提供了对软件设计重要概念的全面理解和应用指南。文章内容丰富,涵盖了软件设计中的关键概念和实践原则,对于希望深入了解和应用软件设计的读者具有重要的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《软件设计:从专业到卓越》
《软件设计:从专业到卓越》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论