OO技术与UML结合的实践.ppt

上传人:laozhun 文档编号:2720399 上传时间:2023-02-23 格式:PPT 页数:41 大小:408.50KB
返回 下载 相关 举报
OO技术与UML结合的实践.ppt_第1页
第1页 / 共41页
OO技术与UML结合的实践.ppt_第2页
第2页 / 共41页
OO技术与UML结合的实践.ppt_第3页
第3页 / 共41页
OO技术与UML结合的实践.ppt_第4页
第4页 / 共41页
OO技术与UML结合的实践.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《OO技术与UML结合的实践.ppt》由会员分享,可在线阅读,更多相关《OO技术与UML结合的实践.ppt(41页珍藏版)》请在三一办公上搜索。

1、1,OO技术与UML结合的实践,Frank,2,议程,OO技术与CMM流程的初步融合在推行实践中的具体问题分析和解决措施 OO分析设计案例总结和展望,3,背景,我们的技术、业务、人员都在不断变化,因此软件过程也必须不断改进自身与之相适应;面向对象的软件开发技术与CMM流程的融合过程在流程改进方面具有典型意义;,过程(CMM),人,技术(OO),4,早期状况,多年来,面向对象(OO)技术的已经成为软件开发技术的主流,在很多地方得以应用实践。另一方面,很多公司力推CMM软件开发流程,使软件开发过程的能力成熟度得到逐步的提高,为产品质量的提升提供了有力的保障。大部分公司在CMM流程的最初制定过程中,

2、都要引入了一套软件需求规格、概要设计、详细设计等模板以及配套的指导书和Checklist,大部分是适用于结构化的软件开发方法的。,5,早期问题,因此在执行CMM开发流程的过程中,出现了用结构化的文档模板来描述面向对象的分析设计方案的情况,带来了不少问题:在面向对象的需求规格描述、设计实体描述方面,各项目组出现了各种五花八门的、写法各异的文档;开发人员苦恼于分析设计方案得不到很好的表达;影响了交付件质量,并对检视和指导下一步开发造成了障碍;一些公司没有推行CMM之前,这种情况就已经存在,而CMM的推行暴露了我们的技术方法不统一带来的弊端。,6,解决问题的总体思路,分析OO技术在CMM中应用的具体

3、范围:需求分析的模板、指导书、Checklist;概要设计的模板、指导书、Checklist;详细设计的模板、指导书、Checklist;OO技术方法的选择:UML表示法;OO工具的选择:Rational Rose已大量采用,但是在纳入流程方面存在一些限制,如价格、license、标准化,工具与流程方法的兼容等等。,7,解决问题的具体方案,在需求规格描述中引入了Use case模型;在概要设计中,基于原有的分层架构模型,引入UML的分包/子系统表示方法;引入类(Class)作为概要设计的基本设计元素;详细设计的基本设计元素是类的方法(Method);UML的顺序图、交互图等大量用于需求和设计的

4、动态建模。,8,实践中的问题,任何流程和技术的初次应用都会有一个磨合的过程,面向对象开发方法引入到CMM以后也是如此,各种应用问题很快涌现:首先,开发人员普遍希望有一套范例来指导大家写作分析设计文档;其次,通过与若干项目的交流和参与检视,发现各项目的设计文档交付件水平参差不齐,典型的问题如:需求规格的系统边界定义不清楚;架构方面的分层设计表达不清晰、不完整;软件模块与业务流程的实现关系表达不清晰、不完整;设计类与模块功能的实现关系表达不清晰、不完整;详细设计的粒度不一致;接口描述的方式不统一;某些设计要素如性能需求、软件质量特性等,容易被开发人员忽略。,9,文档范例问题解决,解决办法:开展优秀

5、OO分析设计文档评选的活动;在此基础上,经过裁剪、修改,完成了一套OO分析设计文档范例,范例的推出,使OO套件在对实际开发的指导作用上迈进了一大步;OO工程组又对模板、指导书也进行了适当的优化,而培训材料更做了较大的优化,实例更加丰富了,问题针对性也更强了。,10,总结优秀需求文档特点,用例模型完整清晰,说明了用例之间的关系;除了基本事件流描述,还有详细的备选事件流描述;用户接口部分给出了界面原型图和规范的界面说明;需求的分包概念比较清楚;性能需求和软件质量特性考虑比较全面;用例的前置条件和后置条件能够区分出状态而不是事件;软件接口描述的格式和语法很规范;,11,总结优秀设计文档特点,0层设计

