Oop 建模相关对象

Oop 建模相关对象,oop,class-design,Oop,Class Design,我正在设计一个应用程序,它处理两组数据-用户和区域。数据从第三方生成的文件中读取。我有一个用户类和一个区域类,数据被读入一个用户数组和一个区域数组(或者其他合适的内存结构,取决于我们使用的技术) 这两个类都有一个从文件中读取的唯一ID成员,用户类包含一个区域ID数组,给出了一个用户与多个区域关联的关系 要求非常简单: 用户名单 地区名单 指定区域的用户列表 指定用户的区域列表 我的第一个想法是将数据保留在两个数组中,然后针对每个需求,使用一个单独的方法,根据需要查询一个或两个数组。这很容易实

我正在设计一个应用程序,它处理两组数据-用户和区域。数据从第三方生成的文件中读取。我有一个用户类和一个区域类,数据被读入一个用户数组和一个区域数组(或者其他合适的内存结构,取决于我们使用的技术)

这两个类都有一个从文件中读取的唯一ID成员,用户类包含一个区域ID数组,给出了一个用户与多个区域关联的关系

要求非常简单:

  • 用户名单
  • 地区名单
  • 指定区域的用户列表
  • 指定用户的区域列表
我的第一个想法是将数据保留在两个数组中,然后针对每个需求,使用一个单独的方法,根据需要查询一个或两个数组。这很容易实现,但我不认为这一定是最好的方法

然后,我考虑在用户类上有一个“Get Areas”方法,在Area类上有一个“Get Users”成员,这会更有用,例如,如果我有一个Area对象,我可以通过属性找到它的用户,那么Area类上的“Get Users”方法如何知道/访问Users数组呢

我以前有过很多次这个问题,但从来没有真正想出一个明确的解决方案。也许我只是把事情弄得比实际情况更复杂。有谁能提供一些提示、URL或书籍来帮助我进行这种设计吗

更新: 谢谢大家花时间留下一些建议。非常感谢您的评论

我同意这个问题的根源是多对多关系。我理解如何在关系数据库中建模,这非常简单


我从第三方收到的数据是以二进制文件的形式存在的,因此我无法控制这些数据的结构,但我可以在读入数据时以最好的方式存储它们。这是一个有点方形的圆孔,但我认为读取它然后将其存储在数据库中,然后程序必须查询数据库才能得到结果。这不是一个庞大的数据量,所以我认为可以通过将其存储在内存结构中来获取所需的数据。

如果涉及.NET,为什么不使用带有关系的数据表呢?如果涉及.NET,您可能还需要研究泛型。

这确实是一种多对多关系

User <<--->> Area

一个区域是否属于多个用户?如果是,从技术上讲,这是一种多对多的关系。如果要将数据转换为关系数据库,则需要创建一个包含所有关系的表。我想如果你想使用数组,你可以创建第三个数组。或者,如果您确实希望以面向对象的方式执行此操作,则两个类都应该具有指向相关区域/用户的指针数组

一个选项是为最后两个需求中的每一个使用字典。也就是说,一个
字典
和一个
字典
。您可以在读取数据时构建这些。您甚至可以围绕这两个字典包装一个类,并在该类上为每个需求提供一个方法。这将允许您确保词典保持同步。

非常基本,但想法是:

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;
}
和成员中的类似实现(不带回调)

这样做的好处是,返回迭代器遍历某个区域并查找成员(反之亦然)非常容易

缺点是它的耦合非常紧密,这可能会导致未来的问题


我认为第一个实现对LINQ更友好。

对不起,这不是面向对象的问题。这是一个关系问题。因此,所有对基数的引用(多对多)。这是关系数据库建模101。我不是想批评加文,只是想指出一个新的视角

那么,我的咆哮有什么好处呢。答案应该是与关系型数据存储集成,而不是将其强行放入面向对象的范例中。这是典型的方钉圆孔问题。

同意达克拉科特的观点


另请看与Steven A.Lowe的想法类似的DevExpress XPO。我可以这样做,它看起来就像我在关系数据库中使用的那种模型,但在对象方面,我认为可能有更好的方法让用户实例知道它的关联用户,反之亦然。这是我一直在想的事情,但我不是很确定。在指针方面,我必须读取一个数组(或泛型列表或其他什么),读取第二个数组,然后使用第三个方法填充每个数组的指针数组?如果我使用.NET,我将使用泛型列表而不是数组。然而,我并没有太多使用数据表的经验。我会调查的。
public bool addMember(Member m)
{
   if (/*eligibility Requirements*/)
   {
      memberList.add(m);
      m.addArea(this);
      return true;
   }
   return false;
}