




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象分析和设计讲座设计与代码映射内容可见性设计类图代码映射测试驱动开发与代码重构第2页,共55页,2024年2月25日,星期天1.对可见性进行设计第3页,共55页,2024年2月25日,星期天1.1目标确定四种可见性对设置可见性进行设计第4页,共55页,2024年2月25日,星期天1.2可见性可见性Visibility
是对象看到或引用其它对象的能力为了使发送者对象能够向接收者对象发送消息,发送者必须具有接收者的可见性,即发送者必须拥有对接收者对象的某种引用或指针第5页,共55页,2024年2月25日,星期天:RegisterenterItem(itemID,quantity):ProductCatalogspec:=getSpecification(itemID){publicvoidenterItem(itemID,qty){...spec=catalog.getSpecification(itemID)...}}classRegister{...
privateProductCatalogcatalog;...}第6页,共55页,2024年2月25日,星期天1.3四种可见性实现对象A到对象B的可见性通常有四种方式:属性可见性AttributeVisibility:B是A的属性参数可见性Parametervisibility:B是A方法中的参数局部可见性LocalVisibility:B是A中方法的局部对象(不是参数)全局可见性GlobalVisibility:B具有某种方式的全局可见性为了使对象A能够向对象B发送消息,对于A而言,B必须是可见的第7页,共55页,2024年2月25日,星期天(1)属性可见性这是一种相对持久地可见性:RegisterenterItem(itemID,quantity):ProductCatalogspec:=getSpecification(itemID){publicvoidenterItem(itemID,qty){...spec=catalog.getSpecification(itemID)...}}classRegister{...
privateProductCatalogcatalog;...}第8页,共55页,2024年2月25日,星期天(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页,共55页,2024年2月25日,星期天将参数可见性转化为属性可见性十分常见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...}}第10页,共55页,2024年2月25日,星期天(3)局部可见性实现局部可见性的两种常见方式:创建新的局部实例并将其分配给局部变量将方法调用返回的对象分配给局部变量:RegisterenterItem(itemID,quantity):ProductCatalogspec:=getSpecification(itemID){enterItem(id,qty){...//localvisibilityviaassignmentofreturningobjectProductSpecificationspec=catalog.getSpecification(id);...}}第11页,共55页,2024年2月25日,星期天(4)全局可见性这是一种相对持久的可见性将实例分配给全局变量,这在某些语言如C++中是可能的第12页,共55页,2024年2月25日,星期天1.4采用UML表示可见性:A:B1:msg():C2:msg():D3:msg()<<association>><<parameter>><<local>>:E4:msg()<<global>><<association>>isusedforattributevisibility第13页,共55页,2024年2月25日,星期天2.生成设计类图第14页,共55页,2024年2月25日,星期天2.1引言交互图完成后,有可能来定义软件类(接口)的描述设计类图(DesignClassDiagrams,DCD)第15页,共55页,2024年2月25日,星期天2.2何时生成DCD实践中,交互图经常与DCD并行创建为了更清楚地说明DCD,我们选择了在交互图之后介绍DCD第16页,共55页,2024年2月25日,星期天2.3DCD例子RegisterenterItem(...)SaledateisComplete:BooleantimemakeLineItem(...)CapturesNavigability11Threesectionboxforclassdefinition.methods;thereareparameters,butunspecifiedtypeinformation第17页,共55页,2024年2月25日,星期天2.4DCD和UP术语设计类图描述了应用中的软件类和接口类,关联和属性接口,包括操作和常量方法属性类型信息可见性依赖UP并没有专门的“设计类图”UP定义了设计模型,包括交互,包和类图.在UP设计模型中的类图包含“设计类”第18页,共55页,2024年2月25日,星期天2.5领域模型vs.设计模型类Register...endSale()enterItem(...)makePayment(...)SaledateisComplete:BooleantimemakeLineItem(...)CapturesRegisterSaledateisComplete:BooleantimeCapturessoftwareclass1111DomainModelDesignModelConcept;conceptualclass第19页,共55页,2024年2月25日,星期天2.6创建NextGenPOSDCD确定软件类并展示它们检查交互图并列出提到的所有类RegisterSaleProductCatalogProductSpecificationStoreSalesLineItemPayment第20页,共55页,2024年2月25日,星期天给这些类画类图,列出通过领域模型中识别出来,并在设计中采用的属性TheCashierisnotpresentinthedesignsinceforthecurrentiterationitisnotnecessarytomodelitinsoftware.第21页,共55页,2024年2月25日,星期天添加方法名通过分析交互图,每一个类具有的方法可以确定:Register:Sale2:makeLineItem(spec,qty)Sale...makeLineItem(...)第22页,共55页,2024年2月25日,星期天SalesLineItem-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()第23页,共55页,2024年2月25日,星期天2.7方法的命名一些注意点create
消息的解释访问方法多对象消息与语言无关的语法第24页,共55页,2024年2月25日,星期天(1)方法名-create每一种语言有各自特定的实例化instantiation或者初始化initialization的方法在C++,它包含了通过跟随一个构造函数的new操作进行自动内存分配在Java中,它包含了对new
运算符的调用,后面跟构造函数调用第25页,共55页,2024年2月25日,星期天(2)Accessing方法获取或者设置属性我们可以将所有属性定义为私有,并对它们定义accessor和mutator这些方法一般在类图中不显示-第26页,共55页,2024年2月25日,星期天(3)多对象给多对象的消息一般解释为发送给一个container/collection对象,例如JavaMap,aC++map或者SmalltalkDictionary1:spec:=getSpecification(id)1.1:spec:=find(id):ProductCatalog:ProductSpecificationThefindmessageistothecontainerobject,nottoaProductSpecification.第27页,共55页,2024年2月25日,星期天2.8增加更多的类型信息属性,方法参数和返回值的类型可以有选择的显示什么时候显示?取决于目的:CodeGenerationoronlyRead第28页,共55页,2024年2月25日,星期天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;noreturnvalue第29页,共55页,2024年2月25日,星期天2.9添加关联和方向关联的每一端称为一个角色,在DCD中,角色可以用方向箭头修饰第30页,共55页,2024年2月25日,星期天CapturesRegistercurrentSale:SaleendSale()enterItem(...)makeNewSale()makePayment(...)SaledateisCompletetimebecomeComplete()makeLineItem(...)makePayment(...)getTotal()NavigabilityarrowindicatesRegisterobjectsareconnecteduni-directionallytoSaleobjects.AbsenceofnavigabilityarrowindicatesnoconnectionfromSaletoRegister.RegisterclasswillhaveanattributepointingtoaSaleobject.11thecurrentSaleattributeisoftenexcluded,asitisimpliedbythenavigableassociationfromRegistertoSale.第31页,共55页,2024年2月25日,星期天关联上的方向箭头一般解释为从源到目标类的属性可见性在OOP中,它一般被实现为源类中有一个指向目标类对象的属性第32页,共55页,2024年2月25日,星期天一些需要定义从A指向B的方向性修饰的情形:A发送消息给BA创建B的实例A需要保持与B的连接第33页,共55页,2024年2月25日,星期天方向性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:ProductSpecification第34页,共55页,2024年2月25日,星期天SalesLineItemquantity: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*1第35页,共55页,2024年2月25日,星期天2.10添加依赖关系依赖关系表明一个元素(包括类,用例,等等)知道另外一个元素用虚线箭头表示在类图中,依赖关系可以表示非属性可见性,即:参数,全局或者局部可见性第36页,共55页,2024年2月25日,星期天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*1第37页,共55页,2024年2月25日,星期天成员细节的表示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)第38页,共55页,2024年2月25日,星期天DCD中方法体的表示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.第39页,共55页,2024年2月25日,星期天第40页,共55页,2024年2月25日,星期天3.将设计映射为代码第41页,共55页,2024年2月25日,星期天3.1简介交互图和DCD可以作为代码生成过程的输入实现模型包括源代码,数据库定义,源代码,JSP/XML/HTML第42页,共55页,2024年2月25日,星期天3.2编程和开发过程现代方法:Design-while-programming但是我们经常在编程前进行可视化建模第43页,共55页,2024年2月25日,星期天3.3在实现时候的创造性和变更设计中也包括决策和创新工作代码的生成=机械翻译过程?不完全对需要修改,详细的问题将出现并被解决第44页,共55页,2024年2月25日,星期天3.4代码变更和迭代过程第45页,共55页,2024年2月25日,星期天3.5从DCD创建类的定义第46页,共55页,2024年2月25日,星期天定义带有方法和简单属性的类publicclassSalesLineItem{privateintquantity;publicSalesLineItem(ProductSpecificationspec,intqty){...}publicMoneygetSubtotal(){...}}SalesLineItemquantity:IntegergetSubtotal():MoneyProductSpecificationdescription:Textprice:MoneyitemID:ItemID...Described-by1*Itisderivedfromthecreate(spec,qty)messagesenttoaSalesLineItem第47页,共55页,2024年2月25日,星期天增加引用属性类的引用属性是依据类图中的关联和方向性来的SalesLineItemquantity:IntegergetSubtotal():MoneyProductSpecificationdescription:Textprice:MoneyitemID:ItemID...Described-bypublicclassSalesLineItem{privateintquantity;privateProductSpecificationproductSpec;publicSalesLineItem(ProductSpecificationspec,intqty){...}publicMoneygetSubtotal(){...}}*1SimpleattributeReferenceattribute第48页,共55页,2024年2月25日,星期天引用属性和角色名字角色名字是角色的标识SalesLineItemquantity:IntegergetSubtotal():MoneyProductSpecificationdescription:Textprice:MoneyitemID:ItemID...Described-bypublicclassSalesLineItem{...privateintquantity;privateProductSpecificationproductSpec;}productSpecRolenameusedinattributename.*1第49页,共55页,2024年2月25日,星期天属性映射Saledate:DateisComplete:Booleantime:TimebecomeComplete()makeLineItem()makePayment()getTtotal()publicclassSale{privateDatedateTime=newDate();...}InJava,thejava.util.Dateclasscombinesbothdateandtimestampinformation.Therefore,theseparateattributesinthedesigncanbecollapsedwhenmappingtoJava.第50页,共55页,2024年2月25日,星期天3.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:SalesLineItem
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论