6、清楚说明了系统与外部实体的关系 业务流程说明全面而清楚,并且与一层模块划分的逻辑关系比较清晰;二层设计的设计类分解与功能实现说明的逻辑关系清晰;有完整的组件视图和进程视图;详细设计伪代码描述的逻辑清楚,详细程度适中,对编码有指导意义。,12,案例,下面通过几个案例,说明在软件二部的项目级OO分析设计实践中出现的典型问题和解决措施:Actor设计案例;平台二次开发接口设计案例;详细设计案例;增强开发/小特性设计案例;分层接口设计案例;,13,Actor设计案例,REQ-TC-SM-002 输入经纬度坐标Use case描述Goal in Context 简要说明用户在创建网元、子网或者修改网元、

7、子网时可以输入经纬度坐标Preconditions 前置条件无End Condition 后置条件Success End Condition 成功后置条件 对象在指定的经纬度坐标处显示。Failed End Condition 失败后置条件 无Actors 用户Trigger 触发条件无Basic Flow 基本事件流描述Step 步骤1、用户执行创建、修改网元或者子网的操作2、用户输入对象的经纬度坐标3、下发命令到后台4、拓扑前台收到事件,在指定的经纬度坐标处显示 对象Alternative Flows 备选事件流2a、如果输入的经纬度无效,则提示“请重新输入”3a、如果命令发送失败,则前台

8、保持现状,14,平台二次开发接口设计案例,问题:平台的二次开发接口在SRS中如何描述?二次开发接口需求的actor如何定义?经过分析,目前比较常见的平台二次开发接口是类继承方式:,产品应用,平台,15,平台二次开发接口设计案例指导原则,原则是在接口处描述需求,在Use case描述中,产品应用模块是Actor,平台是目标系统,应用模块是以平台的抽象类(或者代理)的形式出现;在Use case的事件流中,基于平台提供给应用模块的一个完整的接口功能,描述平台与应用模块的接口交互过程;所有平台二次开发接口都应该在SRS的Use case特殊需求或者集中在软件接口需求中说明具体的接口参数;在Use c

9、ase特殊需求中,应说明抽象类的属性和方法的原型,作为此需求实现的约束;避免把二次开发的开发人员作为Actor、把编程活动作为事件流。,16,平台二次开发接口设计案例需求描述,用户操作的用例,二次开发接口用例,17,平台二次开发接口设计案例需求描述,3.3.3 R.FUNC.RTDBG.102 处理查询版本请求Use case描述1.Goal in Context 简要说明应用模块需要实现本模块的版本查询,即用户输入命令查询当前模块的版本信息时,通知应用模块需要处理此请求。2.Preconditions 前置条件应用模块正确使用动态调试框架。3.End Condition 后置条件Succes

10、sful End Condition 成功后置条件:返回成功。Failed End Condition 失败后置条件:返回失败。4.Actors 应用模块5.Trigger 触发条件由用例R.FUNC.RTDBG.005 查询当前模块版本信息触发。6.Description 基本事件流描述Step 步骤1、由R.FUNC.RTDBG.005 查询当前模块版本信息用例使用此用例,本用例开始;2、向应用模块查询版本信息;3、如果查询成功,显示版本信息,否则执行备选事件流3a;4、提示操作符,等待用户进一步操作,本用例成功结束。7.Extensions 备选事件流Step 步骤3a 查询信息失败3a

11、1 输出错误提示,转向执行基本事件流4;,18,平台二次开发接口设计案例需求描述,Use case:处理查询版本请求特殊需求:本功能是平台提供给应用模块的二次开发接口,通过平台提供一个基类,应用模块继承基类并重载接口方法的方式来实现,基类的原型如下:class PlatformClass1()public:operation1();/查询版本信息接口方法,19,平台二次开发接口设计案例需求描述,REQ-TC-SM-003 二次开发者扩展查询条件1、Goal in Context 简要说明公共拓扑前台不可能实现所有的查询条件,但是产品需要根据特殊的条件来进行查询,而公共拓扑没有这些信息,因此需要

