重构图书馆惊魂夜(理解模型,关注设计)

前一篇Post因为绘图的关系导致理解上有所误区,所以重构一下,重新更新了图形,让我们重新来审视一下这个被多次讨论的设计。

首先是图书馆的用例:

其实用例的情况大家都很清楚了,简而概之就是用户在图书馆的书架上找到自己想要的书,然后向管理员出示借书卡后借到想要的书。

用例图。

image

这是一个很简单的用例,我没有分析完所有的用例以及子用例,这里到此就可以打住了,我们可以在以后的迭代过程当中来继续完善

然后根据需求我们来建立业务规则表:

规则一:借书需要出示身份证明以及借书卡   (来源:图书馆馆规)

规则二:每个用户一张借书卡 (来源:图书馆规定)

规则三:每张借书卡可以借N本书 (来源:图书馆规定)

然后得到领域模型:

image

这个模型也是一个很粗略的模型,不过足够我们开始下面的分析了。这个模型是动态的,在我们分析的过程中还可能发生变化。我们不要害怕变化,优秀的开发过程和设计模型都是应对变化的丰富实践经验的结晶。我们可以通过这个领域模型清楚的看到概念类的属性以及概念类之间的关系。注意,概念类不是我们在编程的过程中所写的类,当然对于很多简单的模型来说,领域里的概念类可以直接变成程序里的类,但是并不表示其之间可以画上等号,我们还需要继续分析系统中对象的行为。我们可以通过时序图和通信图来表示这些行为的过程。

我们在之前所界定的系统边界之内分析系统的操作,然后定义系统操作的操作契约。最后我们综合用例分析,领域模型和操作契约的分析,最终得到了系统的设计。

这里我们没有看到任何的代码,也不涉及任何贫血充血的争论,我们先建立一个粗略的模型,然后在实现的过程中不断的迭代优化它,最终实现我们的软件,不会出现过度设计,也不会出现一上手就是代码的盲目。

由于时间关系,LP吹促觉觉,故下文明日再说。

posted on 2007-09-28 00:22 亚历山大同志 阅读(2914) 评论(25)  编辑 收藏 所属分类: 随笔

评论

#1楼  2007-09-28 01:09 kw2006 [未注册用户]

The user should search [书籍] from BookRepository by typing some keyword or something.
Once it's found, [系统] will tell user where he can find the [书籍]. It might be still on [书架], or it might be not.   回复  引用    

#2楼  2007-09-28 02:10 saucer [未注册用户]

我的理解是,用例图是用来界定系统范围的,但看了你的用例图,怎么感觉还是没明白你的系统到底是做什么的呢?

如果你的系统不是我想像中的软件系统,而是对业务行为的分析,即是对图书馆这个东西做分析的话,那么管理员实际上不是Actor,而应该属于系统的一部分?譬如,

用例一:读者询问书架
1.Actor-读者:请问《设计模式》一书在哪个书架?
System-管理员:靠墙,上面标有“计算书”的那个
2.Actor-读者:(找到书架,开始浏览。。)

用例二:借书
1.Actor-读者:我要借《设计模式》这书
System-管理员:请出示身份证和图书证
2.Actor-读者:这是我的证件
System-管理员:证件没问题,请收好
2.1 Actor-读者:我没图书证
2.2 System-管理员:可以申请
2.3 Actor-读者:这是我的身份证
2.4 System-管理员:(开新证,做记录。。,)这是你的新图书证(解释规矩。。)
3.System-管理员:(做记录。。)这是《设计模式》,借期是一个月,请及时归还,逾期一天罚款1元。您走好!

如果是借书的管理系统

用例一:读者询问书架
1.Actor-读者:输入“设计模式”,开始查询
System:显示该书情况,包括书架号码,或者地图
--2.Actor-读者:(找到书架,开始浏览。。)--

用例二:借书
1.读者:我要借《设计模式》这书
管理员:请出示身份证和图书证
2.读者:这是我的证件
管理员:证件没问题,请收好
2.1 读者:我没图书证
2.2 管理员:可以申请
2.3 读者:这是我的身份证
2.4 管理员:(开新证,做记录。。,)这是你的新图书证(解释规矩。。)
3.Actor-管理员:登录系统,输入图书证号码
System:显示该证的相关细节(譬如以前借的图书,罚金2元还没交款..)
3.Actor-管理员:选择借阅
System:请输入图书号码
4.Actor-管理员:输入图书号码
System:(记录) 请输入下一本书的号码
5.Actor-管理员:输入完毕
System:(记录)打印收据
6.管理员:这是《设计模式》,借期是一个月,请及时归还,逾期一天罚款1元。您走好!
  回复  引用    

#3楼  2007-09-28 02:44 越狱第三季 [未注册用户]

理解一下   回复  引用    

#4楼  2007-09-28 04:35 kw2006 [未注册用户]

Some google results: 'use case book library'

http://osiris.sunderland.ac.uk/~cs0hed/cifm04/CIFM04Unit4Usecases.ppt#260,15,Example Use Case Diagrams

