为什么在这种情况下我需要关注点分离?

Why would I need separation of concerns in this case?

void executeRequests() {

    ...

    for (Request request in requests) {
        if (request is Type1Request) {
            ...
        } else if (request is Type2Request) {
            ...
        } else if (...) {

        } ...
    }

}

所以基本上我有一个方法可以对请求列表执行一些常见的处理,然后遍历此列表并根据请求类型(它的特定 class)执行一些特定的处理。

有人可能会争辩说我应该将每个 if else 块分成一个单独的 classes,它有一个 execute 方法,然后只调用 executefor loop 因为这打破了 Separation of concerns 模式。并且我同意!我真的不知道为什么。

在这种情况下,假设我永远不会重用那些 classes 或私有函数(或者无论如何我决定重构)。 有些人认为这种方式更容易阅读,因为您不必跳转到不同的文件或函数来理解所有内容。

所以我的问题是,为什么这段代码不好?

谢谢。

简单地说,因为在代码中添加 Type3Request 对象会强制您编辑现有代码。每次更改现有代码时,都应该测试应用程序中的所有相关模块,以确保代码中不会出现回归错误。在 javascript 或其他松散类型的语言中,很容易从 if 分支覆盖全局数据。在大多数强类型语言中,您通常可以避免此问题,但仍然存在覆盖本地数据的可能性。这意味着每次更改此 executeRequests 方法时,您都必须 运行 应用程序中所有可能的请求,以确保您没有引入新问题。我想澄清一下,我说的是所有请求,而不是所有请求类型。即使您只有几种请求类型,这也可能是对 运行 的数千次测试。

另一方面,将此代码作为多态方法保存在不同的 classes 中可确保它无法更改来自 executeRequests 方法及其所有者的数据 class。这使您能够仅测试与您正在更改的类型相关的调用,而不是具有相同的置信度。换句话说,它减少了代码中的错误数量。

通过使用多态性,所有本次请求需要执行的"specific code"不仅会被封装到Type3Request对象中,而是会真正的和这个对象一起来。无需更改其他代码文件即可添加新的请求类型。

这意味着您可以作为插件动态提供新的请求类型,只需在文件夹中添加一个 dll,而无需重新编译现有代码。如果您不想走那么远,它仍然可以让您通过避免合并到 executeRequests 方法来更好地分离所有团队成员之间的工作量。

通过将紧密耦合的业务逻辑保持在一起,它还使测试代码变得更简单。不必让您的请求通过整个执行过程来测试这种特定类型的代码,您可以直接从请求对象调用方法并断言结果。

所有这些确保如果您的项目中发生架构更改,您知道只有一个地方可以查找请求相关代码:相关请求类型 class。如果您让此代码泄漏到其他 classes 中,您可能会在估计更改的复杂性时错过此代码的某些实例,或者更糟的是,在可能引发错误的大型重构后将其遗忘。

由于某些外部触发器,与特定请求关联的操作与执行特定请求的对象无关。关注点(处理结果)属于请求。因此,您将它与执行器分开,因为它的位置不正确。内部的东西(某种类型的动作)是 "outsourced" 到其他 class 并且 class 支配着那个决定,这是一种责任和耦合。

这不是您为什么要有选择地执行此操作的问题。它是相反的..它怎么可能是任何其他方式。如果我们进行适当的面向对象编程。