面向对象分析和设计讲座8设计与代码映射课件_第1页
面向对象分析和设计讲座8设计与代码映射课件_第2页
面向对象分析和设计讲座8设计与代码映射课件_第3页
面向对象分析和设计讲座8设计与代码映射课件_第4页
面向对象分析和设计讲座8设计与代码映射课件_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

第8讲设计与代码映射第8讲设计与代码映射内容可见性设计类图代码映射测试驱动开发与代码重构9/4/20232内容可见性8/3/202321.对可见性进行设计1.对可见性进行设计1.1目标确定四种可见性对设置可见性进行设计9/4/202341.1目标确定四种可见性8/3/202341.2可见性可见性Visibility是对象看到或引用其它对象的能力为了使发送者对象能够向接收者对象发送消息,发送者必须具有接收者的可见性,即发送者必须拥有对接收者对象的某种引用或指针9/4/202351.2可见性可见性Visibility是对象看到或引用其它:RegisterenterItem(itemID,quantity):ProductCatalogspec:=getSpecification(itemID){publicvoidenterItem(itemID,qty){...spec=catalog.getSpecification(itemID)...}}classRegister{...

privateProductCatalogcatalog;...}9/4/20236:RegisterenterItem(itemID,qu1.3四种可见性实现对象A到对象B的可见性通常有四种方式:属性可见性AttributeVisibility:B是A的属性参数可见性Parametervisibility:B是A方法中的参数局部可见性LocalVisibility:B是A中方法的局部对象(不是参数)全局可见性GlobalVisibility:B具有某种方式的全局可见性为了使对象A能够向对象B发送消息,对于A而言,B必须是可见的9/4/202371.3四种可见性实现对象A到对象B的可见性通常有四种方式:8(1)属性可见性这是一种相对持久地可见性:RegisterenterItem(itemID,quantity):ProductCatalogspec:=getSpecification(itemID){publicvoidenterItem(itemID,qty){...spec=catalog.getSpecification(itemID)...}}classRegister{...

privateProductCatalogcatalog;...}9/4/20238(1)属性可见性这是一种相对持久地可见性:Register(2)参数可见性这是一种相对暂时的可见性2:makeLineItem(spec,qty)enterItem(id,qty)1:spec:=getSpecification(id)2.1:create(spec,qty):Register:Sale:ProductCatalogsl:SalesLineItem{makeLineItem(ProductSpecification

spec,intqty){...sl=newSalesLineItem(spec,qty);...}}9/4/20239(2)参数可见性这是一种相对暂时的可见性2:makeLin将参数可见性转化为属性可见性十分常见2:makeLineItem(spec,qty)enterItem(id,qty)2:spec:=getSpecification(id)2.1:create(spec,qty):Register:Sale:ProductCatalogsl:SalesLineItem//initializingmethod(e.g.,aJavaconstructor){SalesLineItem(ProductSpecificationspec,intqty){...productSpec=spec;//parametertoattributevisibility...}}9/4/202310将参数可见性转化为属性可见性十分常见2:makeLineI(3)局部可见性实现局部可见性的两种常见方式:创建新的局部实例并将其分配给局部变量将方法调用返回的对象分配给局部变量:RegisterenterItem(itemID,quantity):ProductCatalogspec:=getSpecification(itemID){enterItem(id,qty){...//localvisibilityviaassignmentofreturningobjectProductSpecificationspec=catalog.getSpecification(id);...}}9/4/202311(3)局部可见性实现局部可见性的两种常见方式::Regis(4)全局可见性这是一种相对持久的可见性将实例分配给全局变量,这在某些语言如C++中是可能的9/4/202312(4)全局可见性这是一种相对持久的可见性8/3/2023121.4采用UML表示可见性:A:B1:msg():C2:msg():D3:msg()<<association>><<parameter>><<local>>:E4:msg()<<global>><<association>>isusedforattributevisibility9/4/2023131.4采用UML表示可见性:A:B1:msg():C2:2.生成设计类图2.生成设计类图2.1引言交互图完成后,有可能来定义软件类(接口)的描述设计类图(DesignClassDiagrams,DCD)9/4/2023152.1引言交互图完成后,有可能来定义软件类(接口)的描述8/2.2何时生成DCD实践中,交互图经常与DCD并行创建为了更清楚地说明DCD,我们选择了在交互图之后介绍DCD9/4/2023162.2何时生成DCD实践中,交互图经常与DCD并行创建8/32.3DCD例子RegisterenterItem(...)SaledateisComplete:BooleantimemakeLineItem(...)CapturesNavigability11Threesectionboxforclassdefinition.methods;thereareparameters,butunspecifiedtypeinformation9/4/2023172.3DCD例子RegisterenterItem(...)2.4DCD和UP术语设计类图描述了应用中的软件类和接口类,关联和属性接口,包括操作和常量方法属性类型信息可见性依赖UP并没有专门的“设计类图”UP定义了设计模型,包括交互,包和类图.在UP设计模型中的类图包含“设计类”9/4/2023182.4DCD和UP术语设计类图描述了应用中的软件类和2.5领域模型vs.设计模型类Register...endSale()enterItem(...)makePayment(...)SaledateisComplete:BooleantimemakeLineItem(...)CapturesRegisterSaledateisComplete:BooleantimeCapturessoftwareclass1111DomainModelDesignModelConcept;conceptualclass9/4/2023192.5领域模型vs.设计模型类Register...en2.6创建NextGenPOSDCD确定软件类并展示它们检查交互图并列出提到的所有类RegisterSaleProductCatalogProductSpecificationStoreSalesLineItemPayment9/4/2023202.6创建NextGenPOSDCD确定软件类并展示它们给这些类画类图,列出通过领域模型中识别出来,并在设计中采用的属性TheCashierisnotpresentinthedesignsinceforthecurrentiterationitisnotnecessarytomodelitinsoftware.9/4/202321给这些类画类图,列出通过领域模型中识别出来,并在设计中采用的添加方法名通过分析交互图,每一个类具有的方法可以确定:Register:Sale2:makeLineItem(spec,qty)Sale...makeLineItem(...)9/4/202322添加方法名:Register:Sale2:makeLineSalesLineItem-quantity+getSubtotal()ProductCatalog...+getSpecification(...)ProductSpecification-description-price-itemID...Store-address-name+addSale(...)Payment-amount...Register...+endSale()+enterItem(...)+makeNewSale()+makePayment(...)Sale-date-isComplete-time+becomeComplete()+makeLineItem(...)+makePayment(...)+getTotal()9/4/202323SalesLineItem-quantity+getSu2.7方法的命名一些注意点create消息的解释访问方法多对象消息与语言无关的语法9/4/2023242.7方法的命名一些注意点8/3/202324(1)方法名-create每一种语言有各自特定的实例化instantiation或者初始化initialization的方法在C++,它包含了通过跟随一个构造函数的new操作进行自动内存分配在Java中,它包含了对new运算符的调用,后面跟构造函数调用9/4/202325(1)方法名-create每一种语言有各自特定的实例化ins(2)Accessing方法获取或者设置属性我们可以将所有属性定义为私有,并对它们定义accessor和mutator这些方法一般在类图中不显示-9/4/202326(2)Accessing方法获取或者设置属性8/3/202(3)多对象给多对象的消息一般解释为发送给一个container/collection对象,例如JavaMap,aC++map或者SmalltalkDictionary1:spec:=getSpecification(id)1.1:spec:=find(id):ProductCatalog:ProductSpecificationThefindmessageistothecontainerobject,nottoaProductSpecification.9/4/202327(3)多对象给多对象的消息一般解释为发送给一个contain2.8增加更多的类型信息属性,方法参数和返回值的类型可以有选择的显示什么时候显示?取决于目的:CodeGenerationoronlyRead9/4/2023282.8增加更多的类型信息属性,方法参数和返回值的类型可以有选SalesLineItemquantity:IntegergetSubtotal():MoneyProductCatalog...getSpecification(id:ItemID):ProductSpecificationProductSpecificationdescription:Textprice:MoneyitemID:ItemID...Storeaddress:Addressname:TextaddSale(s:Sale)Paymentamount:Money...Register...endSale()enterItem(id:ItemID,qty:Integer)makeNewSale()makePayment(cashTendered:Money)Saledate:DateisComplete:Booleantime:TimebecomeComplete()makeLineItem(spec:ProdSpecification,qty:Integer)makePayment(cashTendered:Money)getTotal():MoneyReturntypeofmethodvoid;noreturnvalue9/4/202329SalesLineItemquantity:Intege2.9添加关联和方向关联的每一端称为一个角色,在DCD中,角色可以用方向箭头修饰9/4/2023302.9添加关联和方向关联的每一端称为一个角色,在DCD中,角CapturesRegistercurrentSale:SaleendSale()enterItem(...)makeNewSale()makePayment(...)SaledateisCompletetimebecomeComplete()makeLineItem(...)makePayment(...)getTotal()NavigabilityarrowindicatesRegisterobjectsareconnecteduni-directionallytoSaleobjects.AbsenceofnavigabilityarrowindicatesnoconnectionfromSaletoRegister.RegisterclasswillhaveanattributepointingtoaSaleobject.11thecurrentSaleattributeisoftenexcluded,asitisimpliedbythenavigableassociationfromRegistertoSale.9/4/202331CapturesRegistercurrentSale:关联上的方向箭头一般解释为从源到目标类的属性可见性在OOP中,它一般被实现为源类中有一个指向目标类对象的属性9/4/202332关联上的方向箭头一般解释为从源到目标类的属性可见性8/3/2一些需要定义从A指向B的方向性修饰的情形:A发送消息给BA创建B的实例A需要保持与B的连接9/4/202333一些需要定义从A指向B的方向性修饰的情形:8/3/20233方向性Navigability通过交互图来识别i:Store:Registerpc:ProductCatalogcreate()2:create(pc)1:create()1.2:loadProdSpecs():ProductSpecification1.1:create()1.2.2*:add(ps)1.2.1*:create(id,price,description)ps:ProductSpecification9/4/202334方向性Navigability通过交互图来识别i:StorSalesLineItemquantity:IntegergetSubtotal()ProductCatalog...getSpecification(...)ProductSpecificationdescription:Textprice:MoneyitemID:ItemID...Storeaddress:Addressname:TextaddSale(...)Paymentamount:Money...Contains1..*Contains1..*RegisterendSale()enterItem(...)makeNewSale()makePayment(...)Saledate:DateisComplete:Booleantime:TimebecomeComplete()makeLineItem(...)makePayment(...)getTotal()CapturesHousesUsesLooks-inPaid-byDescribes1111111111111*Logs-completed4*19/4/202335SalesLineItemquantity:Intege2.10添加依赖关系依赖关系表明一个元素(包括类,用例,等等)知道另外一个元素用虚线箭头表示在类图中,依赖关系可以表示非属性可见性,即:参数,全局或者局部可见性9/4/2023362.10添加依赖关系依赖关系表明一个元素(包括类,用例,等SalesLineItemquantity:IntegergetSubtotal()ProductCatalog...getSpecification(...)ProductSpecificationdescription:Textprice:MoneyitemID:ItemID...Storeaddress:Addressname:TextaddSale(...)Paymentamount:Money...Contains1..*Contains1..*Register...endSale()enterItem(...)makeNewSale()makePayment(...)Saledate:DateisComplete:Booleantime:TimebecomeComplete()makeLineItem(...)makePayment(...)getTotal()CapturesHousesUsesLooks-inPaid-byDescribes1111111111111*AdependencyofRegisterknowingaboutProductSpecification.Recommendedwhenthereisparameter,globalorlocallydeclaredvisibility.Logs-completed4*19/4/202337SalesLineItemquantity:Intege成员细节的表示SampleClassclassAttribute+publicAttribute-privateAttributeattributeWithVisibilityUnspecifiedattribute1:typeburgers:ListofVeggieBurgerattribute2:type=initialvaluefinalConstantAttribute:int=5{frozen}/derivedAttributeclassMethod()+玞onstructor?SampleClass(int)methodWithVisibilityUnspecified()methodReturnsSomething():FooabstractMethod()abstractMethod2(){abstract}//alternate+publicMethod()-privateMethod()#protectedMethod()~packageVisibleMethod()finalMethod(){leaf}methodWithoutSideEffects(){query}synchronizedMethod(){guarded}method1WithParms(inparm1:String,inoutparm2:int)method2WithParms(parm1:String,parm2:float)method3WithParms(parm1,parm2)method4WithParms(String,int)methodWithParmsAndReturn(parm1:String):FoomethodWithParmsButUnspecified(...):FoomethodWithParmsAndReturnBothUnspecified()java.awt.Fontplain:Integer=0{frozen}bold:Integer=1{frozen}name:Stringstyle:Integer=0...+getFont(name:String):Font+getName():String...java.awt.Toolkitorjava.awt.Toolkit{abstract}...//thereareattributes,butnotshown#createButton(target:Button):ButtonPeer+getColorModel():ColorModel...FinalClass{leaf}...//therearemethods,butnotshown玦nterface粆Runnablerun()AlarmClockrun()...anemptycompartmentwithoutellipsismeansthereisdefinitelynomembers(inthiscase,noattributes)9/4/202338成员细节的表示SampleClassclassAttribuDCD中方法体的表示Register...endSale()enterItem(id,qty)makeNewSale()makePayment(cashTendered){ProductSpecificationspec=catalog.getSpecification(id);sale.makeLineItem(spec,qty);}{publicvoidenterItem(id,qty){ProductSpecificationspec=catalog.getSpecification(id);sale.makeLineItem(spec,qty);}}UMLnotation:AmethodbodyimplementationmaybeshowninaUMLnotebox.Itshouldbeplacedwithinbraces,whichsignifiesitissemanticinfluence(itismorethanjustacomment).Thesynaxmaybepseudo-code,oranylanguage.Itiscommontoexcludethemethodsignature(publicvoid...),butitislegaltoincludeit.9/4/202339DCD中方法体的表示Register...endSale()9/4/2023408/3/2023403.将设计映射为代码3.将设计映射为代码3.1简介交互图和DCD可以作为代码生成过程的输入实现模型包括源代码,数据库定义,源代码,JSP/XML/HTML9/4/2023423.1简介交互图和DCD可以作为代码生成过程的输入8/3/23.2编程和开发过程现代方法:Design-while-programming但是我们经常在编程前进行可视化建模9/4/2023433.2编程和开发过程现代方法:Design-while-3.3在实现时候的创造性和变更设计中也包括决策和创新工作代码的生成=机械翻译过程?不完全对需要修改,详细的问题将出现并被解决9/4/2023443.3在实现时候的创造性和变更设计中也包括决策和创新工作8/3.4代码变更和迭代过程9/4/2023453.4代码变更和迭代过程8/3/2023453.5从DCD创建类的定义3.5从DCD创建类的定义定义带有方法和简单属性的类publicclassSalesLineItem{privateintquantity;publicSalesLineItem(ProductSpecificationspec,intqty){...}publicMoneygetSubtotal(){...}}SalesLineItemquantity:IntegergetSubtotal():MoneyProductSpecificationdescription:Textprice:MoneyitemID:ItemID...Described-by1*Itisderivedfromthecreate(spec,qty)messagesenttoaSalesLineItem9/4/202347定义带有方法和简单属性的类publicclassSale增加引用属性类的引用属性是依据类图中的关联和方向性来的SalesLineItemquantity:IntegergetSubtotal():MoneyProductSpecificationdescription:Textprice:MoneyitemID:ItemID...Described-bypublicclassSalesLineItem{privateintquantity;privateProductSpecificationproductSpec;publicSalesLineItem(ProductSpecificationspec,intqty){...}publicMoneygetSubtotal(){...}}*1SimpleattributeReferenceattribute9/4/202348增加引用属性类的引用属性是依据类图中的关联和方向性来的Sal引用属性和角色名字角色名字是角色的标识SalesLineItemquantity:IntegergetSubtotal():MoneyProductSpecificationdescription:Textprice:MoneyitemID:ItemID...Described-bypublicclassSalesLineItem{...privateintquantity;privateProductSpecificationproductSpec;}productSpecRolenameusedinattributename.*19/4/202349引用属性和角色名字角色名字是角色的标识SalesLineIt属性映射Saledate:DateisComplete:Booleantime:TimebecomeComplete()makeLineItem()makePayment()getTtotal()publicclassSale{privateDatedateTime=newDate();...}InJava,thejava.util.Dateclasscombinesbothdateandtimestampinformation.Therefore,theseparateattributesinthedesigncanbecollapsedwhenmappingtoJava.9/4/202350属性映射Saledate:DateisComplete3.6从交互图中创建方法消息的顺序被翻译成方法定义中的一系列声明2:makeLineItem(spec,qty)enterItem(id,qty)1:spec:=getSpecification(id)2.1:create(spec,qty)1.1:spec:=find(id):Register:Sale:ProductCatalogsl:SalesLineItemSalesLineItem:SalesLineItem:ProductSpecification2.2:add(sl)9/4/2023513.6从交互图中创建方法消息的顺序被翻译成方法定义中的一系列Pro

温馨提示

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

评论

0/150

提交评论