??xml version="1.0" encoding="utf-8" standalone="yes"?> 陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?br />(zhn)可以通过其博客了解更多信息和文章Q?a target="_blank" onfocus="this.blur()">http://www.ChenGang.com.cn 分析软g需求,以用L角度来用YӞ扑և发生的scenerioQ?font color="#ff1493">抽象成ؓ一个一个Use CaseQ分析出Use Case之间的关p?/font>Q这一步是非常重要的,q一步做好了Q设计就成功了一半。Use Case的抽象有一些可以遵循的原则Q这里不详细谈?/p> 然后用语a描述每一个Use CaseQ描q用户用一个Use Case发生的主事g以及异常流?/p> q样完成了需求分析阶Dc?/p> 二。概要设?扑և实体 + 分析实体cM间的关系 + 提取控制c?+ d列图) 接下来做概要设计Q针Ҏ(gu)个Use CaseQ读Use Case的描qͼ看事件流Q找出所有的实体c?/font>Q这也有一些可以遵循的原则Q例?b>扑և所有的名词Q画表格排除{等Ҏ(gu)?/p> 然后分析实体cM间的关系Q是包含Q聚合还是依赖,?Q?Q还?QnQ还是其?/font>....Q根据这些关p,可以得出实体类和别的实体类惛_联的属性,然后再找出每个实体类本n重要的属性?/p> 然后再次分析Use
Case的事件流Q一斚wcheck实体cȝ设计是否合理Q另一斚w你可以找出动词,分析对实体类的控刉辑Q这样就可以可以设计Z务控制类Q一般你?
以一个实体类一个控制类Q也可以业务逻辑相关的实体类׃个Facade Session
Bean(非EJB含义)来统一控制Q这里面的控制类的颗_度q你自己来掌握了?font color="#0000ff">一般来说先可以设计一些细颗粒度的控制c?/font>Q然后再按照模块Q用_粒度封
装细颗粒度的控制c,提供lWeb层一个Facade?/p> 然后你可以画序列图,是用序列图来表达事件流Q在q个q程中,你需要不断回到类图,l控制类dҎ(gu)Q而序列图是控制cȝҎ(gu)调用?/p> xQ你已经在Rose里面完成了概要设计,当然你不可能一ơ设计完善,会有很多ơP代,因此你不能一开始把c设计的太详l,只抓住主要的属性和Ҏ(gu)Q特别需要注意的是,是抽象的设计Q不要用具体的编E语a来表辄?/p> 三。实?l合xdoclet和Schema工具自动生成代码) 然后你就可以抛开Rose了,转到Eclipse+Togehter里面Q根据那些类Q规划一下package层次Q然后在Together里面q行cȝ详细设计Q所有需要的属性一一写上Q当然你q是不可能一下把所有的属性方法写全,不过没有关系Q把重要的写好就行了?/p> 然后cL架已l生成好了,l所有的实体cd上xdocletQ然后生成hbmQ然后用Hibernate的ExportScheme生成DDLQ?/font>q行一遍自动创建好所有的表。这h有的实体相关cd部做好了?/p> 你现在就集中_֊把控制类那些Ҏ(gu)里面的代码填写上O(jin)K了,在这个过E,你会发现有些实体cȝ属性,没有关系Q加上属性,然后写好xdocletQ运行一遍,自动生成hbmQ自动创建好表,然后l箋写你的方法,也有可能你发现控制类~方法,那么加上?/p> 基本上实体类是getter/setterQ和量的实体相x法,所有的控制逻辑都写在控制类里面?/p> 最后你的Y件就基本写好了,用Eclipse生成好一堆你的testCaseq行试Q反复修改,除bug?/p> 看看使用OOAD的设计思\Q是多么的爽的事情阿Q?b>你只需要把_֊攑ֈUse
Case的抽?/b>Q实体类的关pLȝQ控制类的归U뀂而当你用EclipseQTogether之后Q你所需要写的代码只不过是控制类的方法实C码,?
他的都已l生成好了。另外可能需要写量工具cR?/p>
]]>
在PD中徏立外键碰C个问题,? forum(id,name)表,forum_thread(id,forum_id)表,需要将forum的id设ؓforum_thread的外建,指向forum_id,默认的在 PD中是主键设为外?
需要如下设|才可以:
]]>
q篇文章以前qCQ后来再想看的时候居然找不到了,感觉写的不错Q作为想把Y件开发往深里整地朋友有借鉴作用?br />
转自q里
前段旉把一个界面框架完成了Q今天基于这个框架开发一个小模块Q在q里把这个模块设计的全过E记录下来,希望大家讨论q指正?br />
一、v?br />
?
怺l我一个Q务,为测试员写一个手机模拟界面,以方便她们的手机短信试。过d们都是用MC4J直接调用公司服务器的MBean服务来模拟进行测试,
以验证我们整个系l^台。这U测试主要是查收发短信是否正常,而我的要做的工作是Q让她们在测试的时候更方便更直观?br />
二、需?br />
我和试员陈MMQ也是软g的用者)U定了一个时_大家一h讨论q个软g的需求?br />
1、首先,我大概了解了一下她们的试工作Q知道我要做个什么东东?br />
2、然后我回去思考了一下,再次扑֥详细了解其测试的具体步骤Qƈ在一?strong>白纸上以UML用例囄方式Q记录下需求的功能?strong>用例是什么?用例是需求,是你的软g应该h的功?/strong>Q当然用例图只是概括性的对功能进行了描述?br />
3、最后,我坐在我的电(sh)脑前开始用MagicDraw UML来画用例图(我不喜欢用RoseQ那玩意太笨重了Q界面友好性也不好Q。在ȝ例图的时候,我发C一些隐含的功能Q这些是陈MM在和我做需求时没有考虑到的Q注Q开发者应该ؓ用户挖掘隐含需求)。我和陈MM一一定了这些我新发现的需求,最后得到如下的用例图?br />
Q?Q手机前台测试操作的用例图(说明Qinclude是指某用?strong>包含(include)子用例)
Q?Q后台管?br />
三、界面设?br />
接下来是界面设计。既然是手机模拟Q我很自然就拿我的motorola手机的操作界面来做参考。不q这里应该注意到Q手机操作环境和?sh)脑操作环境不尽相同Q比如说?sh)脑有鼠标,q有键盘可以输入文字Q,所以没有必要唯妙唯肖的完全模枋Q还是以使用者操作方便ؓ丅R?br />
?
面设计是很重要的一步,不要一上来写E序Q一定要先做到心中有个大概,否则q工的可能性就很大。而且Q把界面拿出来给客户看,客户也就能做到心中有敎ͼ
q能早提出一些新需求和意见来。千万不要等到Y件做完了再拿l客LQ到时客L了如果要修改Q那做太多白费工了?br />
׃软g界面相对单,陈Q基本没有提修改意见Q但q不是个好兆头。不q极限编E就是要拥抱变化不是^_^。咱不怕她改,只要大致的界面她能定下来p了?br />
界面我喜Ƣ用Visio来画Q当然也听说有h喜欢用)Q来快速构建界面原型的Q看个h喜好了。整个界面如下:
q个是后台管理界?br />
四、类?br />
cd反映了Y件的数据模型。在设计数据模型Q我参考了界面设计囑֒用例图,扑և一个个的类。然后参照用例图的一个个功能Q设计出了各cȝ属性和Ҏ(gu)。设计初始的cd当然不可能很详细Q但臛_应该看到个大概。有错误不要紧,后期可以慢慢修正Q但大体关系q定下来了?br />
NeilQ公司EQ_Q一?0岁左右的真正的资q序员Q说Q看一个Y件的设计主要看两个类Q类囑֒时序图。类囄定了软g数据模型的静态关型,时序囑ֈ是数据模型的动态关pR?/strong>
cd如下Q看英文大致可以知道c/属性/Ҏ(gu)的含义和作用了,׃一一介绍了?br />
五、时序图
时序图是本文最后一个图Q时序图表明?strong>用例?/strong>中各功能的实现方案,同时也反应了cd中各cȝ交互关系。以后程序的逻辑和时序图基本一致。不q,有些Zȝ得很详细的时序图Q详l到都快赶上伪代码别了Q我觉得q没必要。我把时序图看做反映自己思\的大概过E,所以也q个大概?br />
我认为时序图要简z易懂,q样以后你的后l护者,拿到q个软g的时序图Q当然也包括用例图、类图)Q就能明白你的大概设计思\。另外,L序图也能整理自己的思\Q同时还可以对类囄设计q行验证。在画这个时序图的过E中Q我q正了在类图中的几处考虑不周的地斏V?br />
ȝQ时序图可以Q1Q整理思\Q2Q验证类的设计(Q)是很好的软g文档Q对l护者理解代码很有帮助?br />
q里仅给出其中几个时序图Q实际上我也没有把用例都dQ有些类似的单的Q就忽略了)
Q1Q新增一个手机号?br />
Q2Q关?br />
Q3Q开?br />
Q4Q发送短?br />
到这里设计阶D就完成了,用时一天。下一步是~码Q将应用Q_Q先写测试代码的方式来写代码Q下ơ再介绍了?br />作者简?/font>
版权声明Q本博客所有文章仅适用于非商业性{载,q请在{载时注明出处及作者的|名?/p>
基本上一个应用程序里面的领域相关的模型里面需?U对象:
1。值对?Value Object)Q?font color="#0000ff">没有w䆾Q内容表CZ?/font>Q譬如我和weihello都去银行里面存取100大洋Q那q个100RMB是一个值对?
2。实体对象(Entity)Q?font color="#0000ff">需要持?/font>Q不是按照内容,而是按照它的w䆾来区?/font>Q也是说即使内容完全一P也不是同一个对象。这个n份在内存
里面是它的实例地址Q在数据库里面是关键字,最常见的就是OID.q个实体对象q不是纯数据Q它处理本n的实体模型,例如AccoutQ它?
withDraw,它的子Account{等Q?font color="#0000ff">它也处理自己和其他实体对象之间的关系Q例如订单里面的订单行,都是应该在这个Account里面实现的,
而不应该有一个什么控制类。在一个Web应用E序里面Q涉及到对象关系的一般只需要一个(或几个)DTOFactory负责所有对象的DTO?
Entity之间的组装和拆䆾Q不需要专门的理Q这一部分也是和数据徏模最相近的地斏V?br />
3。服务对?Service)Q这是ؓ我们提供服务的类Q譬如银行里面服务员Q她帮助我们把钱从一个̎戯{到另外一个̎Pq记录相应的交易?
对象的作用是对它自己的内部状态负责,如果它需要存取很多其它对象的状态进行运,那叫做特性忌妒,是要重构的。应该把q些代码Ud那个持有q些状态的c里?br />
辨别一些名词:
1。VOQ实际上很模p,通常指ValueObject和ViewObject
2. ViewObjectQ界面展现需要的对象Q如Struts的FormBean
3。Value ObjectQ早期被作ؓValueObject和Transfer Object的ȝ。实际上Value Object的真正意义在于它的内容,而不是n?
4。Transfer ObjectQ数据传输对象,在应用程序不同层ơ之间传书对象,在一个分布式应用E序中,通常可以提高整体的性能
5。POQ也许就是Persistent ObjectQ基本上是Entity?
在不同的体系l构和实现方式里面,q些对象有可能重复,也有可能不重叠。如果你要做一个对所有的体系都能够方便移植的框架Q那么每一U对象都需?
严格区分。例如JDO的PO不能作ؓTOQ应为它不能qPMQ譬如你可以选择用ViewObjectQ如Struts的FOrmBean)直接作ؓ
TOQ但在tapestry和W(xu)ebwork里面׃合适了。但在很多时候,能够方便实用是最重要的,不要q度设计是了?br />
]]>
一。需求分?抽象Use case + 分析Use case之间的关p?
]]>
阅了同事去q参?/span> RUP 培训时带来的材料Q终于能基本分清三者之间的关系?/span>
用例是从pȝ外部可见的行为,是系lؓ某一个或几个参与者( Actor Q提供的一D完整的服务。从原则上来Ԍ用例之间都是独立、ƈ列的Q它们之间ƈ不存在着包含从属关系。但是ؓ了体C些用例之间的业务关系Q提高可l护性和一致性,用例之间可以抽象出包?/span> (include) 、扩?/span> (extend) 和泛?/span> (generalization) q几U关pR?/span>
在分开介绍它们之前Q先说下它们的共性:都是从现有的用例中抽取出公共的那部分信息Q作Z个单独的用例Q然后通后q不同的Ҏ(gu)来重用这个公q用例Q以减少模型l护的工作量?/span>
1 、包?/span> (include)
包含关系Q用包?/span> Q?/span> Inclusion Q?/span> 用例来封装一l跨多个用例的怼动作Q行为片断)Q以便多个基Q?/span> Base Q用例复用。基用例控制与包含用例的关系Q以及被包含用例的事件流是否会插入到基用例的事g中。基用例可以依赖包含用例执行的结果,但是双方都不能访问对方的属性?/span>
? 含关pd典型的应用就是复?/font>Q也是定义中说的情景。但是有时当某用例的事g过于复杂时Qؓ了简化用例的描述Q我们也可以把某一D事件流抽象成ؓ一个被 包含的用例;相反Q用例划分太l时Q也可以抽象Z个基用例Q来包含q些l颗_的用例。这U情늱g在过E设计语a中,程序的某一D늮法封装成一个子 q程Q然后再从主E序中调用这一子过E。
例如Q业务中QL存在着l护某某信息的功能,如果它作ؓ一个用例,那新建、编辑以及修攚w要在用例详述中描qͼq于复杂Q如果分成新建用例、编辑用例和删除用例Q则划分太细。这时包含关pd以用来理清关pR?/span>
2 ?/span> 扩展 (extend)
扩展关系Q?font color="#ff0000">基用例中一D늛对独立ƈ?b>可?/b>的动?/font>Q用扩展Q?/span> Extension Q用例加以封装,再让它从基用例中声明的扩展点Q?/span> Extension Point Q上q行扩展Q从而基用例行为更l和目标更集中?/span>
扩展用例为基用例d新的行ؓ。扩展用例可以访问基用例的属性,因此它能Ҏ(gu)基用例中扩展点的当前状态来判断是否执行自己。但是扩展用例对基用例不可见?/span>
对于一个扩展用例,可以在基用例上有几个扩展炏V?/span>
例如Q系l中允许用户Ҏ(gu)询的l果q行导出、打印。对于查询而言Q能不能导出、打印查询都是一LQ导出、打印是不可见的。导入、打印和查询相对独立Q而且为查询添加了新行为。因此可以采用扩展关pL描述Q?/span>
用例详述里面大致可以q样来写Q?/span>
执行查询 基本: 1Q?/font> 员工选择查询功能 员工期望查询业务数据Ӟ选择查询链接Q从而启动本用例的执行?/span> 2Q?/font> pȝ转入查询面Qƈ昄备选的查询选项
3Q?/font> 员工填写查询条gq提?/span>
4Q?/font> pȝ验证查询条g的合法?/span> 验证条g的格式以及简单逻辑Q如大小、前后、范?/span> 5Q?/font> pȝ符合条件的信息q回 pȝ查询结果以分页列表的Ş式显C在面?/span> 6Q?/font> 员工退出查询功?/span> 员工点击退出链接,q回C一U页?/span> 扩展点:导出、打印扩展点定义在步?/span> 5 |
导出 该用例是在“导出、打印”扩展点上扩展了执行查询用例 基本: 1 Q如果员工要求导出,选择导出按钮 。。。。。?/span> |
׃例可以看?/span> : 扩展用例的事件流往往可以也可抽象为基用例的备选流。但是在基用例本w已l是一个很复杂的情况下Q选用扩展关系备选流抽象成ؓ单独的用例可以基用例行为更l和目标更集中(当然上面的例子中基用例可能简单了些)?/span>
4 ?/span> 泛化 (generalization)
泛化关系Q子用例和父用例怼Q但表现出更特别的行为;子用例将l承父用例的所有结构、行为和关系。子用例可以使用父用例的一D行为,也可以重载它。父用例通常是抽象的。在实际应用中很用泛化关p,子用例中的特D行为都可以作ؓ父用例中的备选流存在?/span>
例如Q业务中可能存在许多需要部门领导审批的事情Q但是领导审批的程是很怼的,q时可以做成泛化关系表示Q?/span>
用例详述里面大致可以q样来写Q?/span>
审批 基本: 7Q?/font> 领导选择要审批的记录 领导期望审批记录Ӟ选择待审批记录链接,从而启动本用例的执行?/span> 8Q?/font> pȝ转入审批面Qƈ昄记录的详l信?/span>
9Q?/font> 领导填写审批意见 领导Ҏ(gu)记录的合理性来填写个h审批意见 10Q?/font> 提交审批l果
|
工资调整审批 该用例是审批用例的子用例 基本: 1 Q领导选择要审批的记录
2Q?/font> pȝ转入审批面Qƈ昄记录的详l信?/span>
3Q?/font> 领导填写审批意见
4Q?/font> 提交审批l果 如果调整q度较大Q则要提交上U审?/span> |
上面分析了用例之间的三种关系。其中最Ҏ(gu)让hqh的就是包含关pd扩展关系得区别。如果你现在对两者还有迷惑,请再仔细的对比一下上面两者的描述Q)?/font>