我有一个处理不同客户端类型的服务。有许多服务类在处理不同客户端的方式上有细微差别。大多数情况下,这些类包含对所有客户端通用的逻辑,但也有一些地方包含特定于客户端的逻辑。
我知道我可以使用工厂为客户端特定逻辑返回一组对象,或者使用模板方法为不同的客户端实现抽象类的具体实现——这些方法的问题是有很多在整个代码中必须根据客户端做出的微小分支决策,这些微小的分支决策是微不足道的,彼此无关,并且它们不保证单独的类。是否有一种设计模式可以优雅地实现这一点?
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/