深入理解软件设计原则 第 

1.代码复用

无论是开发何种软件产品,成本和时间都最重要的两个维度。较短的开发时间意味着可比竞争对手更早进入市场; 较低的开发成本意味着能够留出更多营销资金, 因此能更广泛地覆盖潜在客户。

代码复用是减少开发成本时最常用的方式之一。其意图非常 明显: 与其反复从头开发, 不如在新对象中重用已有代码。

这个想法表面看起来很棒, 但实际上要让已有代码在全新的 上下文中工作, 通常还是需要付出额外努力的。组件间紧密 的耦合、 对具体类而非接口的依赖和硬编码的行为都会降低 代码的灵活性, 使得复用这些代码变得更加困难。

使用设计模式是增加软件组件灵活性并使其易于复用的方式之一。但是有时, 这也会让组件变得更加复杂。设计模式创始人之一的埃里希·伽玛1, 在谈到代码复用中设计模式的角色时说:

我觉得复用有三个层次,在最底层,你可以复用类、类库、容器, 也许还有一些类的“团体(例如容器和迭代器)”。

框架位于最高层。它们确实能帮助你精简自己的设计, 可 以用于明确解决问题所需的抽象概念, 然后用类来表示这 些概念并定义其关系。例如, JUnit 是一个小型框架, 也是框架的“Hello, world”, 其 中 定 义 了 Test 、 TestCase 和TestSuite 这几个类及其关系。

框架通常比单个类的颗粒度要大。你可以通过在某处构建子 类来与框架建立联系。这些子类信奉“别给我们打电话, 我 们会给你打电话的。” 这句所谓的好莱坞原则。框架让你可以 自定义行为, 并会在需要完成工作时告知你。这和 JUnit 一 样, 对吧? 当它希望执行测试时就会告诉你, 但其他的一切 都仅会在框架中发生。

还有一个中间层次。这也是我认识中的模式所处位置。设计 模式比框架更小且更抽象。它们实际上是对一组类的关系及 其互动方式的描述。当你从类转向模式, 并最终到达框架的 过程中, 复用程度会不断增加。

中间层次的优点在于模式提供的复用方式要比框架的风险小。创建框架是一项投入重大且风险很高的工作。模式则让你能 独立于具体代码来复用设计思想和理念。

2.扩展性

变化是程序员生命中唯一不变的事情。

  • 你在 Windows 平台上发布了一款游戏, 但现在人们想要 macOS 的版本。

  • 你创建了一个使用方形按钮的 GUI 框架,但几个月后圆形按 钮开始流行起来。

  • 你设计了一款优秀的电子商务网站构架, 但仅仅几个月后, 客户就要求新增接受电话订单的功能。


每位软件开发者都经历过许多相似的故事, 导致它们发生的 原因也不少。

首先, 我们在开始着手解决问题后才能更好地理解问题。通 常在完成了第一版的程序后, 你就做好了从头开始重写代码 的准备, 因为现在你已经能在很多方面更好地理解问题了, 同时在专业水平上也有所提高, 所以之前的代码现在看上去 可能会显得很糟糕。

其次可能是在你掌控之外的某些事情发生了变化。这也是导 致许多开发团队转变最初想法的原因。每位在网络应用中使 用 Flash 的开发者都必须重新开发或移植代码,因为不断地 有浏览器停止对 Flash 格式的支持。

第三个原因是需求的改变。你的客户之前对当前版本的程序 感到满意,但是现在希望对程序进行 11 个“小小”的改动, 使其可完成原始计划阶段中完全没有提到的功能。

这也有好的一面: 如果有人要求你对程序进行修改, 至少说明还有人关心它。

因此在设计程序架构时, 所有有经验的开发者会尽量选择支 持未来任何可能变更的方式。

推荐阅读:

单一职责原则

开闭原则

里氏替换原则

接口隔离原则