如何在结构化架构的业务层中以最小的冗余创建两个相似的方法?

How to Create Two Similar Methods in the Business Layer of a Structured Architecture with Minimal Redundancy?

提问人:Kudor 提问时间:9/18/2023 更新时间:9/19/2023 访问量:28

问:

我的应用程序的结构是分层的。GUI 由 Controller 处理,每个 Controller 都有一个 Service(负责业务逻辑)。对于上下文,当按下按钮时,除了其他与 GUI 相关的内容外,控制器中还有一个方法可以从服务调用相应的方法。

我的问题是,如果我需要在服务中使用“创建 excel 副本并打开它”和“仅创建 excel 副本”的方法,如何最大限度地减少这两种方法的冗余?

此外,如果我选择在 Service 中单独编写这两个方法,则在 Controller 中还需要存在 2 个名称与 Service 中名称相似的方法,每个方法都包含一行代码,用于从 Service 调用相应的方法。我怎样才能把这段代码写得尽可能干净?

OOP 方法 架构 clean-architecture

评论


答:

3赞 Mark Seemann 9/18/2023 #1

创建两个方法:

CreateCopyOfExcel(/*...*/)

OpenExcel(/*...*/)

如果要创建并打开 Excel 副本,请按顺序调用两者:

CreateCopyOfExcel(/*...*/);
OpenExcel(/*...*/);

如果只想创建副本,请仅调用该方法:

CreateCopyOfExcel(/*...*/);
2赞 Rob Conklin 9/19/2023 #2

本来打算对@Mark发表评论,但它太长了:

@Mark上面是对的,这是最简单的前进道路。但有几条建议:

  1. 服务方法没有理由不能调用另一个服务方法。因此,让您的方法在您的服务上调用您的方法。OpenACopyOfExcel()CreateACopyOfExcel()
  2. 不要让你的服务自动成为控制器的 1-1。目标是在服务层中对业务功能进行建模,并在控制器层中对这些业务功能进行 UI 调用。如果你发现自己一直在写这些 1-1,那么你可能还没有将你的域与你的 UI 分开建模。
  3. 请注意,不要让 UI 问题泄漏到服务层。服务层不是在“打开”excel 文件。它不能。这是一个 UI 问题,它可以为打开的文件、文件句柄或类似的东西提供流,但它不应该能够做任何面向用户的事情。我通常尝试这样想:“我可以在没有 UI 的命令行上调用这个方法并让它有意义吗?没有对按钮、输入框、输出目标的引用,只有数据输入和数据输出。