编写可维护软件的10大要则-高层级原则

2018-10-15  本文已影响0人  塞外的风

本篇主要总结《代码不朽 编写可维护软件的10大要则》中的高层级部分。主要内容如下:

一. 分离模块之间的关注点

此处的模块对应的是的概念。模块级原则针对的是类之间的关系。本节介绍的原则是关于如何实现类之间松耦合

1. 原则:

单一职责是面向对象设计的重要原则之一。在设计类时,要保持类的职责单一。
从面向对象的角度出发,可将类的组成分为接口实现两部分。对类的使用者而言,仅需关注类的接口,分析类提供了哪些接口以及每个接口的功能。至于接口的功能是如何实现的,那是类内部设计的问题,外部使用者不应关注,更不能依赖这些接口的具体实现。

2. 动机:

保持类体积小的最大好处是它直接带来了类之间的松耦合。松耦合意味着对类的设计可以更灵活地适应将来的变化。这里的“灵活性”指的是你可以在变化的同时,降低变化所带来的预料之外的影响。

3. 如何使用本原则:

一般来说,本原则会要求保持类的体积尽可能小(专注于某一个关注点),并限制外部对该类的调用数量。
以下是帮助避免类之间紧耦合的三个开发最佳实践:

4. 本节内容总结:

耦合意味着当发生变化时,系统的两个部分在某个程度上是相连的。这种连接可能是直接调用,也可能是通过配置文件、数据库结构,甚至只是假设上(从业务逻辑的角度看)发生的间接调用。
松耦合可以增加系统的灵活性。很多面向对象的设计原则和设计模式都体现了对松耦合的支持。


二. 架构组件松耦合

在构建或者维护软件时,拥有对软件架构的清晰视野是必不可少的。一个好的软件架构可以让你洞悉系统要做什么、系统如何做到、功能之间是如何组织的。它能够向你展示系统的高层结构,即系统的“骨架”。
本节主要描述的是组件层面的依赖关系。一个组件是系统顶层划分的一部分。由于组件由软件的系统架构所定义,所以它的边界应该从开始开发时就非常清晰。
组件之间应该是松耦合的,即它们之间应当被清晰地隔离开,只有几个很少的接入点,并且互相共享有限的信息。这样,方法的实现细节可以被隐藏(封装)起来,从而使得系统更加模块化。

1. 原则:

2. 动机:

当一个组件内发生的变化只在这个组件内部有效果时,系统更加容易维护。
能够提升可维护性的调用分为两种:

  1. 内部调用是健康的:
    由于模块调用的是相同组件内部的其它模块,它们应该实现了紧密相关的功能。它们的内部逻辑对于外部是隐藏起来的。
  2. 传出调用是健康的:
    因为它们把要做的任务代理给其它组件,所以创建了一个向外的依赖。一般来说,将不同的关注点代理给其它组件是一件好事。代理可以在一个组件内部的任何地方进行,并且不必受限于组件内模块的数量。

对可维护性有负面影响的调用包括:

  1. 传入调用通过提供一个接口,为其它组件提供功能
    修改传入依赖中的代码,可能会对其它组件造成很大的影响。通过降低传入依赖所涉及到的代码,可以降低对其它组件的负面牵连。
    组件内的其它代码应当尽可能地进行封装,即应当避免来自其它组件的直接调用,从而提高信息的隐藏程度。

  2. 透传代码是有风险的,必须要避免
    透传代码既接收传入调用,又同时代理给其它组件。透传代码违反了信息隐藏的原则:它将自己的代理(实现)暴露给自己的客户。从代码的角度看,说明组件之间没有良好地划分职责。

3. 如何使用本原则:

本节原则的目的是让组件之间达到松耦合。
在实践中,在组件之间实现接口和请求时,要坚持并遵循以下几个规范:

4. 本节内容总结:

类之间需要松耦合,组件之间也需要松耦合。类的耦合度关注于单个类与系统其它部分的暴露程度,而组件耦合度关注的是一个组件中的模块,对其它组件中模块的暴露程度。
从组件层面来考虑,相同组件中模块之间的调用被认为是一个内部调用,但从类层面来考虑,就变成模块之间的耦合。


三. 保持架构组件之间的平衡

一个平衡良好的软件架构拥有的组件,数量不会太多也不会太少,各个组件体积大小也几乎都一样。这样的架构就拥有一个好的组件平衡。

1. 原则:

2. 动机:

3. 如何使用本原则:

组件平衡的2个原则是:

确定将功能合成组件的合适原则
为了实现一个合适的系统划分,方便开发人员浏览代码,需要选择组合功能的合适原则。通常,软件系统会根据高层的功能领域(描述了系统为用户提供了何种操作的功能)来进行组织,还可按照技术专长来进行划分。

明确系统的领域并坚持下去
一旦决定了系统组件的划分类型,需要一直坚持下去。一个不能保持一致的架构不是一个好架构。

4. 本节内容总结:

组件平衡能够反映出组件分离是否清晰,但这并不是它本身的目的。它应该遵循系统设计和开发的流程。对组件的划分应该是自然而然的,而不是刻意要划分成9个组件。


四. 保持小规模代码库

代码库是存储在一个仓库中的所有源代码的集合,可以独立进行编译和部署,并且由一个团队进行维护。一个系统至少有一个代码库,较大的系统通常有多于一个的代码库。

1. 原则:

2. 动机:

软件开发和维护会随着系统体积的膨胀而变得日益困难。构建大型系统需要更大的团队以及更持久的项目,同时又会带来额外的负担和失败的风险。

3. 如何使用本原则:

在其它条件都一样的时候,功能较少的系统其体积也会较小。其次,对功能的实现也可能是简洁或繁冗的。因此,要想保持一个较小的代码库体积,首先需要对系统功能进行限制,然后再注意限制编写的代码量。

实现本原则可采用功能层面的方法和技术层面的方法:

  1. 功能层面的方法:
    功能相关的评估并不一定总能在你的掌握之中,但是任何与开发人员讨论新功能或修改功能的时候,你都需要考虑以下几项:
  1. 技术层面的方法:
    对于技术实现来说,目标是用更少的代码来实现相同的功能。要想做到这一点,可以主要通过引用的方式来重用代码,或者使用已有的代码库或框架来代替自己编写的代码。

4. 本节内容总结:

上一篇 下一篇

猜你喜欢

热点阅读