一些关于UML的经典讨论
源代码在线查看: 一个class diagram的问题.txt
一个class diagram的问题
http://www.umlchina.com/best/g36/u1155672.htm
--------------------------------------------------------------------------------
现在有一个期刊管理系统,小弟在做class diagram是遇到了一些问题:
对于每篇论文,都有几个专家来审查,每个专家都给出分数,主编会在系统中给出一个分数的上,下限(可能每期都不同),如果总平均分高出上限,则论文通过,低于下限,则拒绝。 如果在上限和下限之间,则专家进行投票,只有在同意票数高于拒绝票数时,才能通过。 此外,系统还提供了一个利害关系检测功能,如果专家是作者本人,则不能参加评分以及投票。
我在class diagram中加入了一个 conflict list 的 class,将其作为 paper 和 expert 之间的 associated class,大家觉得如何? 还有就是 投票 和 设定上下限 如何在class diagram 中体现呢?
谢谢
04/05/14 22:49 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
orientphoebus 你的思路还是功能分解, 想把功能分解成一个个class, 要加一些thinking in OO的思路
--------------------------------------------------------------------------------
以下例子都是以Java做的
1.Conflict判断是一个business rule, 假如你要单独实现这一条business rule,个人认为没必要加conflict list class
设计时: person作为base class, 实现equals(), expert 和 author 继承之
如果这个conflict判断只有“专家是作者本人”一个条件
expert.evaluate(paper)作为一个method,其中加入比较:
if (this.equals(paper.author.name)){
throw ExpertOperationException("Authoer is not allowed to evaluate.");
}
如果你要设定比较复杂的conflict 关系, 也有简单(通用性不强)做法和复杂(通用和扩展性很好)做法:
a)简单: 因为这个关系只是存在于expert和paper之间,而且只在做评分时需要判断。只要在这两个对象中任何一个实现一个method--expert.isConflict(paper) / paper.isConflict(expert),然后在 evaluate 中调用就可以了。
b)复杂:从architecture层次上说,一个系统最好在底层独立建立一个business rules处理机制,这种机制应该符合一定的标准。如果你的系统采用XML, 我建议参考XACML -- Extensible Access Control Markup Language ( http://www.oasis-open.org/committees/download.php/2713/Brief_Introduction_to_XACML.html )
这是OASIS标准组织开发的一个很实用的标准。用这个标准建立起系统的authorization机制. 这个机制可以把各种business rules集中管理.
有了这个机制后, 在OO设计上,实现一个interface: Security.BusinessRule.isAllowed(java.lang.reflect.Method, Object[])
每个具体的class 实现上述interface, 在实现中调用上述XACML建立的机制(或者可以设计一个base class 来implemete上述机制)来进行各种business rules的比较.
每个具体的class的具体method,做任何实际工作前,调用本class对上述interface的实现, 参数: method是自己这个方法本身, objects[]基本上是自己这个方法的参数.
2. "投票"也是动作. 投票要考虑是记名还是不记名? 如果不记名,那么在paper中加上几个properties: 可投票人数, 参加人数, 同意数, 否定数,无效票数. 然后每个expert有一个方法: expert.vote(paper).注意这个操作中要有business rule 的判断.其中调用paper.vote(boolean agree), 注意这个必须是thread safe. 如果记名, 每个paper就必须有个related class, 用composite 1:0..*关系,其中记录投票结果和谁投的.
3. "设定上下限"也是动作,它是主编这个class的一个method, 它的操作对象(method的参数)是期刊(每个期刊和paper的关系是0..1:1..*的aggregation关系)
所有这些动作造成各个class之间有一定的联系(比如 expert-paper, 主编--期刊) 这些联系不需要再class diagram中表示, 而是在use case中和sequence diagram 等动态图中表示的. class diagram 表示的是系统设计的一种静态view. 除非你要表示一个expert只能负责某一种类型的paper的审核, 那么在class diagram中添加一个paperType class, 然后expert 用 aggregation来联系paperType
04/05/15 00:04 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
y051313 回复: 你的思路还是功能分解, 想把功能分解成一个个class, 要加一些thinking in OO的思路
--------------------------------------------------------------------------------
谢谢,但是关于vote,并不是每个paper都需要投票的啊,放到paper里合适吗?
04/05/15 05:16 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
orientphoebus 投票的结果和paper是1:0..1对应, 你当然也可以用expert和投票结果1:n对应,但是不够准确表示对象关系,而且操作复杂
--------------------------------------------------------------------------------
如果是无记名投票, 用它们做paper的属性还是比较合适, 运算也简单.
"可参加投票的人数" 这个属性可以用来设定某些paper不需要投票. 或者添加一个paper状态属性.
04/05/17 11:38 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
spide 好实例!