12、公共拓扑提供可以扩展的手段以便产品可以提供自己需要的查询条件。2、Preconditions 前置条件无3、End Condition 后置条件Success End Condition 成功后置条件 无Failed End Condition 失败后置条件 无4、Actors 二次开发者5、Trigger 触发条件 无6、Basic Flow 基本事件流描述Step 步骤1、二次开发者根据公共拓扑提供的扩展接口提供自己的编程实现7、Alternative Flows 备选事件流无,不好的例子!,20,public AsnObjectTag objIdtof()AsnObjectTag tag

13、=new AsnObjectTag();for(int i=0;i 8;i+)tag.objectID.add(BigInteger.valueOf(this.objIdi);tag.label=this.label.getBytes();tag.maintype=BigInteger.valueOf(mainType);tag.subtype=BigInteger.valueOf(subType);return tag;,详细设计案例,不好的例子!,21,void CEmsResReadTask:QueryRelatedLogicRes(CmdMSG*pCmdMsg)对消息中Asn结构进行解

14、码;线程加锁;调用CEmfResMIT:GetResIID,遍历MIT根据资源resID查询iid;if(失败)给EMS发送失败返回消息;线程解锁;return;根据查询到的物理资源的iid,查询tbl_Relation表中与之关联的逻辑资源iid;根据逻辑资源iid取得逻辑资源信息(resID,maintype,subtype,label);线程解锁;给EMS分包发送回应消息;return;,详细设计案例,22,原则一 所有方法应该有功能描述文字。如find:Locates the position of the first occurrence of an element in a ran

15、ge that has a specified value;原则二 Get/Set/运算符等不直接实现用例的方法,不需要写伪码;原则三 类的方法或函数规模如果超过20行,应该进行详细设计;原则四 每个类的关键方法,都应进行详细设计;,详细设计指导原则,23,采用程序环路复杂度计算方法判断关键方法.把表示程序控制流的流程图加以改造,去掉箭头,只保留流线,则成为无向图。把无向图中任何两个结点之间至少存在一条通路的图称为连通图。连通图G中的环路数V(G)表示程序的复杂度,它按照以下公式计算:V(G)=E-n+2其中,E是G的边数,n是图G的节点数,这里的节点是指原流程图中的分支点、汇合点和处理框。V

16、实际上是连通图把平面分割的区间数。如果 V(G)=3,则属于关键方法(具有多重选择的case语句作为例外,不予以考虑)。简化判断方法:如果循环语句、条件语句之间存在一重以上嵌套,则V(G)=3,如例3。,详细设计指导原则,什么是“关键方法”?,24,详细设计指导原则,25,详细设计指导原则,从ODC分析中发现,详细设计的指导原则有必要进一步优化,有一些代码只有很少的语句,但是反映重要的设计逻辑,也应该在详细设计中定义。,26,问题:在实际开发过程中,许多项目都不是全新开发,而是在原有系统上进行增强或小特性的开发;增强开发/小特性的需求可以单独描述,但是概要设计与原有系统的概要设计有很强的相关性

17、,面临设计文档如何保持一致性、完整性,同时又避免重复描述设计的问题。对此,总的指导原则是:对增强开发/小特性,首先应该在原有的设计文档上直接修改,并与配置管理相结合来实现对设计变更的控制;如果确实无法在原有文档上修改的,才容许单独写新的设计文档,并且应遵循模板中对增强开发/小特性的编写建议。,增强开发/小特性设计案例,27,3.1System Architecture系统结构如果本文档是针对增强开发/小特性的设计,继承了原有的系统结构,那么应拷贝原有的系统结构说明,如系统结构图和相应的文字说明,然后在一层设计中明显标识出新增功能在原有系统结构中的位置(属于原来哪一个模块的新增功能,与原有各模块

18、之间有什么交互)。在后续的业务流程说明、模块分解描述、依赖性描述和接口描述中,如果与本次增强开发/小特性无关的,可以不再重复描述,如果有关联的,应该拷贝原有的设计说明,在此基础上再说明更改的内容。4.1Module Name(1)模块1名称如果本文档是针对增强开发/小特性的设计,继承了原有的二层模块结构,那么那么应拷贝原有的模块结构说明,如包图/类图和相应的文字说明,然后在二层设计中明显标识出新增功能在原有模块结构中的位置(属于原来哪一个子模块/设计类的新增功能,与原有各子模块/设计类之间有什么交互)。在后续的功能实现说明和设计类定义中,如果与本次增强开发/小特性无关的,可以不描述,如果有关联

19、的,应该拷贝原有的设计说明,在此基础上再说明更改的内容。对更改的设计类应该给出类的完整定义,再标识出更改的属性和方法。,增强开发/小特性设计案例编写建议,在DVP05T06-High Level Design(OO method)模板中,28,问题:在软件需求规格和一层设计中,都存在接口的描述,两者有何不同,如何描述?REP01T02-Software Requirements Specification(OO Method):5 Interface Requirements 接口需求 5.1 User Interface 用户接口5.2 Software Interface 软件接口 DVP

20、05T06-High Level Design(OO method):Level 1 Design Description第一层设计描述 3.4 Interface Description接口描述,分层接口设计案例,29,1、系统外部接口(0层)如图所示的Interface-S1S2,属于系统外部接口,这样的接口应该在系统System1的SRS中作为需求来说明,属于软件接口需求,在软件接口需求中应该详细说明接口参数。,分层接口设计案例,30,2、系统内部接口(一层)如图所示:接口Interface-M1M2,属于系统内的模块间接口,应该在HLD的一层设计中的接口描述部分说明,同样,在此应该详细

21、说明接口参数。,分层接口设计案例,31,1)如果模块接口Interface-M2S2完全实现了系统接口Interface-S1S2,那么对Interface-M2S2不需要再描述,只需要说明Interface-M2S2实现了Interface-S1S2既可;2)如果模块接口Interface-M2S2只是部分实现了系统接口Interface-S1S2,那么两者的接口参数应该各自独立描述,并且在Interface-M2S2的描述中应说明与Interface-S1S2的实现关系。,分层接口设计案例,32,软件设计的七个基本原则,第一原则:存在的理由 一个软件系统存在的理由就是:为它的用户提供价值。