www.cs.iastate.edu/~cs362/notes/use-case-diagram-examples.pdf   回复  引用    

#5楼  2007-09-28 08:20 jillzhang      

文章非常不错,交换个链接如何?   回复  引用  查看    

#6楼  2007-09-28 09:04 yunhuasheng      

感觉你对图书室的用例分析的不错,其实也就这样,但是2楼说的也有他的道理,他说的是比较详细,但是基本用例和你的都差不多.   回复  引用  查看    

#7楼  2007-09-28 09:06 徐少侠      

@saucer
恩,你说的用例可能和博主的原始设想不一致
我猜想博主的那个图书馆可能是如下过程类似

1、自己跑到图书馆
2、自己通过大厅内的电脑翻书分类,搜索需要的书
3、找好书后,记录相关信息,然后到管理员那里,他守着电脑蹲那里呢
4、告知书的相关信息,或者不走步骤3,直接通过管理员查询(增加复杂性了,博主不要怪我哦),交卡,管理员帮忙办理,给你实际的书实体,呵呵
5、走人

因此,这么来看,来借书的人和那个接待的管理员都是系统外部的了
你的用例一当中,管理员就不需要了,可以变成系统行为了
而用例二,则变成了管理员在口头上和用户交互,但是对系统而言是管理员在进行操作。
此时管理员可能在出借图书、办理新会员等系统功能之间进行切换呢。



  回复  引用  查看    

#8楼  2007-09-28 09:26 gxh973121      

标题党,还以为你要讲鬼故事呢   回复  引用  查看    

#9楼  2007-09-28 09:31 Let it be [未注册用户]

领域模型当然是对业务的建模,过早涉足细节会影响模型的建立,第一次迭代,做到这种程度,足矣;saucer的用例,应当是放到细化的阶段   回复  引用    

#10楼  2007-09-28 09:32 Gao.Steven      

按照楼主的描述,管理员这里只是一个系统的代理来帮助用户完成借书操作,这一部分的功能仍然属于系统和用户的交互,不适合作为一个单独的用例来体现,假设图书馆同样提供自助功能的话,管理员的用例该怎么画?
想想银行柜员机和柜台人员,你认为他们会有一个用例叫“拿钱给用户”吗?   回复  引用  查看    

#11楼  2007-09-28 09:37 matt [未注册用户]

一看第一个usecase,拿书给用户,就知道楼主有多业余.   回复  引用    

#12楼  2007-09-28 09:40 GerryJiang      

--引用--------------------------------------------------
matt: 一看第一个usecase,拿书给用户,就知道楼主有多业余.
--------------------------------------------------------
我也是这样的感觉,当然了知识是越辨越明,楼主说不定现在努力,一年后也能成为一个高手呢!不过发表在首页的文章,如果没有一定的功底,保持谦恭的态度与学习的态度还是有必要的   回复  引用  查看    

#13楼  2007-09-28 09:44 怪怪      

LZ的分析方法有一定道理, 只是用例, 用例图, 系统边界等等, 与正规理论的大不相同.觉得2楼和LZ差不多, 或者只是原始设想不一致的, 确实应该去补补课了, 比如4楼的PPT就不错.   回复  引用  查看    

#14楼  2007-09-28 10:04 徐少侠      

恩,图画得是不好看。

比如把借书卡画到右边去不就不需要跳线了哦?

呵呵。没有工具就是麻烦。

建议至少可以使用Visio2003
电驴那里有个可以for VS2005的
拿来画数据库非常爽,直接生成了。   回复  引用  查看    

#15楼 [楼主] 2007-09-28 10:13 亚历山大同志      

过于完美的东西拿出来自然就没人争论了,一片歌功颂德自然不是好事。

首先是第一个用例的问题,第一个用例图确实是有问题的,主要是如何看待图书管理员的问题,图书管理员究竟是作为系统的一部分还是应该独立出来成为一个单独的Actor。这是第一个问题,很多人会在这个地方有争议。假如按照我画的第一个用例就是直接按照实际情况不加分析的就画出来了。真实的图书馆确实是管理员把书记录好了交给用户的。但是在实际的系统中确是系统的行为。

这个是saucer 在回复中指出的问题。
--------------------------------------------------------------
其二,@怪怪:
2楼和我画的用例的区别在于对待图书管理员是否将其职责作为系统的一部分这个问题上。如果我继续写下去在第二次迭代的时候就会把用例图改得和2楼的差不多了。
其实分析和设计都是在不断迭代演化的过程。正规理论我不知道是什么,但是我的方法论是基于敏捷的,简单的建模,不断的迭代改进,最后趋于相对正确的价值取向。可能这里没有体现出迭代的过程和思维的变更过程曲线。

但是很多时候人们注重结果多于注重过程的。
  回复  引用  查看    

#16楼  2007-09-28 11:04 怪怪      

