algorithm - 处理大量的微依赖

标签 algorithm oop design-patterns

我有一个处理不同客户端类型的服务。有许多服务类在处理不同客户端的方式上有细微差别。大多数情况下,这些类包含对所有客户端通用的逻辑,但也有一些地方包含特定于客户端的逻辑。

我知道我可以使用工厂为客户端特定逻辑返回一组对象,或者使用模板方法为不同的客户端实现抽象类的具体实现——这些方法的问题是有很多在整个代码中必须根据客户端做出的微小分支决策,这些微小的分支决策是微不足道的,彼此无关,并且它们不保证单独的类。是否有一种设计模式可以优雅地实现这一点?

class Service {

   void process() {
     //....
     if (client1) doStuff1();
     if (client2) doStuff2();
     //....
     if (client1) name = "xyz";
     else if (client2) name = "abc";
     //....
     if (client1) sortasc();
     else  sortdesc();
     //....
     if (client2) processx();
     else if (client3) processy();
   }

}

最佳答案

看来您陷入了一个常见的陷阱。每个服务的实现大部分都是相同的,因此您希望编写“通用”实现,然后编写特定于客户端的扩展。但是,每次您需要为客户做一些特别的事情时,您最终都会修改公共(public)服务的实现,这很快就会变得一团糟,无法维护。

但实际上,没有规则要求每个客户端的实现必须相同。如果有这样的规定,就不会有那么多异常(exception)了。事实是,每个客户的处理方式都不同,而它们恰好今天基本相同。

您应该为每种类型的客户端制作单独的服务实现。

如果您现在开始说“但我不想复制所有通用代码!”,那么请停下来。提取真正通用的部分并将它们提取到不同客户端实现可以调用的实用方法中。共享的代码量几乎相同......

class Client1Service implements Service {
    void process() {
        doCommonSetup();
        doStuff1();
        doCommonThing();
        doStuffWithName("xyz");
        sortasc();
        doMoreCommonStuff();
        processy();
    }
}

...但现在没有乱七八糟的情况,当您需要进行特定于客户端的更改时,有一个地方可以做到这一点,而不会弄乱所有其他客户端的实现。

当您需要对公共(public)部分进行更改时,还有一个您可以修改的单一实现。

关于algorithm - 处理大量的微依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55759776/

相关文章:

c# - 重构 if-else if - else

java - 从抽象语法树生成前缀表达式

php - 如何为构造函数指定 void 返回类型

language-agnostic - 为什么大多数系统架构师都坚持首先对接口(interface)进行编程?

c# - 如何将运行时方法传递给自定义属性或可行的替代方法

oop fortran : why my program does not choose the good subroutine?

algorithm - 在最小区域内排列句子中的字母?

algorithm - 4个数的gcd是怎么计算的?

algorithm - 对公式已知的表面进行光线追踪的最有效方法是什么?

ruby - 关于 Ruby 中 OBJECTS 的问题