[英]Single Responsibility Principle in Clean Architecture, Aggregating UseCases in one UseCaseManager which can provide UseCase based on In & Out Object.
我想在我的项目领域层(Clean MVVM)中实现单一职责原则。
我有大约。 200 个不同的用例管理起来非常忙碌。 现在我正在考虑创建一个 UseCaseManager,它可以根据输入和输出对象为我提供所需的用例。
我尝试了一种方法,但看起来不太好。我提到了一些示例代码,请帮助我如何将所有 UseCases 聚合到一个 UseCaseManager。
用例 1:
public class ActualUseCase1 extends AsyncUseCase<Object3,Object4> {
public ActualUseCase1(SchedulerProvider schedulerProvider) {
super(schedulerProvider);
}
@Override
public Flowable<Object4> buildUseCaseFlowable(Object3 input) {
return Flowable.just(new Object4());
}
}
用例2:
public class ActualUseCase2 extends AsyncUseCase<Object1, Object2> {
public ActualUseCase2(SchedulerProvider schedulerProvider) {
super(schedulerProvider);
}
@Override
public Flowable<Object2> buildUseCaseFlowable(Object1 input) {
return Flowable.just(new Object2());
}
}
用例管理器:
public interface UseCaseManager<In, Out> {
<T> T getUseCase(In input, Out output);
}
T 可以是具有不同输入和输出对象的不同用例。
用例管理器Impl:
public class UseCaseManagerImpl implements UseCaseManager {
@Override
public Object getUseCase(Object object1, Object object2) {
return null;
}
}
现在这是主要问题,我无法理解。 我如何实现 getUseCase 方法。
我认为您正在重新发明抽象工厂模式。 Google 会为您提供有关该主题的大量内容...
棘手的一点是你如何决定实例化和返回哪个子类型; 这可以像 switch 语句一样简单,也可以涉及查找表等。关键是将该逻辑隔离到一个地方,您可以在那里对其进行单元测试。
一个更大的问题是 - 你如何最终得到 200 个子类?
好的,我在这里得到一个想法,即您想要一种系统,其中对于给定的输入,您可以获得一些输出。 您可以有 200 个这样的输入,其中 200 个相应的输出是可能的。 而且您想让所有这些都易于管理。
我将尝试解释我想到的解决方案。 我是 Java 的初学者,因此无法生成很多代码。
您可以使用责任链模式来实现这一点。 在此设计模式中,您有一个作业运行程序(在您的案例中为 UseCaseManagaer)和多个要运行的作业(UseCases),它们将按顺序运行,直到其中一个返回输出。
您可以创建一个 RequestPipeline 类,它将作为作业运行程序。 在 UseCaseManager 中,您将管道实例化一次,并使用 Builder Pattern 添加要添加的所有用例,如下所示:
RequestPipeline.add(new UseCase1())
RequestPipeline.add(new UseCase2())...
当输入进来时,您会触发 RequestPipeline,它将依次运行添加到其中的所有作业。 如果 UseCase 返回 null,则作业运行器将调用行中的下一个 UseCase,直到找到可以管理输入并产生答案的 UseCase。
这种设计模式的优点是:
参考: https : //www.google.co.in/amp/s/www.geeksforgeeks.org/chain-responsibility-design-pattern/amp/
这里提供了一些 Java 代码供您检查,如果它满足您的用例。
希望这可以帮助。 如果您有任何疑问,请在评论部分告诉我。
你要做的不是单一的责任,而是相反的。
单一责任意味着
应该有一个改变的理由
参见单一职责原则
您尝试实现的UseCaseManager
将处理您所有的 200 个用例。 因此,只要用例发生变化,它就会发生变化。” - 这是混合关注点,而不是将它们分开。
通常用例由控制器调用,通常控制器也有一个单一的职责。 因此控制器知道它必须调用哪个用例。 因此,我认为不需要UseCaseManager
。
我猜您的设计中还有另一个问题会导致您遇到的问题。 但由于我没有你的完整源代码,我不能给你任何进一步的建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.