Go中的软件架构。用软件包指标来衡量不稳定性
构建软件不仅仅是编写所需的代码并使其上线,它还涉及收集和跟踪该软件的指标。这些数据被用来保持其性能的历史,并定义一个我们在发布新版本时可以参考的基线,它是一个指标,告诉我们一个新版本与以前的版本相比如何。
它有助于回答这个问题。新版本是让事情变得更好还是更坏?
这些指标涉及众所周知的,通常指的是网络服务,如延迟和每分钟请求,但也包括那些适用于实际代码的指标。
在这篇文章中,我将介绍一个专门用于测量代码的指标。耦合。
什么是耦合度?
在软件包的背景下,coupling.....:
... 表示软件模块之间的 相互依赖程度。

这个定义是Robert Martin在他2002年出版的一本名为《敏捷软件开发》的书中提出的。该书还包括一个数学公式来计算软件包的不稳定性。

其内容如下。
......不稳定性可以被计算为传出耦合与总耦合的比率。
其中总耦合是**传入耦合(Ce)和传出耦合(Ca)**的总和。

让我们描述一下这两种类型的耦合。
什么是传入耦合?
它指的是传出耦合:一个包对其他包的依赖程度,例如,一个包A依赖于B、C、D和E。

什么是传入耦合?
它指的是传入依赖关系:其他软件包对另一个软件包的依赖程度,例如,一个软件包B、C、D和E都依赖A。

衡量围棋中的不稳定性
如果我们把这些变量再人性化一点,上面的公式可以理解为以下内容。
外发依赖性与外发依赖性和内发依赖性之和的比率。

这个计算的结果决定了一个软件包的稳定性或不稳定性。
- 越接近于0表示一个稳定的包,和
- 越接近于1表示一个不稳定的包。
重新表述上述结果意味着不稳定性表示对某一特定软件包进行修改所需的工作量,在修改现有代码时需要多少努力。
在Go中,我用来创建耦合细节报告的工具是 spm-go,这个工具可以让你生成诸如不稳定性和依赖性的报告。
要安装spm-go ,你可以使用(在Go 1.16或更高版本)。
go install github.com/fdaines/spm-go@v0.11.1
如果你使用Go 1.15或更低版本,你可以参考tools.go 范例,这样你就可以跟踪它成为你的go.mod 依赖的一部分。
作为一个例子,我们可以使用我过去使用过的To-Do微服务项目,运行以下命令。
spm-go instability --html
将产生一个类似于的输出。

这使我们能够清楚地看到我们项目中包含的每个包的总不稳定性。
如果你注意到internal 在这种情况下被认为是稳定的,这是因为internal 代表了我们的领域类型,所有其他的包都依赖于它;对一个稳定的包进行修改是比较困难的,例如破坏API就需要更多的努力。
另一方面,像main (在cmd/cli )这样的包被认为是不稳定的,这是因为这个包实际上是连接了其他包的所有点,对这个包进行修改比较容易,因为没有其他包依赖于它,所以我们可以自由地重构和进行我们认为合适的修改。
结论
测量不稳定性看起来是个多余的工作,但实际上这样做的目的是为了确定做出改变有多容易或多困难。确定软件包的不稳定性可以让我们在考虑改进时提供一个更好的估计,这听起来可能过于复杂,但目标很明确:帮助我们识别有问题的软件包,使未来的改变更加困难。