Oop 建模相关对象
我正在设计一个应用程序,它处理两组数据-用户和区域。数据从第三方生成的文件中读取。我有一个用户类和一个区域类,数据被读入一个用户数组和一个区域数组(或者其他合适的内存结构,取决于我们使用的技术) 这两个类都有一个从文件中读取的唯一ID成员,用户类包含一个区域ID数组,给出了一个用户与多个区域关联的关系 要求非常简单:Oop 建模相关对象,oop,class-design,Oop,Class Design,我正在设计一个应用程序,它处理两组数据-用户和区域。数据从第三方生成的文件中读取。我有一个用户类和一个区域类,数据被读入一个用户数组和一个区域数组(或者其他合适的内存结构,取决于我们使用的技术) 这两个类都有一个从文件中读取的唯一ID成员,用户类包含一个区域ID数组,给出了一个用户与多个区域关联的关系 要求非常简单: 用户名单 地区名单 指定区域的用户列表 指定用户的区域列表 我的第一个想法是将数据保留在两个数组中,然后针对每个需求,使用一个单独的方法,根据需要查询一个或两个数组。这很容易实
- 用户名单
- 地区名单
- 指定区域的用户列表
- 指定用户的区域列表
我从第三方收到的数据是以二进制文件的形式存在的,因此我无法控制这些数据的结构,但我可以在读入数据时以最好的方式存储它们。这是一个有点方形的圆孔,但我认为读取它然后将其存储在数据库中,然后程序必须查询数据库才能得到结果。这不是一个庞大的数据量,所以我认为可以通过将其存储在内存结构中来获取所需的数据。如果涉及.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;
}