Vertical vs. Horizontal Decomposition of Responsibility

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

负责太多事情的对象是一个问题。由于它们的复杂性很高,很难进行维护和扩展。责任分解是我们为了将这些过于复杂的对象拆分成更小的对象而进行的操作。我认为这个重构操作有两种类型:垂直和水平。而我相信前者比后者更好。

假设这是我们的代码(使用Ruby语言):

显然,这个类的对象做了太多的事情。它们将日志行保存到文件中并对其进行格式化,这明显违反了著名的单一职责原则。这个类的对象将会负责太多的事情。我们必须将一些功能从中提取出来并放入另一个对象中。我们必须对其责任进行分解。无论我们把它放在哪里,提取后的Log类会是这个样子:

现在它只保存文件中的行,这是完美的。这个类是有凝聚力且很小的。让我们创建一个它的实例:

接下来,我们将刚刚提取的包含格式化功能的代码放在哪里呢?有两种方法来进行责任分解:水平和垂直。这个方法是水平的

为了同时使用LogLine,我们需要这样做:

看到为什么是水平的吗?因为这个脚本同时看到了它们两个。它们在可见性的同一层级上。当我们想要记录一行时,我们总是需要与它们两个进行通信。LogLine这两个对象都在我们面前。为了记录一行,我们必须处理两个类:

[脚本] -下-> [日志] [脚本] -下-> [行]

相反,这种责任的分解是垂直的

TimedLog 类是一个装饰器,下面是我们如何将它们一起使用:

现在,我们只需在日志中添加一行:

责任被垂直分解。我们仍然有一个进入 log 对象的入口点,但对象“由”两个对象组成,一个包裹着另一个:

[script] -down-> [TimedLog] [TimedLog] -down-> [Log]

总的来说,我认为责任的水平分解是一个不好的主意,而垂直分解则更好。这是因为一个被垂直分解的对象减少了复杂性,而一个被水平分解的对象实际上使事情更加复杂,因为其客户端必须处理更多的依赖关系和接触点。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 14:39

sixnines availability badge   GitHub stars