22、你所有的决定都取决于这一点。在指定一个系统需求,在写下一段系统功能,在决定硬件平台和开发过程之前,问你自己一个问题,“这样做会为系统增加价值吗?“如果答案是”yes”,做!如果是”No”,不做!第二原:则能简单就简单 软件设计不是一个轻描淡写的过程。在做任何一个设计时,你必须考虑很多因素。所有设计应当尽可能简单,但是不要再比这简单了。这样产生的系统才是可以理解和容易维护的。确实很多更优雅的设计往往更简单。事实上,简单是通过许多思考和一次一次的反复修改才达到的。这些努力的汇报就是更容易维护,代码错误更少。,33,第三原则:保持远见 清晰的远见是一个软件项目成功的基础。没有这样的远见,项目开发最后

23、就变成天天为一个不好的设计做补丁。概念的完整性是系统设计中最重要的问题。只有当你对系统的体系由一个清晰的感觉,才可能去发现通用的抽象和机制。开发这种通用性最终导致系统更简单,因此更小,更可靠 如果你不断地复制、粘贴、修改代码,最终你将陷入一个大泥潭(the Big Mud),你永远不可能对系统有一个清晰的认识。第四原则:你制造的,别人会消费 软件系统不是在真空中使用的。其他人会使用、维护、文档你的系统。这依赖于对你系统的理解。所以,你设计、实现的东西应当能够让别人理解。要记住,你写的代码并非只给计算机看,你要时时记住,代码还要给人看。如果到处泛滥似是而非的代码,别人如何能够辨别这些代码的相似和

