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

Clean architecture UseCases vs Controller with functions

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

考虑一个控制器 class 在执行一些逻辑后具有接受 T 和 returns R 的函数集

interface IController {
   fun usecase1(param:T) : R 
   fun usecase2(param:T) : R
}

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

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

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

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

将用例作为单独的单元与将其作为某些 class 的函数之间的 advantages/disadvantages 是什么?

海事组织, 单独的单元增加了构造和注入开销 而其他方法受到影响 'inheritance problems over composition'。哪种方法正确?

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

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

中的一堆函数更适合

当 class 具有状态和行为时创建它是有意义的,但是如果您为 use-case 创建 class 它将是无状态的并且方法将很难关闭相关。

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

what are the advantages/disadvantages between having usecases as separate units versus having it as functions of some class?

如果你把所有东西都放在控制器中,你将违反单一责任原则。控制器代码将因与用例代码不同的原因而发生变化。

例如控制器通常在演示者的帮助下从用户那里获取输入并为用户创建输出。这意味着它从视图模型读取输入并更新视图模型。视图模型属于 UI 并且会因为 UI 原因而改变。

如果您正在实施干净的架构,用例不得依赖于 UI,并且它们会因与 UI 不同的原因而发生变化。用例是 UI 不可知的。这也将使它们更容易测试,并且它们可以更容易 re-used 与其他 UIs.

Consider a controller class having set of functions that accepts T and returns R after executing some logic

请记住,控制器的参数和 return 类型与用例的类型不同。

您的控制器可能会使用为 json 序列化和反序列化而设计的类型。那是交通问题。用例不关心传输。数据传输的方式是一个细节。网络是一个细节。如果您对控制器和用例使用相同的类型,您将在它们之间创建依赖关系。

Clean Architecture 是层间耦合较少的一种。现在,当我们尝试在像 Google Photos 这样的 Web 应用程序上应用干净的架构时,它可能有多个层,如

  1. UI层(被用户感知的那一层)
  2. 路由层,可以将URL路由到右边的class文件
  3. 根据用例可能有多个适配器层
  4. 可以再次细分的持久层,

    4.1。元数据持久性(例如;Postgress,MySQL)

    4.2。内容持久性(例如;Hadoop)

用例如何出现在这里?

用例是描述用户在系统上的交互的一个例子。这可以像在身份验证期间验证错误密码一样简单(或)提供在图片上应用过滤器的选项。实现一个用例可以在一个方法中结束,也可以在多个 classes 和文件之间产生。

清洁架构是一种准则,它坚持要求我们在各层之间保持松散耦合,以便将一个层替换为另一层应该很容易,只需进行非常小的更改。