Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 清洁体系结构-Robert Martin-用例粒度_Oop_Architecture_Software Design - Fatal编程技术网

Oop 清洁体系结构-Robert Martin-用例粒度

Oop 清洁体系结构-Robert Martin-用例粒度,oop,architecture,software-design,Oop,Architecture,Software Design,我正在考虑在一个项目中实现Robert Martin的,我试图找出如何处理非平凡的用例 我发现很难将架构扩展到复杂/组合的用例,尤其是参与者是系统而不是用户的用例,比如在执行某种批处理的系统中 为了便于说明,让我们假设一个用例,如“系统更新所有帐户余额”,用伪代码实现,如 class UpdateAllAccountBalancesInteraction { function Execute() { Get a list of all accounts F

我正在考虑在一个项目中实现Robert Martin的,我试图找出如何处理非平凡的用例

我发现很难将架构扩展到复杂/组合的用例,尤其是参与者是系统而不是用户的用例,比如在执行某种批处理的系统中

为了便于说明,让我们假设一个用例,如“系统更新所有帐户余额”,用伪代码实现,如

class UpdateAllAccountBalancesInteraction {
    function Execute() {
        Get a list of all accounts
        For each account
            Get a list of all new transactions for account
            For each transaction
                Perform some specific calculation on the transaction
            Update account balance
    }
}
此外,“获取所有帐户的列表”、“获取帐户的所有新事务的列表”、“对事务执行某些特定的计算”、“更新帐户余额”都是它们自己的有效用例,并且它们中的每一个都已在其自己的交互类中实现

出现了几个问题:

  • 用例“系统更新所有帐户余额”是否有效 用例还是应该分解成更小的用例(尽管 从商业角度看,这似乎是有道理的,它是一个 合法的业务场景)
  • 更新LacCountBalancesInTeraction吗 合法的互动
  • 交互是否允许/应该协调其他交互
  • 是协调其他代码的代码 你真的属于其他地方吗
  • 吃点东西可以吗 将LacCountBalancesInteraction更新为一个交互,但将其保留 调用其他交互者共享的函数,而不是充当 其他交互者的协调者

显然,您有了一个新的高级交互工具,它与低级交互工具共享一些(或许多)通用功能。这没关系

如果业务需要一个名为
UpdateAllAccountBalances
的用例,那么它是一个有效的用例,最好您以反映业务逻辑的方式命名它


一个交互调用其他交互是可以的,如果这准确地反映了您的业务逻辑。问自己以下问题:如果对UpdateAllaccountBalance的要求发生变化,这是否也会以完全相同的方式影响
UpdateAllAccountBalances
?如果答案是肯定的,那么实现这一点的最佳方法是使用
updatealaccountbalance
调用
UpdateAccountBalance
,因为否则,您需要在两个位置进行更改以保持一致。如果答案是否定的,那么您希望将这两个交互解耦,这可以通过让它们调用共享函数来实现。

我的建议是以不同的方式处理问题。在域模型中表示问题本身,而不是使用过程方法。您看到了用例的一些问题,其中之一是它们的粒度通常是不确定的

在域模型中,表示特定事物(即“帐户”)的标准方法是使用两个对象。一个表示特定帐户,一个关联对象表示所有帐户共有的东西

AccountCatalog (1) ---- (*) SpecificAccount
在您的示例中,SpecificAccount将有一个服务(方法)“UpdateBalance”。AccountCatalog有一个服务(方法)“UpdateAllBalances”,它向其集合中的所有特定帐户发送消息UpdateBalance

现在任何东西都可以发送UpdateAllBalances消息。另一个对象、人类交互或另一个系统


我应该注意到,一个账户“知道”(即维护)自己的余额,而不是被告知更新,这是很常见的。该方法建议也使用域模型,正如您所描述的那样。这是一个定义实体和企业业务规则的域模型,不依赖于任何其他内容。此外,它还建议在域模型之上的一层实现应用程序业务规则,并将用例实现为依赖于类似于命令设计模式的接口的类。我的问题是关于最后一层的组成。我必须下定决心继续我的项目,因此我得出结论,演示/中提供的示例很琐碎,依赖分离指的是层,我认为这很容易达成一致。考虑到这一点,我得出结论,一个交互的
Execute()
方法不应该调用另一个交互的
Execute()
方法,但它们肯定可以在同一层中共享代码。