tanhuobin_uml09Object-OrientedDesign-DesignCompo

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

面向对象分析设计Object-OrientedAnalysis&Design谭火彬第09章面向对象的设计(构件设计)Object-OrientedDesign—DesignComponents-3-学习路线图OOUMLOOPDP…Case-Study…学习路线图::……………………12345678910-4-关于构件设计任务基于“构架分析”和“用例分析”的框架,利用“构架设计”提供的素材,在不同的局部,将分析的结果用“设计元素”加以“替换”和“实现”主要活动实现需求场景(用例设计)实现子系统接口(子系统设计)明确类的实现细节(类设计)-5-内容安排用例设计子系统设计类设计数据库设计-6-内容安排用例设计子系统设计类设计数据库设计-7-用例设计用例设计(Use-CaseDesign)目标利用交互图改进用例实现改进对设计类的操作需求改进对子系统和它们的接口的操作需求输入用例实现(分析)设计元素输出用例实现(设计)-8-用例设计步骤将设计应用于用例1.结合设计元素,定义设计对象间的交互2.利用子系统简化交互图3.描述与持久化相关的行为4.改进用例实现的事件流5.评价类和子系统-9-1.应用交互图:职责分配利用设计元素,进行类的职责分配,完成用例实现的交互图需要遵循相关的设计原则和模式职责分配模式:GRASP模式信息专家、创建者、高内聚、低耦合、控制者、多态、纯虚构、中介、受保护变化单一类职责原则(SRP)保持类职责的单一性,设计高内聚的类-10-用例分析与用例设计用例分析与用例设计的差别表现在类的职责和操作的差别用例分析阶段定义类的初步职责用例设计阶段则需要定义具体的操作来实现这些职责发送到设计类的消息,对应该类的操作发送到子系统的消息,对应其接口的操作分析中主要的业务职责集中在控制类中,因此设计的重点就是控制类职责的实现臃肿的控制器(BloatedControllers)-11-臃肿的控制器臃肿的控制器:低内聚、缺乏重点并且处理过多的职责区;即违背面向对象设计的相关原则:高内聚、低耦合SRP解决方案加入更多的控制器(更多的分层)将部分职责委托给其它对象-12-用例设计-改进用例实现步骤确定参与用例流的每个对象用设计元素取代分析类在交互图中描绘每一个参与对象遵循相应的设计原则和模式,利用交互图完成职责分配过程递增地并入可适用的构架机制引入所需的设计机制(设计模式),调整和完善交互图-13-在交互图中表示子系统接口代表任何实现该接口的模型元素不能发出任何消息代理类为每个子系统定义一个代理类,代表特定的子系统可以发送和接收消息×√-14-实例:引入子系统接口-15-实例:引入子系统接口之前(分析)-16-实例:引入子系统接口之后(设计)-17-实例:引入子系统接口(VOPC)-18-使用构架机制在用例分析过程中确定了预约挂号控制类AppointRegisterServlet运行分布机制在构架设计过程中决定采用Servlet技术来实现Web访问在用例设计过程中运用该机制来实现分布访问-19-实例:引入Servlet机制后VOPC-20-引入Servlet机制后交互图(片断)-21-2.利用子系统封装交互交互可以在几个级别进行描述子系统交互可以在其自己的交互图内部描述利用子系统提高抽象的级别-22-何时将子流封装为子系统封装一个子流为子系统,当该子流:出现在多个用例实现中有潜在的重用性复杂却容易封装是一个人或团队的职责产生一个明确的结果被封装在一个单独的实施模型构件中-23-指南:利用子系统封装交互子系统应当由交互图上的接口来描述到子系统的消息模型化为到子系统接口的消息到子系统的消息符合子系统接口的操作子系统发出的消息模型化为代理类发出的消息子系统内部的交互在子系统设计中完成-24-利用子系统封装交互的优点利用子系统封装交互提高了用例实现事件流的抽象级别用例实现较少混乱,尤其是在某些子系统内部很复杂时在创建子系统内部设计之前可以创建用例实现,以利于并行开发用例实现变得更加通用,也更容易变化(子系统是可替代的)-25-3.说明持久性相关行为在用例设计阶段,说明持久性相关行为需要考虑事务建模写持久对象删除持久对象修改持久对象读持久对象-26-事务建模事务原子操作调用“全部或全都不”提供一致性建模方法:文本方式(脚本)明确消息错误条件回滚、失败模式可能需要单独的交互图-27-4.改进用例实现的事件流对交互图中的消息添加必要的细节-28-5.评价类和子系统在全局对每个用例实现进行综合评价元素的名称应当说明模型元素的功能合并相似的模型元素使用继承来抽象模型元素保持模型元素和事件流一致-29-内容安排用例设计子系统设计类设计数据库设计-30-子系统设计子系统设计(SubsystemDesign)的目标用所包含设计元素和外部子系统/接口的协作来定义在子系统接口中指定的操作记录子系统的内部结构定义子系统接口和包含类之间的关系确定对其他子系统的依赖关系输入:具有接口定义的设计子系统输出更新后的接口定义子系统内部设计模型-31-指南:子系统设计目标松耦合可移植性,即插即用性能隔离变化独立进展建议不要陈述细节,而只陈述接口只依赖其它接口关键是抽象和封装-32-子系统建模约定接口在子系统外部代理类在子系统内部接口子系统代理类-33-子系统设计步骤1.将子系统行为分配给子系统元素2.描述子系统内部元素3.定义子系统间的依赖关系-34-子系统职责接口操作定义子系统的职责对接口的操作实现进行建模接口操作可以由以下实现内部类的操作内部子系统的操作-35-分配子系统职责步骤确定新的或者重用已有的设计元素将子系统职责分配给设计元素合并可适用机制(如持久性,分布)记录接口实现中的设计元素协作每个接口操作一个或多个交互图包含必需的设计元素关系的类图重新进行“确定设计元素”如果需要,调整子系统边界和依赖关系-36-建模方法:子系统交互图-37-实例:PaymentSystem子系统建模-38-运用构架机制:持久性接口IPayment提供了操作makePaymet(进行费用支付),即子系统PaymentSystem需要实现该操作为简化处理,并说明持久性构架机制的应用,现假设支付是直接在某个费用数据库中进行插入操作需要引入构架机制:持久性:JDBC对该机制的写操作机制进行建模-39-接口操作实现的交互图-40-2.描述子系统内部元素-41-3.定义子系统间的依赖关系子系统与子系统之间依赖关系子系统与包之间依赖关系(小心使用)-42-实例:PaymentSubsystem子系统依赖关系-43-内容安排用例设计子系统设计类设计数据库设计-44-类设计类设计(ClassDesign)目标确保类可为用例实现提供必需的操作确保提供足够的信息可明确无误地实现处理和类相关的非功能需求输入用例实现(设计)输出设计类-45-设计类设计类设计模型的构造块设计类是已经完成了规格说明并且达到能够被实现程度的类来源于问题域和解域通过分析类的精化得到的问题域—添加实现细节解域,提供了能够实现系统的技术工具-46-设计类剖析在分析中,只要尽量捕获系统需要的行为,而完全不必考虑如何去实现这些行为在设计中,则必须准确地说明类是如何履行它们的职责完整的属性集合,包括详细说明的名称、类型、可视性和一些默认值将分析类指定的职责转化成一个或多个操作的完整集合-47-良好的设计类类的公共方法定义它和类用户之间的契约要从类用户的角度去评估类的目的基本特征完整性和充分性原始性高内聚低耦合-48-类设计的主要内容1.创建初始设计类2.定义操作3.定义方法和状态4.定义属性5.定义关系6.处理其它问题-49-1.创建初始设计类创建初始设计类,需要考虑类构造型边界控制实体可适用的设计模式构架机制持久性分布…-50-边界类的设计策略用户界面(UI)边界类使用什么用户界面开发工具哪些界面可以用开发工具直接创建外部系统接口边界类通常建模为子系统-51-实体类的设计策略实体对象通常是被动的和持久性的性能需求可能要对实体类进行重构持久性构架机制影响实体类-52-控制类的设计策略如何处理控制类是否真正地需要它们?它们应当被分开吗?下列情况下,控制类可能变为真正的设计类封装非常重要的控制流行为封装的行为很可能变化必须跨越多个进程或处理器进行分布封装的行为要求一些事务管理-53-调整控制类调整控制类的基本策略多个用例若有同样活动的控制类,将其整合起来,把相同部分作为一个新的控制类把一些简单的由边界类委托的职责交给实体类之后,删除没有进行场景控制的实体类用例的控制流程过于复杂,则可以考虑根据不同的控制业务分解成多个控制类2.定义操作操作是类的行为特征,描述了该类对于特定请求做出应答的规范同一个类的每个操作都具有唯一签名,通过描述操作的签名完成类操作的定义UML中的四种可见性公有(+)、私有(-)、保护(#)和包(~)-54-可见性操作名(参数方向参数名称:参数类型[多重性]=缺省值,…):返回类型[多重性]-55-发现操作显示在交互图中的消息其它独立功能的实施自身的管理功能(构造、析构等)类复制的需要(测试类是否相等,创建类副本等)其它操作机制的需要(垃圾收集、测试等)示例:定义类的操作-56--57-3.定义方法和状态方法(Method)是指操作的具体实现算法详细说明操作实现的细节可采用UML活动图对方法进行建模考虑的内容特殊算法要使用到其它对象和操作属性和参数如何实现和使用关系如何实现和使用方法的实现往往受对象的状态影响-58-状态对象的状态(State)反映于现实世界的一系列特征,这些特征影响该对象的实现目标明确一个对象的状态如何影响其行为利用状态机图进行建模要考虑的问题哪些对象有重要的状态如何确定一个对象可能的状态如何将状态机图映射到模型的其它部分-59-状态机图状态机图(StateMachinediagram)是一由状态和转移组成的有向图描述了一个对象的发展历史State1State2Event(args)[guardcondition]/action-60-两个特殊状态初始状态当一个对象创建时所进入的状态必须的只能有一个初始状态最终状态显示一个对象生命的结束可选的可能有多个-61-确定状态重要的、动态的属性申请的大人人数确定关联的存在和不存在转移转移(transition)是从一个源状态到一个目标状态之间的一个有向关系,包括三个要素事件(event):事件发生时转移才有可能发生守卫条件(guardcondition):当事件发生时,守卫条件为真,则发生转移;否则忽略该事件动作(action):当转移发生时所执行的动作,该动作应当是原子操作。-62--63-增加活动和动作活动(Activities)关联于一个状态在进入状态时开始要花费时间完成可中断的动作(Actions)关联于一个转移花费很少量的时间完成是不可中断的-64-实例:申请对象的状态机图-65-哪些对象需要进行状态建模需要进行状态建模的对象其职责由状态转移所阐明的对象复杂的状态受控的用例以下对象不需要进行状态建模直接映射到实现的对象非状态受控的对象只有一个状态的对象-66-状态机图影射到模型的其它部分事件可以映射到操作方法应当使用状态特定信息来更新状态常常使用属性来表示4.定义属性指定名字、类型、可见性和可选的缺省值visibilityattributeName:Type=Default遵循编程语言和项目的命名约定类型应当

1 / 99
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功