处理大量微依赖关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理大量微依赖关系相关的知识,希望对你有一定的参考价值。

我有一个处理不同客户端类型的服务。在处理不同客户端的方式上,有很多服务类在很小的方面存在差异。在大多数情况下,这些类包含所有客户端共有的逻辑,但是有些地方具有特定于客户端的逻辑。

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

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

}
答案

看起来你陷入了一个共同陷阱。每个服务实现大致相同,因此您希望编写“通用”实现,然后编写特定于客户端的扩展。但是,每当您需要为客户端执行特殊操作时,您最终会修改公共服务实现,这很快就会成为一个难以维护的混乱。

但实际上,没有规则要求每个客户端的实现都必须相同。如果有这样的规则,那么你就不会有这么多例外。事实是,每个客户的处理都是不同的,而今天它们恰好大致相同。

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

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

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

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

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

以上是关于处理大量微依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

Android Dagger片段可以访问AppModule和ActivityModule依赖关系,但不能访问FragmentModule依赖关系

使用循环片段依赖关系模块化单活动Android应用程序

微服务架构终极探讨:Kafka校验数据的方法

微服务架构实践之服务容错

利用Graphviz绘制逻辑关系依赖图

spring-cloud-starter-hystrix(断路器)服务不通或者调用失败后的错误处理和回调