简洁架构中的单一职责原则,在一个用例管理器中聚合用例,它可以提供基于输入和输出对象的用例。

Single Responsibility Principle in Clean Architecture, Aggregating UseCases in one UseCaseManager which can provide UseCase based on In & Out Object.

我想在我的项目域层(清洁 MVVM)中实施单一职责原则。

我大约有。 200 个不同的用例,管理起来非常忙。现在我正在考虑创建一个 UseCaseManager,它可以根据输入和输出对象为我提供所需的 UseCase。

我尝试了一种方法,但看起来不太好good.I我提到了一些示例代码,请帮助我如何将所有用例聚合到一个 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());
    }
}

UseCaseManager:

public interface UseCaseManager<In, Out> {
    <T> T getUseCase(In input, Out output);
}

不同的输入输出对象可以是不同的用例。

UseCaseManagerImpl:

public class UseCaseManagerImpl  implements UseCaseManager {

    @Override
    public Object getUseCase(Object object1, Object object2) {
        return null;
    }
}

现在这是主要问题,我无法理解。我如何实现 getUseCase 方法。

认为你正在重新发明abstract factory pattern。 Google 将为您提供有关该主题的大量内容...

棘手的一点是你如何决定实例化哪个子类型和return;可以像 switch 语句一样简单,也可以涉及查找表等。关键是你将该逻辑隔离到一个地方,在那里你可以对其进行单元测试。

一个更大的问题是 - 你如何最终得到 200 个子类?

好的,我在这里得到一个想法,您想要一种系统,其中对于给定的输入您可以获得一些输出。你可以有 200 个这样的输入,200 个相应的输出是可能的。而且您想使所有这些都易于管理。

我将尝试解释我想到的解决方案。我是 Java 的初学者,因此无法编写太多代码。

您可以使用责任链 模式来实现。在这个设计模式中,你有一个工作运行ner(在你的例子中是UseCaseManagaer)和几个工作(UseCases)到运行,它们将按顺序运行直到其中一个returns一个输出。

您可以创建一个 RequestPipeline class 这将是一个 作业 运行ner. 在 UseCaseManager 中,您实例化管道一次并使用您想要使用构建器模式添加的案例如下:

RequestPipeline.add(new UseCase1())
RequestPipeline.add(new UseCase2())...

当有输入时,您会触发 RequestPipeline,它将 运行 添加到其中的所有作业,一个接一个地按顺序添加。如果一个 UseCase returns 为 null,作业 运行ner 将调用下一个 UseCase,直到它找到一个可以管理输入并产生答案的 UseCase。

这种设计模式的优点是:

  1. 抽象:RequestPipeline 负责 运行 在线执行作业,但对其本身的作业一无所知 运行宁。另一方面,UseCase 只知道处理 它有自己的用例。它本身就是一个单元。因此,单一职责原则得到满足,因为两者相互独立,并且在以后我们有类似的设计需求时可以重复使用。
  2. 易于扩展:如果您必须添加 10 个其他用例,您可以轻松地将它们添加到 RequestPipeline 中并完成。
  3. 没有 switch case 和 if-else。这本身就是一个很大的成就。出于这个原因,我喜欢责任链。
  4. Declarative Programming:我们简单地声明我们需要做什么并留下细节如何 对单独的单元执行此操作。新开发人员很容易理解代码的设计。
  5. 更多控制:RequestPipeline 能够在 运行 时动态决定作业到 运行。

参考:https://www.google.co.in/amp/s/www.geeksforgeeks.org/chain-responsibility-design-pattern/amp/

此处提供了一些Java代码供您检查是否满足您的用例。

希望这对您有所帮助。如果您有任何疑问,请在评论部分告诉我。

你要做的不是单一责任,而是相反。

单一职责意味着

There should be one reason to change

The Single Responsibility Principle

您尝试实施的 UseCaseManager 将处理您所有的 200 个用例。因此,只要用例发生变化,它就会发生变化。” - 这是关注点的混合而不是分离。

通常用例由控制器调用,通常控制器也有单一职责。因此控制器知道它必须调用哪个用例。因此,我认为不需要 UseCaseManager.

我猜你的设计中还有另一个问题导致了你遇到的问题。但是因为我没有你的完整源代码,所以我不能给你任何进一步的建议。