干净的架构用例与具有功能的控制器

Jeg*_*abu 6 design-patterns controller clean-architecture

我刚开始阅读有关干净架构的文章,但对用例实现的定义感到困惑。

考虑一个具有一组函数的控制器类,这些函数在执行一些逻辑后接受 T 并返回 R

interface IController {
   fun usecase1(param:T) : R 
   fun usecase2(param:T) : R
}
Run Code Online (Sandbox Code Playgroud)

现在我可以使用 IController 实例执行用例。

另一种方法是将每个用例定义为一个类并注入需要该功能的其他对象。

class UseCase1 {
    fun execute(param:T):R {}
}

class UseCase2 {
    fun execute(param:T):R {}
}
Run Code Online (Sandbox Code Playgroud)

将用例作为单独的单元与将其作为某个类的功能之间有什么优点/缺点?

IMO,单独的单元会增加构造和注入开销,而其他方法则存在“继承问题而不是组合”。哪条路是正确的?

Buk*_*gey 5

根据接口隔离原则,每个用例最好有单独的用例接口。它允许您以某种方式抽象用例实现。您可以独立于控制器层拆分或划分用例的实现。

我恭恭敬敬地建议将每个用例拆分为单独的类。因为当您修改其中一个时,您将 100% 确定您不会制动另一个。但是如果你有很多用例,而且它们很小,在这种情况下,把它分组到文件是有意义的。但我认为高阶函数比类中的一堆函数更适合。

创建具有状态和行为的类是有意义的,但是如果您为用例创建类,它将是无状态的,并且方法几乎不会密切相关。

但真正重要的是,根据干净的架构,它是分离层。如何组织存储用例并不重要,但有可能在以后独立于其他层更改决策是非常重要的。