我正在研究图书馆管理系统的类图,需要帮助来定义以下类之间的关系 - 人员、成员、图书馆员和帐户。
在我的解决方案中,我将其保留为:
但是,当我参考互联网上的其他解决方案和著名的面试准备课程时,其建模如下:
你能帮忙说明第二个比第一个有什么优势吗?前进的正确方式应该是什么?
[编辑] 添加有关我如何建模人员、帐户、成员和图书管理员的更多信息:
答案 0 :(得分:2)
这主要取决于您建模的领域。
问自己以下问题:“没有关联人员的帐户是否可以存在?”和“一个人可以在没有关联帐户的情况下存在吗?”。
在您的情况下,它可能是:“没有关联人员,帐户就不能存在”。并且:“一个人也许可以在没有帐户的情况下存在”。尽管验证 Account 的 Person 字段不为空是最容易的。如果您以其他方式尝试,则必须检查所有 Person 对象,如果其中任何一个具有与您的帐户匹配的帐户字段。
在会员和图书管理员的情况下,它再次取决于域。这些是不同类型的帐户吗?还是不同(子)类型的人?
答案 1 :(得分:1)
在编程中,魔鬼在细节中,所以没有更多的要求和上下文,这是不可能回答的。
因为这被标记为设计模式,但是,请记住四人帮要说的话:
<块引用>优先使用对象组合而非类继承
从这个角度来看,任何有利于继承的试探性解决方案都非常值得怀疑。
我会质疑这样的面试问题的有效性,但为了有点用处,面试官不应该寻找任何预先定义的“正确”答案,而是在经过思考过程之后接受采访的人。
给定四个实体 person、member、librarian 和 account,我会立即质疑这个概念一个人。似乎有意将其置于此上下文中以邀请基于继承的“解决方案”。
除非有明确的用例,否则我会拒绝这个概念并抛弃人的概念。
如果图书馆员和会员有一些共同的数据或行为,我会使用组合来定义一个两者都可以共享的实体。例如,如果我们需要知道图书馆员和成员的地址,我会定义一个address实体(例如一个类)并给图书馆员和成员一个地址。
对于场景的其余部分,例如帐户适合它的位置,我会开始提问,因为不清楚帐户是什么。例如,是否所有成员都有一个帐户?一个会员可以拥有多个账户吗?图书馆员有账号吗?一个还是几个?图书馆员也可以是会员吗?会员可以是图书馆员吗?我们是为一个还是多个图书馆建模?等
答案 2 :(得分:0)
这里有一些反馈。
首先你有 4 个实体:
你可以问自己:Person 只是一个与库无关的通用类吗?如果是这样,Person 实体(或类)将不会包含帐户。 Person 只是一个具有名字、姓氏和其他字段的类,例如出生日期。你可以发挥创意。
现在,成员听起来像是属于某事物的某个人,即可能成为图书馆成员并因此拥有帐户的人。此外,成员通常是一个人。所以这意味着:
Member extends Person.
查找扩展的含义。本质上,您是在 Person 之上添加特定于成员的功能。在这种情况下,您将在会员中拥有一个帐户。
Member is composed of exactly one account (and maybe other stuff)
在 composition / aggregation here 上阅读更多内容。
现在,图书管理员...这实际上取决于您的要求。图书馆员是有特殊权利的会员吗?图书管理员是否扩展会员?实际上,我个人并不这么认为(图书管理员是一名员工,会员是最终用户),但这取决于您的规格。
HTH