提问人:Kudor 提问时间:9/18/2023 更新时间:9/19/2023 访问量:28
如何在结构化架构的业务层中以最小的冗余创建两个相似的方法?
How to Create Two Similar Methods in the Business Layer of a Structured Architecture with Minimal Redundancy?
问:
我的应用程序的结构是分层的。GUI 由 Controller 处理,每个 Controller 都有一个 Service(负责业务逻辑)。对于上下文,当按下按钮时,除了其他与 GUI 相关的内容外,控制器中还有一个方法可以从服务调用相应的方法。
我的问题是,如果我需要在服务中使用“创建 excel 副本并打开它”和“仅创建 excel 副本”的方法,如何最大限度地减少这两种方法的冗余?
此外,如果我选择在 Service 中单独编写这两个方法,则在 Controller 中还需要存在 2 个名称与 Service 中名称相似的方法,每个方法都包含一行代码,用于从 Service 调用相应的方法。我怎样才能把这段代码写得尽可能干净?
答:
3赞
Mark Seemann
9/18/2023
#1
创建两个方法:
CreateCopyOfExcel(/*...*/)
OpenExcel(/*...*/)
如果要创建并打开 Excel 副本,请按顺序调用两者:
CreateCopyOfExcel(/*...*/);
OpenExcel(/*...*/);
如果只想创建副本,请仅调用该方法:
CreateCopyOfExcel(/*...*/);
2赞
Rob Conklin
9/19/2023
#2
本来打算对@Mark发表评论,但它太长了:
@Mark上面是对的,这是最简单的前进道路。但有几条建议:
- 服务方法没有理由不能调用另一个服务方法。因此,让您的方法在您的服务上调用您的方法。
OpenACopyOfExcel()
CreateACopyOfExcel()
- 不要让你的服务自动成为控制器的 1-1。目标是在服务层中对业务功能进行建模,并在控制器层中对这些业务功能进行 UI 调用。如果你发现自己一直在写这些 1-1,那么你可能还没有将你的域与你的 UI 分开建模。
- 请注意,不要让 UI 问题泄漏到服务层。服务层不是在“打开”excel 文件。它不能。这是一个 UI 问题,它可以为打开的文件、文件句柄或类似的东西提供流,但它不应该能够做任何面向用户的事情。我通常尝试这样想:“我可以在没有 UI 的命令行上调用这个方法并让它有意义吗?没有对按钮、输入框、输出目标的引用,只有数据输入和数据输出。
评论