首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理具有正确的面向对象设计的类之间的“反向依赖”?

如何处理具有正确的面向对象设计的类之间的“反向依赖”?
EN

Software Engineering用户
提问于 2017-01-08 11:35:05
回答 2查看 293关注 0票数 0

我正在努力学习正确的面向对象设计,使用类关系和避免贫血的领域模型1。我正在创建一个应用程序来存储和检索有关“网络攻击”的信息。这个问题有五个相关的类别:

  • 目录:表示以下数据集合的类
  • 群:已知彼此有关联的一组攻击者。
  • 黑客:发动攻击的人
  • 攻击:黑客攻击,包括修复损害的严重程度和成本等信息。
  • 类型:攻击分为拒绝服务、信息泄漏等类型。这些类型是用户在添加攻击时输入的。

应用程序的用户将问的问题有:

  • 哪些攻击是由特定黑客实施的?回应包括每一次攻击的伤害信息,以及它的类型。
  • 对于一个特定的组织,哪些攻击发生了?是谁造成的,谁造成的损失最大?
  • 对于特定类型,会进行哪些攻击?是谁干的?损坏的总费用是多少?

解决这一问题的天真方法包括这些类之间的大量循环依赖(即黑客有攻击,但攻击也有黑客,而Type有攻击,但攻击也有Type,等等)。由于循环依赖是不需要的,我如何用适当的OO设计来解决这个问题?

EN

回答 2

Software Engineering用户

发布于 2017-01-08 22:02:06

当对象之间存在关系时,重要的是定义这些关系是什么。

当您说“解决这一问题的天真方法将包括这些类之间的大量循环依赖(即黑客有攻击,但攻击也有黑客,而类型有攻击,但攻击也有Type,等等)时,如果循环依赖是不需要的,那么我如何用正确的OO设计来解决这个问题呢?”

在这两种关系中,你都使用了“拥有”(或“拥有”)这个词,但没有定义这到底意味着什么。我怀疑更确切的说法是:

攻击有很多黑客

黑客属于攻击(外键attack_id)

给定的攻击类型有许多攻击。

攻击有攻击类型(外键attack_type_id)

因此,这些不是循环引用,只是一对多的关系。

票数 1
EN

Software Engineering用户

发布于 2017-01-08 21:50:13

我的第一反应是同意评论者的意见。但是,如果我们必须将数据拉到应用程序中,我们将如何构建它呢?这并不是试图模拟RDBMS引擎;一般情况下,我将忽略索引、规范化和关系代数。

元数据

为了避免循环引用,为每个类设计一个元数据类- HackerAttack等。

其想法是拥有一些信息(例如,定义“相等”的信息),而不是实例化细节对象的引用链,循环或不实例化。当我们还不知道我们需要哪些细节的时候,不要浪费时间、记忆等等。

目录

我认为这是对特定问题的抽象。上下文将告诉我们从什么对象开始,以及关系链的哪些部分是相关的。可以避免简单的循环引用。

此外,应该有意识地进行编码以避免闭环参考链。除了上下文之外,尚未完成的设计分析可能会将有用的对象显示为假定数据类的子部分:即HackerAttack等。

所有其他类

设计每个类以包含相关对象的所有适当属性。因此,Hacker有一个Attacks集合。

深思熟虑的分析可能会揭示其他组件类,这些类可能是有用的,本质上是关系链中的死胡同。MetaData类的思想就是一个例子。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/339695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档