24、不同,如何去理解这些代码之间具有何种关系。,34,第五原则:对将来开放 一个成功的软件有很长的生命期。你必须能够使得软件能够适应这样和那样的变化。所以,一开始就不要软件设计到死角上去。请总是问一下自己“如果这样,那么。?“这个问题,你要考虑到各种各样的可能性,而不光光是图省事。复制,粘贴一下即可。第六原则:为重用做好计划 软件模式是重用计划的一种。不断重复的代码显然不是这样的计划。第七原则:思考!在采取任何动作之前首先做一个清晰、完整的考虑,这样才能产生更好的结果。如果你考虑了,但还是产生错误的结果,那么这种努力也是值得的。在你学习或研究类似的问题时,更容易理解和掌握。,35,重复代码出来优化

25、方法,1 同一个类的两个方法中有相同的表达式,使用Extract method,然后大家都调用该method;2 两个兄弟子类之间有相同的表达式,那么在这两个子类中使用Extract Method,接着使用pull up field,移到共同的超类 3 如果结构相似而并非完全相同,用Extract method把相同部分和不同部分分开。然后使用form Template method.4 如果方法使用不同的算法做相同的事情,那么使用substitute algorithm 5 如果在两个不相干的类中有重复代码,那么在一个类中使用Extract class,然后在其他类中使用该class对象作为

26、元素。,36,class Invoice.String asciiStatement()StringBuffer result=new StringBuffer();result.append(“Bill for“+customer+“n”);Iterator it=items.iterator();while(it.hasNext()LineItem each=(LineItem)it.next();result.append(“t”+each.product()+“tt”+each.amount()+“n”);result.append(“total owed:”+total+“n”);r

27、eturn result.toString();String htmlStatement()StringBuffer result=new StringBuffer();result.append(“Bill for”+customer+“”);result.append(“”);Iterator it=items.iterator();while(it.hasNext()LineItem each=(LineItem)it.next();result.append(“”+each.product()+“”+each.amount()+“”);result.append(“”);result.

28、append(“total owed:”+total+“”);return result.toString();,37,asciiStatement和htmlStatement具有类似的基础结构,但是它们的实际步骤却有所不同。他们都完成三件事情:1 打印发票头 2 循环每一个项目,并打印 3 打印发票尾部 这种结构的相似性和意图马上上我们使用composed method(也就是Martin Fowler的(Extract method):interface Printer String header(Invoice iv);String item(LineItem line);String

29、footer(Invoice iv);static class AsciiPrinter implements Printer public String header(Invoice iv)return“Bill for“+iv.customer+“n”;public String item(LineItem line)return“t”+line.product()+“tt”+line.amount()+“n”;public String footer(Invoice iv)return“total owed:”+iv.total+“n”;,38,象html则可以实现htmlPrinter

30、.class Invoice.public String statement(Printer pr)StringBuffer result=new StringBuffer();result.append(pr.header(this);Iterator it=items.iterator();while(it.hasNext()LineItem each=(LineItem)it.next();result.append(pr.item(each);result.append(pr.footer(this);return result.toString();class Invoice.pub

31、lic String asciiStatement2()return statement(new AsciiPrinter();,39,实践总结,OO与CMM2.0的结合是基于CMM以文档作为软件分析设计交付件的方式,在此前提下,已能够满足采用OO方法的软件开发项目的需要;需求规格和软件设计的文档模板已融入了UML的主要设计元素(Business Model的内容除外);而UML的设计内容都是可以文档化的,这为模板的不断完善提供了基础;有一套完整的文档范例供开发人员参考;对一些典型的设计问题和项目运作特点相关的问题也有经过专家评审的解决方案;培训材料、指导书经过了优化,增加了不少实例;今后在设计案例方面还可以不断地丰富。,40,展望,经过一年来的OO软件工程推行实践,我们觉得,无论是面向对象技术还是其他的软件开发技术,在与CMM流程结合的过程中,必然经过不断地优化和改进。当前流程方法存在的缺点:(1)文档与代码之间的一致性问题;(2)Rose之类的建模工具得到广泛采用,开发人员倾向于用工具来维护模型,那么工具所维护的模型与文档之间也存在一致性问题。趋势:大型软件开发平台集成UML,支持从分析、设计到编码、测试全套过程,对企业已定义的开发流程的影响?趋势:软件开发活动正在向基于模型设计和代码自动生成的方向发展,对开发流程的影响?,41,Thank you-,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号