建模相关对象
我正在设计一个应用程序,该应用程序处理两组数据用户和区域。从第三方产生的文件中读取数据。我有一个User类和一个Area类,并将数据读入一个Users数组和一个Areas数组(或者其他适当的内存结构,具体取决于我们使用的技术)。
这两个类都有一个唯一的ID成员,该成员从文件中读取,而User类则包含一个区域ID数组,给出了一个用户与多个区域相关联的关系。
要求非常简单:
- 用户名单
- 地区清单
- 指定区域的用户列表
- 指定用户区域列表
我的第一个想法是将数据保留在两个阵列中,然后针对每个需求,使用单独的方法,该方法将根据需要询问一个或者两个阵列。这将很容易实现,但是我不相信这一定是最好的方法。
然后,我考虑在User类上使用" Get Areas"方法,在Area类上使用" Get Users"成员,如果例如在我有一个Area对象的阶段,我会发现它会更有用它是按属性划分的用户,但是Area类上的"获取用户"方法如何知道/具有对Users数组的访问权限。
我以前曾遇到过这个问题很多次,但从未真正提出过最终的解决方案。也许我只是在使其变得比实际更复杂。任何人都可以提供任何提示,URL或者书籍来帮助我进行此类设计吗?
更新:
谢谢大家抽出宝贵的时间提出一些建议。非常感谢评论。
我同意这个问题的根源是多对多关系。我知道如何在关系数据库中建模,这很简单。
我收到的数据是来自第三方的二进制文件,因此我无法控制它们的结构,但是我可以以任何一种方式存储它,当我读入时最好。漏洞,但我想先阅读一下然后将其存储在数据库中,然后程序必须查询数据库才能得到结果。它不是大量的数据,所以我认为可以通过将其存储在内存结构中来获取所需的信息。
解决方案
如果涉及.NET,为什么不使用具有关系的DataTables?如果涉及到.NET,那么我们可能也想研究泛型。
这确实是一个多对多的关系,
User <<--->> Area
将其分为3个对象:用户,区域和用户区域:
User: Id, name, etc. Area: Id, name, etc. UserArea: UserId, AreaId
一个区域是否属于多个用户?如果是的话,这在技术上是一对多的关系。如果要将数据转换为关系数据库,则将创建一个包含所有关系的表。我想如果我们要使用数组,可以创建第三个数组。或者,如果我们实际上想以OO方式执行此操作,则两个类都应具有指向相关区域/用户的指针数组。
一种选择是针对最后两个需求中的每一个使用字典。即,"字典<区域,列表<用户>>"和"字典<用户,列表<区域>>"。我们可以在读取数据时构建它们。我们甚至可以将一个类包装在这两个字典周围,并且只需针对每个需求在该类上都有一个方法。这样可以确保字典保持同步。
很基本,但是想法是:
struct/class Membership { int MemberID; int userID; int areaID; }
此类实现"用户属于区域"成员资格概念。
对于集合中的每个成员资格,粘贴其中一个,然后查询该集合以获取满足我们要求的子集。
编辑:另一个选项
我们可以在每个成员中存储一个区域列表,并在每个区域中存储一个成员列表。
在地区:
public bool addMember(Member m) { if (/*eligibility Requirements*/) { memberList.add(m); m.addArea(this); return true; } return false; }
和Member中的类似实现(没有回调)
这样做的好处是,很容易返回迭代器以遍历Area并找到Member(反之亦然)
缺点是耦合非常紧密,可能会导致将来出现问题。
我认为第一个实现对LINQ更友好。
抱歉,这不是面向对象的问题。这是一个关系问题。因此,所有对基数的引用(多对多)。这是关系数据库建模101. 我并不是要批评加文,而是要指出一个新的观点。
那我的咆哮有什么用呢?答案应该是与关系数据存储集成,而不是将其放入面向对象的范例中。这是经典的方钉,圆孔问题。
同意dacracot
还要看看DevExpress XPO