我想在我的项目领域层(Clean MVVM)中实现单一责任原则。
我有大约200个不同的用例,这些用例正忙于管理。现在我正在考虑创建一个UseCaseManager,它可以根据输入为我提供所需的用例
我尝试过一种方法,但看起来不太好。我提到一些示例代码,请帮助我如何将所有用例聚合到一个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());
}
}
UseCase2:
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());
}
}
UseCaseManager:
public interface UseCaseManager<In, Out> {
<T> T getUseCase(In input, Out output);
}
在不同的情况下,T可以是不同的用例
UseCaseManagerImpl:
public class UseCaseManagerImpl implements UseCaseManager {
@Override
public Object getUseCase(Object object1, Object object2) {
return null;
}
}
现在这是主要的问题,我无法理解。如何实现getUseCase方法。
你要做的不是单一的责任,而是相反的。
单一责任意味着
应该有一个改变的理由
参见单一责任原则
您尝试实现的UseCaseManager
将处理您的200个用例。因此,只要用例发生变化,它就会发生变化。“-这是各种担忧的混合,而不是将它们分开。
通常用例是由控制器调用的,通常控制器也有一个单一的责任。因此控制器知道它必须调用哪个用例。因此我不认为需要UseCaseManager
。
我想你的设计中还有另一个问题导致了你的问题。但由于我没有你的完整源代码,我不能给你任何进一步的建议。
好的,我有一个想法,你想要一个系统,在这个系统中,对于给定的输入,你可以得到一些输出。你可以有200个这样的输入,其中200个相应的输出是可能的。你想让所有这些都易于管理。
我会尽力解释我想到的解决办法。我是Java初学者,因此无法生成太多代码。
您可以使用责任链模式来实现这一点。在这个设计模式中,您有一个作业运行程序(在您的案例中是UseCaseManagaer)和几个作业(UseCase)要运行,它们将依次运行,直到其中一个返回输出。
您可以创建一个RequestPipeline类,该类将作为作业运行器。在UseCaseManager中,您可以使用如下构建器模式实例化管道一次以及所有要添加的用例:
RequestPipeline.add(new UseCase1())
RequestPipeline.add(new UseCase2())...
当输入进来时,您触发RequestPipeline,它将依次运行添加到其中的所有作业。如果一个用例返回null,作业运行人员将调用行中的下一个用例,直到找到一个可以管理输入并生成答案的用例。
这种设计模式的优点是:
参考:https://www.google.co.in/amp/s/www.geeksforgeeks.org/chain-responsibility-design-pattern/amp/
这里提供了一些Java代码,供您检查是否满足您的用例。
希望这能有所帮助。如果你有任何疑问,请在评论区告诉我。
我认为你在重新发明抽象的工厂模式。谷歌将为你提供大量关于这个主题的内容...
棘手的是如何决定实例化和返回哪个子类型;这可以像开关语句一样简单,也可以涉及查找表等。关键点是您将该逻辑隔离到一个单独的地方,在那里您可以对其进行单元测试。
一个更大的问题是——你如何最终得到200个子类?
高凝聚力是单一责任原则的同义词吗?如果没有,它们有什么不同?
我一直在阅读洋葱架构,今天我发现了鲍勃叔叔的清洁架构。 对于我来说,我看不出它们之间有什么不同,它们看起来完全一样(除了命名惯例)。 干杯
问题内容: 我对单一责任原则感到困惑。 《原则》指出,阶级改变只有一个原因。 我面临的问题是,对方法的任何更改或在执行操作中的任何逻辑更改都会更改类。例如,考虑以下类: 鲍勃叔叔将其描述为 仅由一个人/演员负责更改 。我有以下两个问题: 对于上述阶层,谁是负责变革的演员/人? 饮食,呼吸或行走的逻辑上的任何改变都不会改变人的类吗?难道这并不意味着每种方法都是改变的理由,因为做事的逻辑可能会改变吗?
我有两种方法的特点。实现此特性的某些结构(但不是所有结构)对其中一种方法具有相同的实现: 该示例中有三个结构,每个结构都实现了trait,其中两个结构以完全相同的方式实现了方法。 有没有办法让他们共享该函数的代码? 我想到了第二个特性,它继承自,并提供作为该特性的默认实现,如下所示: 这不起作用,因为Rust中的特征继承意味着两个特征都需要实现,因此它不会让我在的和实现中键入相同的代码。
单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小。单一职责原则定义如下: 单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。 单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小