软考下午题--UML建模练习(五)

例:阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】

某公司欲开发一个管理选民信息的软件系统。系统的基本需求描述如下:

1)每个人(Person)可以是一个合法选民(Eligible)或者无效的选民(Ineligible)。

2)每个合法选民必须通过该系统对其投票所在区域(即选区,Riding)进行注册( Registration)。每个合法选民仅能注册一个选区。

3)选民所属选区由其居住地址(Address)决定。假设每个人只有一个地址,地址可以是镇(Town)或者城市(City)。

4)某些选区可能包含多个镇;而某些较大的城市也可能包含多个选区。

现采用面向对象方法对该系统进行分析与设计,得到如图1-1所示的初始类图。

 

 

 

【问题1】

根据说明中的描述,给出图1-1中C1~C4所对应的类名(类名使用说明中给出的英文词汇)。

【问题2】

根据说明中的描述,给出图1-1中M1~M6处的多重度。

【问题3】

对该系统提出了以下新需求:

1)某些人拥有在多个选区投票的权利,因此需要注册多个选区;

2)对于满足(1)的选民,需要划定其“主要居住地”,以确定他们应该在哪个选区进行投票。

为了满足上述需求,需要对阁3-1所示的类图进行哪些修改?请用100字以内文字说明。

解析:

【问题1】这道题就是因为我问题一答错了,导致后面很多都错了,所以有连锁反应,问题1和问题2绝对不能打错,这样会导致后面的题目连续答错的。

先说下多重度。类A->类B  一个类A对应0..1类B,那么这个0..就写在B的那一侧。一个类B对应0..1类A,那么这个0..1就写在A的那一侧。

对于C1和C2的选择,我们可以用代入法,带进去根据多重度进行验证。

所以

C1:Address   C2:Riding

【问题2】

多重度有

1:一个
1…1:一个
0..*:零个或多个
*:零个或多个
1..*:一个或多个
0..1:零个或一个

对于联系的多重度的判定,应注意题目中关于不同概念之间关联数量的描述。

M1、M2这一对多重度,刻画的是“Person”和“Address”之间的关系。由【说明】中的“假设每个人只有一个地址”,可以得出M1和M2处分别为1和*。

M3和M4描述的是合法选民与选区之间的关系。由【说明】中的“每个合法选民仅能注册一个选区”,可知M3和M4分别为*和1。

M5和M6描述的是选区和地址之间的关系。在【说明】中假设,每个合法选民在选区中只注册一个地址,因为M5和M6处分别为*和1。

【问题3】

(1) M1处改为1..*,在Registration类中增加address属性,指明注册时使用的是哪个地址。

(2) 增加一个类“主要居住地”,作为类Address的子类;类Person与类“主要居住地”之间具有关系联系,且每个人只有一个主要居住地。

解析:需求1:某些人拥有在多个选区投票的权利,因此需要注册多个选区。由于选区由住址确定,能够在多个选区注册,意味着其居住地址不止一个。所以“Person”和“Address” 之间的多重度会发生变化。在选区注册时所使用的地址也不唯一了,因此需要增加属性来记录在注册选区时所使用的地址,从而对C2和C4之间的关联类进行修改,增加其属性。

需求2:对于满足需求1的选民,需要划定其“主要居住地”,以确定他们应该在哪个选区进行投票。这个需求对选民的地址信息提出了更为详细的需求,按照面向对象方法将“不变部分和可变部分分离”的思想,在类图中增加一个新的类,并采用继承机制继承原有Address类中的共性元素。

posted @ 2021-05-26 16:46  洛飞  阅读(1059)  评论(0编辑  收藏  举报