面向对象设计——图书馆管理系统

时间:2021-03-01 18:51:32

标签: java oop design-patterns

我正在研究图书馆管理系统的类图,需要帮助来定义以下类之间的关系 - 人员、成员、图书馆员和帐户。

在我的解决方案中,我将其保留为:

  • Person 有一个 Account 实例
  • 成员和图书管理员扩展人员

但是,当我参考互联网上的其他解决方案和著名的面试准备课程时,其建模如下:

  • Account 有一个 Person 实例
  • 会员和图书管理员扩展帐户

你能帮忙说明第二个比第一个有什么优势吗?前进的正确方式应该是什么?

[编辑] 添加有关我如何建模人员、帐户、成员和图书管理员的更多信息:

  • Person:该类用于为地址、姓名、电子邮件等人的基本数据建模。
  • 帐户:它包含帐户 ID、帐户状态(已关闭/打开/已取消)等属性
  • 会员:会员是指可以发行/还书的人。它将包含诸如 totalCheckedOutBooks、totalFineDue 等数据。
  • 图书管理员:图书管理员作为管理员来管理图书馆。它包含 blockMember()、addBookItem() 等行为。

3 个答案:

答案 0 :(得分:2)

这主要取决于您建模的领域。

问自己以下问题:“没有关联人员的帐户是否可以存在?”和“一个人可以在没有关联帐户的情况下存在吗?”。

在您的情况下,它可能是:“没有关联人员,帐户就不能存在”。并且:“一个人也许可以在没有帐户的情况下存在”。尽管验证 Account 的 Person 字段不为空是最容易的。如果您以其他方式尝试,则必须检查所有 Person 对象,如果其中任何一个具有与您的帐户匹配的帐户字段。

在会员和图书管理员的情况下,它再次取决于域。这些是不同类型的帐户吗?还是不同(子)类型的人?

答案 1 :(得分:1)

在编程中,魔鬼在细节中,所以没有更多的要求和上下文,这是不可能回答的。

因为这被标记为设计模式,但是,请记住四人帮要说的话:

<块引用>

优先使用对象组合而非类继承

从这个角度来看,任何有利于继承的试探性解决方案都非常值得怀疑。

我会质疑这样的面试问题的有效性,但为了有点用处,面试官不应该寻找任何预先定义的“正确”答案,而是在经过思考过程之后接受采访的人。

给定四个实体 personmemberlibrarianaccount,我会立即质疑这个概念一个。似乎有意将其置于此上下文中以邀请基于继承的“解决方案”。

除非有明确的用例,否则我会拒绝这个概念并抛弃的概念。

如果图书馆员和会员有一些共同的数据或行为,我会使用组合来定义一个两者都可以共享的实体。例如,如果我们需要知道图书馆员和成员的地址,我会定义一个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