您将如何设置以下类结构?为什么?
Class Person代表一个人 教室代表一个房间
我想存储一个人的房间位置,能够有效地提出以下两个问题:
1)X人在哪个房间?和, 2)哪些人在Y室?
我能看到的选项是:
答案 0 :(得分:2)
外部字典保存数据(似乎违背了OOP的精神)
或许你可以一次实现所有方法:你定义两个关联人有一个房间和房间有很多人,你也可以使用适当的数据索引所有内容以光速访问对象的结构!
也就是说,您可以使用面向对象的关联(即组合)遍历对象图,并实现一些特定的要求,将图形存储在某些数据结构中以满足您的要求。
这不违反OOP的精神。它支持良好的编码实践,而不是人工教条。
答案 1 :(得分:2)
并非每个问题都适合OOP。这是其中之一。 : - )
这里你基本上有一个二维网格或矩阵。 一个轴代表人,另一个代表房间。限制是一个人只能在一个房间里。
(list
,person
)元组的room
似乎是在Python中表示这一点的好方法。这是一个示例(在IPython中),带有两个查询:
In [1]: locations = [('alfred', 'office'), ('ben', 'storage'), ('charlene', 'office'), ('deborah', 'factory')]
In [2]: [room for person, room in locations if person == 'charlene']
Out[2]: ['office']
In [3]: [person for person, room in locations if room == 'office']
Out[3]: ['alfred', 'charlene']
查询是列表推导,所以它们非常快。 除非您的位置列表巨大,否则我认为性能不会是一个大问题。
请注意,此解决方案适用于空房间和不在场的人。
In [4]: [room for person, room in locations if person == 'zeke']
Out[4]: []
In [5]: [person for person, room in locations if room == 'maintenance']
Out[5]: []
您必须注意不要两次插入同一个人。
答案 2 :(得分:1)
绝对是外部结构。这就是OOP的精神。类表示对象。一个人既不是房间的财产,也不是一个人的财产,所以没有理由把一个人放在另一个人的课堂上。相反,字典表示它们之间的关系,因此它应该是一个新实体。
简单格式是字典,其中每个键都是一个房间,值是其中的人员列表。但是,如果您需要更复杂的功能,可以在它周围创建一个类