深入理解软件设计原则 第 6 篇
1.代码复用
无论是开发何种软件产品,成本和时间都最重要的两个维度。较短的开发时间意味着可比竞争对手更早进入市场; 较低的开发成本意味着能够留出更多营销资金, 因此能更广泛地覆盖潜在客户。
代码复用是减少开发成本时最常用的方式之一。其意图非常 明显: 与其反复从头开发, 不如在新对象中重用已有代码。
这个想法表面看起来很棒, 但实际上要让已有代码在全新的 上下文中工作, 通常还是需要付出额外努力的。组件间紧密 的耦合、 对具体类而非接口的依赖和硬编码的行为都会降低 代码的灵活性, 使得复用这些代码变得更加困难。
使用设计模式是增加软件组件灵活性并使其易于复用的方式之一。但是有时, 这也会让组件变得更加复杂。设计模式创始人之一的埃里希·伽玛1, 在谈到代码复用中设计模式的角色时说:
我觉得复用有三个层次,在最底层,你可以复用类、类库、容器, 也许还有一些类的“团体(例如容器和迭代器)”。
框架位于最高层。它们确实能帮助你精简自己的设计, 可 以用于明确解决问题所需的抽象概念, 然后用类来表示这 些概念并定义其关系。例如, JUnit 是一个小型框架, 也是框架的“Hello, world”, 其 中 定 义 了 Test 、 TestCase 和TestSuite 这几个类及其关系。
框架通常比单个类的颗粒度要大。你可以通过在某处构建子 类来与框架建立联系。这些子类信奉“别给我们打电话, 我 们会给你打电话的。” 这句所谓的好莱坞原则。框架让你可以 自定义行为, 并会在需要完成工作时告知你。这和 JUnit 一 样, 对吧? 当它希望执行测试时就会告诉你, 但其他的一切 都仅会在框架中发生。
还有一个中间层次。这也是我认识中的模式所处位置。设计 模式比框架更小且更抽象。它们实际上是对一组类的关系及 其互动方式的描述。当你从类转向模式, 并最终到达框架的 过程中, 复用程度会不断增加。
中间层次的优点在于模式提供的复用方式要比框架的风险小。创建框架是一项投入重大且风险很高的工作。模式则让你能 独立于具体代码来复用设计思想和理念。
2.扩展性
变化是程序员生命中唯一不变的事情。
你在 Windows 平台上发布了一款游戏, 但现在人们想要 macOS 的版本。
你创建了一个使用方形按钮的 GUI 框架,但几个月后圆形按 钮开始流行起来。
你设计了一款优秀的电子商务网站构架, 但仅仅几个月后, 客户就要求新增接受电话订单的功能。
每位软件开发者都经历过许多相似的故事, 导致它们发生的 原因也不少。
首先, 我们在开始着手解决问题后才能更好地理解问题。通 常在完成了第一版的程序后, 你就做好了从头开始重写代码 的准备, 因为现在你已经能在很多方面更好地理解问题了, 同时在专业水平上也有所提高, 所以之前的代码现在看上去 可能会显得很糟糕。
其次可能是在你掌控之外的某些事情发生了变化。这也是导 致许多开发团队转变最初想法的原因。每位在网络应用中使 用 Flash 的开发者都必须重新开发或移植代码,因为不断地 有浏览器停止对 Flash 格式的支持。
第三个原因是需求的改变。你的客户之前对当前版本的程序 感到满意,但是现在希望对程序进行 11 个“小小”的改动, 使其可完成原始计划阶段中完全没有提到的功能。
这也有好的一面: 如果有人要求你对程序进行修改, 至少说明还有人关心它。
因此在设计程序架构时, 所有有经验的开发者会尽量选择支 持未来任何可能变更的方式。
推荐阅读: