【问题标题】:Handling numerous micro dependencies处理大量的微依赖
【发布时间】:2019-04-19 09:40:35
【问题描述】:

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

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

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();
   }

}

【问题讨论】:

  • 复合设计模式怎么样? en.m.wikipedia.org/wiki/Composite_pattern
  • 在 OOP 中,几乎任何东西都需要单独的类。如果它是一个业务规则,那就让它成为一个类。不要犹豫,创建更多课程。

标签: algorithm oop design-patterns


【解决方案1】:

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

但实际上,没有规定必须对每个客户端都相同。如果有这样的规则,那么你就不会有那么多例外了。事实上,每个客户的处理过程不同,而他们恰好今天几乎相同。

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

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

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

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

当您需要对公共部分进行更改时,您还可以修改这些内容的单个实现。

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 2018-11-28
    • 2018-04-05
    • 1970-01-01
    • 2015-06-27
    • 2011-09-03
    • 2019-05-05
    • 2014-12-02
    • 2020-06-13
    相关资源
    最近更新 更多