我正在努力学习正确的面向对象设计,使用类关系和避免贫血的领域模型1。我正在创建一个应用程序来存储和检索有关“网络攻击”的信息。这个问题有五个相关的类别:
应用程序的用户将问的问题有:
解决这一问题的天真方法包括这些类之间的大量循环依赖(即黑客有攻击,但攻击也有黑客,而Type有攻击,但攻击也有Type,等等)。由于循环依赖是不需要的,我如何用适当的OO设计来解决这个问题?
发布于 2017-01-08 22:02:06
当对象之间存在关系时,重要的是定义这些关系是什么。
当您说“解决这一问题的天真方法将包括这些类之间的大量循环依赖(即黑客有攻击,但攻击也有黑客,而类型有攻击,但攻击也有Type,等等)时,如果循环依赖是不需要的,那么我如何用正确的OO设计来解决这个问题呢?”
在这两种关系中,你都使用了“拥有”(或“拥有”)这个词,但没有定义这到底意味着什么。我怀疑更确切的说法是:
攻击有很多黑客
黑客属于攻击(外键attack_id)
给定的攻击类型有许多攻击。
攻击有攻击类型(外键attack_type_id)
因此,这些不是循环引用,只是一对多的关系。
发布于 2017-01-08 21:50:13
我的第一反应是同意评论者的意见。但是,如果我们必须将数据拉到应用程序中,我们将如何构建它呢?这并不是试图模拟RDBMS引擎;一般情况下,我将忽略索引、规范化和关系代数。
为了避免循环引用,为每个类设计一个元数据类- Hacker
、Attack
等。
其想法是拥有一些信息(例如,定义“相等”的信息),而不是实例化细节对象的引用链,循环或不实例化。当我们还不知道我们需要哪些细节的时候,不要浪费时间、记忆等等。
我认为这是对特定问题的抽象。上下文将告诉我们从什么对象开始,以及关系链的哪些部分是相关的。可以避免简单的循环引用。
此外,应该有意识地进行编码以避免闭环参考链。除了上下文之外,尚未完成的设计分析可能会将有用的对象显示为假定数据类的子部分:即Hacker
、Attack
等。
设计每个类以包含相关对象的所有适当属性。因此,Hacker
有一个Attacks
集合。
深思熟虑的分析可能会揭示其他组件类,这些类可能是有用的,本质上是关系链中的死胡同。MetaData
类的思想就是一个例子。
https://softwareengineering.stackexchange.com/questions/339695
复制相似问题