软件需求分析与设计- grasp:基于职责的设计_第1页
软件需求分析与设计- grasp:基于职责的设计_第2页
软件需求分析与设计- grasp:基于职责的设计_第3页
软件需求分析与设计- grasp:基于职责的设计_第4页
软件需求分析与设计- grasp:基于职责的设计_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件需求分析与设计 GRASP:基于职责的设计,2018/1/30,2,软件分析与设计GRASP:基于职责的设计,主要内容学习5个GRASP原则或模式创建者信息专家低耦合控制器高内聚,2018/1/30,3,软件分析与设计对象设计起始场景,2018/1/30,4,软件分析与设计输入场景与对象设计关系,2018/1/30,5,软件需求分析与设计对象设计输出,在开始编码之前针对设计中的难点创建UML交互图,类图和包图UI的草图和原型数据库模型报表的草图和原型,2018/1/30,6,制品关系,2018/1/30,7,软件分析与设计职责驱动方式,把软件对象想象成为具有某种职责的人,它要与其他协作以完成职责职责定义为“类元”的契约和责任行为职责自身执行一些行为,如创建对象或计算初始化其他对象中的动作控制和协调其他对象中的活动认知职责对私有封装数据的认识对相关对象的认知对其能够导出或计算的事物的认知对于软件领域对象来说,由于领域模型描述了领域对象的属性和关联,因此其通常产生与”认知“相关的职责,2018/1/30,8,职责与方法是相关的,当我们在绘制UML交互图时,就是决定职责的分配,2018/1/30,9,软件分析与设计GRASP,GRASP通用职责分配软件模式(General Responsibility Assignment Software Pattern)创建者(Creator)控制器(Cotroller)纯虚构(Pure Fabrication)信息专家(Information Expert)高内聚(High Cohesion)间接性(Indirection)低耦合(Low Coupling)多态性(Polymorphism)防止变异(Protected Variations),2018/1/30,10,软件分析与设计什么是模式,模式是对问题和解决方案的已命名描述,它可以用于新的语境模式为在变化环境中如何运用和权衡其解决方案给出建议好的模式是成对的问题/解决方案,并且具有广为人知的名称,2018/1/30,11,设计模式创建者,2018/1/30,12,部分领域模型,2018/1/30,13,创建SalesLineItem,2018/1/30,14,设计模式创建者,讨论创建者模式指导我们分配那些与创建对象有关的职责组合聚集部分,容器容纳内容,记录者进行记录,所有这些都是类图中之间极为常见的关系组合对象是创建其组成部分的良好候选者禁忌对象的创建常常具有复杂性,最好的方法可能是把创建职责委派给成为具体工厂或抽象工厂的辅助类,2018/1/30,15,设计模式创建者,优点支持低耦合相关模式低耦合具体工厂和抽象工厂整体部分,2018/1/30,16,设计模式信息专家,2018/1/30,17,Sale的关联,2018/1/30,18,部分交互图和类图,2018/1/30,19,计算Sale的总额,2018/1/30,20,计算Sale的总额,2018/1/30,21,知道销售总额的职责,2018/1/30,22,设计模式专家模式,讨论信息专家经常用于职责分配,这是对象设计中不断使用的基本指导原则完成职责往往需要分布在不同对象类的信息专家模式通常导致这样一种设计,软件对象所做的操作通常作用于他们真实世界中所代表的非生命体的那些操作信息专家模式是对真实世界的模拟禁忌谁应当负责把Sale存入数据库呢?支持主要的关注分离可以改变设计中的耦合和内聚,2018/1/30,23,设计模式专家模式,优点信息的封装得以维持,支持低耦合,进而形成更为健壮的、可维护的系统行为分布在那些具有所需信息的类之间,因此提倡定义内聚性更强的“轻量级”的类相关模式低耦合高内聚,2018/1/30,24,设计模式低耦合,耦合是对某元素与其他元素之间的连接,感知和依赖程度的度量。具有低耦合的元素不会过多的依赖于其他的元素,2018/1/30,25,Register创建Payment,2018/1/30,26,Sale创建Payment,2018/1/30,27,设计模式低耦合,讨论低耦合是设计中必须牢记的原则耦合类型TypeX具有应用TypeY的实例或TypeX自身的属性TypeX对象调用TypeY对象的服务TypeX具有以任何形式引用TypeY的实例或TypeX自身的方法TypeX是TypeY的直接或间接子类TypeY是接口,而TypeX是此接口的实现,2018/1/30,28,设计模式低耦合,讨论低耦合提倡职责分配要避免产生具有负面影响的高耦合低耦合不能脱离专家和高内聚等其他模式孤立的考虑,而应作为影响职责分配的设计原则之一子类和超类之间有很强的耦合性对象之间的适度耦合对于创建面向对象系统来说是正常和必要的应该在降低耦合和封装事物之间进行选择,2018/1/30,29,设计模式低耦合,禁忌高耦合对于稳定和普遍使用的元素而言并不是问题J2ee于Java类库优点不受其他构件变化的影响易于单独理解便于复用相关模式防止变异,2018/1/30,30,专家支持低耦合,信息专家的动机该原则可以指导我们作出支持低耦合的选择。专家让我们寻找这样的对象,该对象具有职责所需的大部分信息,并把职责分配给该对象如果把职责分配到其他地方,总体耦合会比较高,存在更多的信息或对象必须被某些事物所共享,2018/1/30,31,设计模式控制器,控制器是UI层上的第一个对象,它负责接收和处理系统操作消息,2018/1/30,32,NextGen应用中的若干系统操作,2018/1/30,33,哪个对象应该是enterItem的控制器,2018/1/30,34,控制器的选择,代表整个“系统”、“根对象”、装置或子系统Register, POSSytem代表用例场景中所有系统事件的接收者或处理者ProcessSaleHandler, ProcessSaleSession,2018/1/30,35,系统操作的分配,2018/1/30,36,设计模式控制器,UI层不应当包含逻辑、所以UI层对象必须把工作请求委派给其他层系统外部输入事件,通常涉及人工操作,必须为这些事件选择一个处理者正常情况下,控制器应当把需要完成的工作委派给其他的对象。控制器只是协调或控制这些活动,本身并不完成大量工作第一类控制器表示整个系统、装置和子系统的外观控制器如果您选择用例控制器,那么对于每一个用例,应该使用不同的控制器当把职责分配给外观控制器会导致内聚或高耦合的设计时,通常是当外观控制器的职责过多而变的“臃肿”时,就需要考虑使用用例控制器UI对象和UI 层不应具有实现系统事件的职责,2018/1/30,37,控制器在Web UI和服务器端的应用,GRASP控制器是领域模层的一部分,它控制或协调工作请求的处理,根本不知道所用的UI技术可以用控制器模式在纯领域模型选择合适的接收者对服务器端系统操作的适当处理在很大程度上受所选择的服务器技术与架构的影响对于与服务器交互的富客户端UI控制器模式仍然使用客户端把请求转发给本地的客户端控制器,控制器将全部或部分请求处理发送到远程的服务器优点增加了可复用和接口的可插拔的潜力获得了推测用例状态机会,2018/1/30,38,使用Java Swing的实现:富客户端UI,Package com.craiglarman.nextgen.ui.swingpublic class ProcessSaleJframe extends private Register register; public ProcessSaleJFrame(Register _register)register = _register;private JButton BTN_ENTER_ITEM;private JButton getBTN_ENTER_ITEM()if(BTN_ENTER_ITEM !=null)retuen BTN_ENTER_ITEM; BTN_ENTER_ITEM = new JButton();BTN_ENTER_ITEM.setText(“Enter Item”);,2018/1/30,39,使用Java Swing的实现:富客户端UI,BTN_ENTER_ITEM.addactionLister(new ActionListener()public void actionPerformed(ActionEvent e)ItemID id = Transformer.toItemID(getTxt_ID().getText();int qty = Transformer.toInt(getTXT_QTY().getText();register.enterItem(id,qty););return BTN_ENTER_ITEM;,2018/1/30,40,使用Java Struts实现:客户端浏览器和WebUI,package com.craiglarman.nextgen.ui.web;public class enterItemAction extern Actionpublic ActionFormward excute(ActionMapping mapping, Actionform form, HttpServletRequest request, HttpServletResponse response) throw ExceptionRepository repository = (Repository )getServlet().getServletContext().getAttribute(Constats.REPOSITORY_KEY);Register register = repository.getRegister();String txtID = (SaleForm)form).getItemID();String txtQty = (SaleForm)form).getQuantity();ItemID id = Transformer.toItemID(txtId);int qty = Tansformer.toInt(txtQty);register.enterItem(id,qty);,2018/1/30,41,臃肿的控制器问题,设计不良的控制器类内聚性低,即没有重点,并且要处理过多领域的职责,成为臃肿控制器只有一个控制器来接收系统中的全部的系统事件,而且有很多系统事件为了处理系统事件,由控制器完成诸多必要的任务,而不是把工作委派出去控制器有许多属性,并且它维护关于系统或领域的重要信息,2018/1/30,42,解决臃肿的控制器方法,增加控制器,系统不是只有一个控制器,应使用用例控制器,而不是外观控制器MakeReservationHandlerManageSchedulesHandlerManageFareHandler设计控制器,使它把完成每个系统操作的职责委派给其他对象,2018/1/30,43,UI层到领域层之间所期望的耦合,2018/1/30,44,接口层到领域层所不期望的耦合,2018/1/30,45,设计模式控制器,相关模式命令(Command)在消息处理系统中,可以用命令对象来表示和处理每个消息外观(faade)-外观控制器是一种外观层(Layer)把领域逻辑置于领域层而不是表示层纯虚构(Pure Fabrication)软件类是由设计者任意创建的,而不是源于领域模型,2018/1/30,46,对比不同设计的内聚程度,内聚是软件设计中的一种基本品质,内聚可以非正式地用于度量软件元素操作在功能上的相关程度所有的交互都会产生不良(高)耦合。不良内聚和不良耦合通常是齐头并进的,左侧方案比右侧方案的内聚性较差(高内聚),2018/1/30,47,设计模式高内聚,2018/1/30,48,Register创建Payment,2018/1/30,49,Sale创建Payment,2018/1/30,50,设计模式高内聚,在实践中,内聚程度不能脱离其他职责及其他原则单独地考虑内聚程度的场景非常低内聚,由一个类单独负责完成不同的功能领域中的大量事物低内聚,由一个类单独负责一个功能性领域内的复杂任务高内聚,由一个类负责某个功能领域中的相应职责,并与其他类协作完成任务适度内聚,由几个类负责几个不同领域中的轻量级和单独的职责,这些领域在逻辑上与类的概念相关,但彼此之间并不相关高内聚的类优势明显,因为它易于维护,理解和复用,2018/1/30,51,设计模式高内聚,模块化是将系统分解成一组内聚的、松散耦合的模块的特性,通过创建具有高内聚的方法和类来促进模块化设计不良内聚通常会导致不良耦合,反之亦然在少数情况下可以接收低内聚将一组职责或代码放入一个类或构件中,以使某个人能方便地对其进行维护创建数量较少并且规模较大的低内聚服务对象,以便为大量操作提供接口,2018/1/30,52,设计模式高内聚,优点能够更加轻松,清楚地理解设计简化了维护和改进工作通常支持低耦合由于内聚的类可以用于某个特定的目的,因此细粒度、相关性强的功能的重要性增强,2018/1/30,53,设计实例用例实现,描述某个用例基于协作对象如何在设计模型中实现设计者能够描述用例的一个或多个场景的设计,其中的每个设计都称为用例实现,2018/1/30,54,制品关系强调用例的实现,2018/1/30,55,通讯图和系统操作的处理,2018/1/30,56,顺序图和系统操作的处理,将SSD中系统操作作为领域层控制对象的起始消息,2018/1/30,57,满足契约后置条件的部分交互图,依据对相关用例文本的思考,完成后置条件的状态变更,并设计消息的交互以满足需求,2018/1/30,58,Nextgen迭代的用例实现,初始和“启动”用例启动用例实现是设计语境,在该语境中要考虑创建大部分的“根”或生命期长的对象如何设计makeNewSale选择控制器Store, Register, POSSystemProcessSaleHander, processSaleSession创建新的Sale,2018/1/30,59,应用GRASP控制模式,2018/1/30,60,Sale和集合的创建,2018/1/30,61,Nextgen迭代的用例实现,如何设计enterItem选择控制类Register是否要显示商品项目的描述和价格忽略有关显示的设计创建新的SaleLineItementerItem契约的后置条件表明需要创建、初始化以及建立与SaleLineItem的关联通过在Sale的商品条目的集合中加入SalesLineItem的新实例,就可以在Sale与新创建的SalesLineItem实例间建立其关系,2018/1/30,62,Nextgen迭代的用例实现,如何设计enterItem寻找productDescriptionProductCatalog是实现查找ProductDescription职责的最佳候选者ProductCatalog的可见性Register可以向ProductCatalog发送getProductDescription这样的消息,2018/1/30,63,EnterItem交互图、动态视图,2018/1/30,64,和enterItem设计有关的部分DCD,静态视图,2018/1/30,65,Nextgen迭代的用例实现,如何设计EndSale选择控制类register设置Sale.isComplete计算销售总额设计Sale.gettotal,2018/1/30,66,完成商品项目的输入,2018/1/30,67,Sale.getTotal交互图,2018/1/30,68,在注解符号中展示方法,2018/1/30,69,Nextgen迭代的用例实现,makePayment创建Payment创建了Payment的实例p记录Sale的日志计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论