@亚历山大同志
嗯, 主要是表达清楚你自己的意思就可以了 :), 我的想法就是, 当咱们讨论介绍自己的想法时, 如果不能完全满足原来词汇的定义, 尽量不要和一些已有词汇产生混淆, 这个一个对不熟悉这些词汇的(比如我)产生误解, 另一个是对表达自己想法, 反而会造成障碍.

其实我觉得人都有互相理解的能力, 我对一些专家们占用过多词汇, 感觉比较说实话, 讨厌. 还有就是写程序时, 一些贴切的名词被Framework占用了, 虽然有Namespace, 不过还是挺恶心的.   回复  引用  查看    

#17楼 [楼主] 2007-09-28 11:05 亚历山大同志      

@怪怪
最后一点深有同感,譬如User   回复  引用  查看    

#18楼  2007-09-28 13:40 Jeffrey Hua [未注册用户]

写得还不错,
不过个人认为文章没有区分system use case和business use case.
这里的system是指software system.个人认为,拿书给用户等是属于业务上的process.
  回复  引用    

#19楼  2007-09-29 12:55 金色海洋(jyk)      

借书卡和书是多对多的。要通过借书记录来关联的。

我对你的 “领域模型”的理解就是:一个框框就是一个表,呵呵。

当然 中间的那个(图书馆)的除外。

图书馆可以看作整个数据库,呵呵。   回复  引用  查看    

#20楼  2007-09-29 15:41 GerryJiang      

--引用--------------------------------------------------
金色海洋(jyk): 借书卡和书是多对多的。要通过借书记录来关联的。

我对你的 “领域模型”的理解就是:一个框框就是一个表,呵呵。

当然 中间的那个(图书馆)的除外。

图书馆可以看作整个数据库,呵呵。
--------------------------------------------------------
你理解对了,楼主的领域模型其实就是数据库表   回复  引用  查看    

#21楼  2007-09-29 17:13 金色海洋(jyk)      

更正一下:
应该是说,看到了这个图,我一下子就想到了数据库里的表。   回复  引用  查看    

#22楼 [楼主] 2007-09-29 17:18 亚历山大同志      

@金色海洋(jyk)
@GerryJiang
买本UML和模式应用来看看吧 机械工业出版社 66元,关于领域模型在100页开始
简单点说领域模型就是概念类的图形化字典。   回复  引用  查看    

#23楼  2007-09-30 09:30 GerryJiang      

--引用--------------------------------------------------
亚历山大同志: @金色海洋(jyk)
@GerryJiang
买本UML和模式应用来看看吧 机械工业出版社 66元,关于领域模型在100页开始
简单点说领域模型就是概念类的图形化字典。
--------------------------------------------------------
不好意思,我只有这本书的影印版!
其实我的评论并不针对你,只是针对那种学习态度,看了一两本书就觉得怎么样怎么样了,其实小生和思归在以前的评论里已经给你很好的答复了,我是觉得.NET的风气不好的原因就在这里,请楼主见谅.
  回复  引用  查看    

#24楼  2007-09-30 14:29 金色海洋(jyk)      

我只是想说,我是用数据库(表)来表达(或者叫对应、映射、抽象都可以吧)现实世界里的东东。

我喜欢直接用表,不喜欢在表的上面在加个什么实体类之类的东东。
对于你的这个图,我的第一反应就是表结构和表之间的关系。尤其是那个 1 n 的对应关系,呵呵。

UML和模式应用 我是都不懂的,但是我现在可以写出来比较好的程序。
我是直指数据库的,

不知道说了些什么,好像挺乱的,最近熬夜来着。   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-09-28 00:24 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接:
所属专题: 关于面向对象的讨论
 




导航

公告

鉴于很多TX投诉黑色背景杀伤眼球,遂换个容易阅读的
<2007年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

统计

与我联系

搜索

 

常用链接

留言簿(28)

我参加的小组

我的标签

随笔分类(82)

随笔档案(82)

相册

朋友的Blog

同事的Blog

最新随笔

积分与排名

最新评论

  • 1. re: 鬼吹灯-漫谈大型网站的架构
  • 图是好画,开发起来并不容易;
  • --三千
  • 2. re: Why .NET Sucks?
  • @亚历山大同志 我认为只要能快速开发出客户需要的服务或应用,快速的为客户实现价值,.net也没什么问题啊。 至于钱钱没有做java的拿的多,一般情况而言两种原因:一、java本身开发难度大、实现繁琐,...
  • --网际浪人
  • 3. re: Why .NET Sucks?
  • --引用-------------------------------------------------- 问天: @Kai.Ma 我找不到开源并且成熟的pop3/imap client,我要求不高...
  • --Ivony...
  • 4. re: Why .NET Sucks?
  • @Kai.Ma我找不到开源并且成熟的pop3/imap client,我要求不高,gb2312/utf 8中文不乱码,能解outlook发的附件就成。这么些年了,.net东西慢慢是有了,但数量、质量无...
  • --问天
  • 5. re: Why .NET Sucks?
  • @问天
    .Net下开源且成熟的东西找找还是蛮多的。:)
  • --Kai.Ma

阅读排行榜

评论排行榜

60天内阅读排行