1、上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-232w可见性可见性w设计类图设计类图w代码映射代码映射w测试驱动开发与代码重构测试驱动开发与代码重构上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-234w确定四种可见性确定四种可见性w对设置可见性进行设计对设置可见性进行设计上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-235w可见性可见性Visibility 是对象看到或引用其它对象的是对象看到
2、或引用其它对象的能力能力w为了使发送者对象能够向接收者对象发送消息,为了使发送者对象能够向接收者对象发送消息,发送者必须具有接收者的可见性,即发送者必须发送者必须具有接收者的可见性,即发送者必须拥有对接收者对象的某种引用或指针拥有对接收者对象的某种引用或指针上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-236: RegisterenterItem(itemID, quantity): ProductCatalogspec := getSpecification( itemID )public void enterItem( itemID, qty ) . spec
3、= catalog.getSpecification(itemID) .class Register . private ProductCatalog catalog; .上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-237w实现对象实现对象A到对象到对象B的可见性通常有四种方式的可见性通常有四种方式:n属性可见性属性可见性Attribute Visibility: B是是A的属性的属性n参数可见性参数可见性Parameter visibility: B是是A方法中的参数方法中的参数n局部可见性局部可见性Local Visibility: B是是A中方法的局部对象中
4、方法的局部对象(不是参数)(不是参数)n全局可见性全局可见性Global Visibility: B具有某种方式的全局可具有某种方式的全局可见性见性w为了使对象为了使对象A能够向对象能够向对象B发送消息,对于发送消息,对于A而而言,言,B必须是可见的必须是可见的上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-238w这是一种相对持久地可见性这是一种相对持久地可见性: RegisterenterItem(itemID, quantity): ProductCatalogspec := getSpecification( itemID )public void enter
5、Item(itemID, qty) . spec = catalog.getSpecification(itemID) .class Register . private ProductCatalog catalog; .上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-239w这是一种相对暂时的可见性这是一种相对暂时的可见性2: makeLineItem(spec, qty)enterItem(id, qty)1: spec := getSpecification(id)2.1: create(spec, qty):Register:Sale:ProductCatal
6、ogsl : SalesLineItemmakeLineItem(ProductSpecification spec, int qty) . sl = new SalesLineItem(spec, qty); .上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2310w将参数可见性转化为属性可见性十分常见将参数可见性转化为属性可见性十分常见2: makeLineItem(spec, qty)enterItem(id, qty)2: spec := getSpecification(id)2.1: create(spec, qty):Register:Sale:Pro
7、ductCatalogsl : SalesLineItem/ initializing method (e.g., a Java constructor)SalesLineItem(ProductSpecification spec, int qty).productSpec = spec; / parameter to attribute visibility.上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2311w实现局部可见性的两种常见方式实现局部可见性的两种常见方式:n创建新的局部实例并将其分配给局部变量创建新的局部实例并将其分配给局部变量n将方法调用返回的
8、对象分配给局部变量将方法调用返回的对象分配给局部变量: RegisterenterItem(itemID, quantity): ProductCatalogspec := getSpecification( itemID )enterItem(id, qty)./ local visibility via assignment of returning objectProductSpecification spec = catalog.getSpecification(id);.上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2312w这是一种相对持久的可见性这是一
9、种相对持久的可见性w将实例分配给全局变量,这在某些语言如将实例分配给全局变量,这在某些语言如C+中中是可能的是可能的上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2313:A:B1: msg():C2: msg():D3: msg():E4: msg()is used forattribute visibility上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2315w交互图完成后,有可能来定义软件类(接口)的交互图完成后,有可能来定义软件类(接口)的描述描述w设计类图(设计类图
10、(Design Class Diagrams,DCD)上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2316w实践中,交互图经常与实践中,交互图经常与DCD并行创建并行创建w为了更清楚地说明为了更清楚地说明DCD,我们选择了在交互图,我们选择了在交互图之后介绍之后介绍DCD上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2317RegisterenterItem(.)SaledateisComplete : BooleantimemakeLineItem(.)CapturesNavigability11Three section box f
11、orclass definition.methods; there are parameters, but unspecifiedtype information上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2318w设计类图描述了应用中的软件类和接口设计类图描述了应用中的软件类和接口n类,关联和属性类,关联和属性n接口,包括操作和常量接口,包括操作和常量n方法方法n属性类型信息属性类型信息n可见性可见性n依赖依赖wUP并没有专门的并没有专门的 “设计类图设计类图”wUP定义了设计模型,包括交互,包和类图定义了设计模型,包括交互,包和类图.w在在UP设计模型中的类图
12、包含设计模型中的类图包含“设计类设计类”上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2319Register.endSale()enterItem(.)makePayment(.)SaledateisComplete : BooleantimemakeLineItem(.)CapturesRegisterSaledateisComplete : BooleantimeCapturessoftware class1111Domain ModelDesign ModelConcept; conceptual class上海交通大学计算机科学与工程系上海交通大学计算机科
13、学与工程系2022-6-2320w确定软件类并展示它们确定软件类并展示它们n检查交互图并列出提到的所有类检查交互图并列出提到的所有类RegisterSaleProductCatalogProductSpecificationStoreSalesLineItemPayment上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2321w给这些类画类图,列出通过领域模型中识别出来,给这些类画类图,列出通过领域模型中识别出来,并在设计中采用的属性并在设计中采用的属性Register.SaledateisCompletetime.SalesLineItemquantity.Pro
14、ductCatalog.ProductSpecificationdescriptionpriceitemID.Storeaddressname.Paymentamount.The Cashier is not present in the design since for the current iteration it is not necessary to model it in software.上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2322w添加方法名添加方法名n通过分析交互图,每一个类具有的方法可以确定通过分析交互图,每一个类具有的方法可以确定:R
15、egister:Sale2: makeLineItem(spec, qty)Sale.makeLineItem(.)上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2323SalesLineItem- quantity+ getSubtotal()ProductCatalog.+ getSpecification(.)ProductSpecification- description- price- itemID.Store- address- name+ addSale(.)Payment- amount.Register.+ endSale()+ enterIte
16、m(.)+ makeNewSale()+ makePayment(.)Sale- date- isComplete- time+ becomeComplete()+ makeLineItem(.)+ makePayment(.)+ getTotal()上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2324w一些注意点一些注意点ncreate 消息的解释消息的解释n访问方法访问方法n多对象消息多对象消息n与语言无关的语法与语言无关的语法上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2325w每一种语言有各自特定的实例化每一种语言有各自特定的
17、实例化instantiation或或者初始化者初始化initialization的方法的方法n在在C+, 它包含了通过跟随一个构造函数的它包含了通过跟随一个构造函数的new操作进操作进行自动内存分配行自动内存分配n在在Java中中, 它包含了对它包含了对new 运算符的调用,后面跟构运算符的调用,后面跟构造函数调用造函数调用上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2326w获取或者设置属性获取或者设置属性n我们可以将所有属性定义为私有,并对它们定义我们可以将所有属性定义为私有,并对它们定义accessor和和mutatorw这些方法一般在类图中不显示这些方法一
18、般在类图中不显示-上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2327w给多对象的消息一般解释为发送给一个给多对象的消息一般解释为发送给一个container/collection 对象,例如对象,例如 Java Map, a C+ map 或者或者Smalltalk Dictionary1: spec := getSpecification(id)1.1: spec := find(id):ProductCatalog:ProductSpecificationThe find message is to thecontainer object, not to a
19、ProductSpecification.上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2328w属性,方法参数和返回值的类型可以有选择的显属性,方法参数和返回值的类型可以有选择的显示示w什么时候显示什么时候显示? 取决于取决于n目的目的: Code Generation or only Read上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2329SalesLineItemquantity : IntegergetSubtotal() : MoneyProductCatalog.getSpecification(id: ItemID)
20、: ProductSpecificationProductSpecificationdescription : Textprice : MoneyitemID : ItemID.Storeaddress : Addressname : TextaddSale(s : Sale)Paymentamount : Money.Register.endSale()enterItem(id : ItemID, qty : Integer)makeNewSale()makePayment(cashTendered : Money)Saledate : DateisComplete : Booleantim
21、e : TimebecomeComplete()makeLineItem(spec : ProdSpecification , qty : Integer)makePayment(cashTendered : Money)getTotal() : MoneyReturn type of methodvoid; no return value上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2330w关联的每一端称为一个角色,在关联的每一端称为一个角色,在DCD中,角色中,角色可以用方向箭头修饰可以用方向箭头修饰上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系
22、2022-6-2331CapturesRegistercurrentSale : SaleendSale()enterItem(.)makeNewSale()makePayment(.)SaledateisCompletetimebecomeComplete()makeLineItem(.)makePayment(.)getTotal()Navigability arrow indicatesRegister objects are connecteduni-directionally to Saleobjects.Absence of navigabilityarrow indicates
23、noconnection from Sale toRegister.Register class willhave an attribute pointing to aSale object.11the currentSaleattribute is oftenexcluded, as it isimplied by thenavigableassociation fromRegister to Sale.上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2332w关联上的方向箭头一般解释为从源到目标类的属关联上的方向箭头一般解释为从源到目标类的属性可见性性可见性w在在
24、OOP中中, 它一般被实现为源类中有一个指向目它一般被实现为源类中有一个指向目标类对象的属性标类对象的属性上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2333w一些需要定义从一些需要定义从A指向指向B的方向性修饰的情形的方向性修饰的情形:nA发送消息给发送消息给BnA创建创建B的实例的实例nA 需要保持与需要保持与B的连接的连接上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2334w方向性方向性Navigability 通过交互图来识别通过交互图来识别i:Store:Registerpc:ProductCatalogcreate()2:
25、 create(pc)1: create()1.2: loadProdSpecs():ProductSpecification1.1: create()1.2.2*: add(ps)1.2.1*: create(id, price, description)ps:ProductSpecification上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2335SalesLineItemquantity : IntegergetSubtotal()ProductCatalog.getSpecification(.)ProductSpecificationdescripti
26、on : Textprice : MoneyitemID : ItemID.Storeaddress : Addressname : TextaddSale(.)Paymentamount : Money.Contains1.*Contains1.*RegisterendSale()enterItem(.)makeNewSale()makePayment(.)Saledate : DateisComplete : Booleantime : TimebecomeComplete()makeLineItem(.)makePayment(.)getTotal()CapturesHousesUses
27、Looks-inPaid-byDescribes1111111111111*Logs-completed4*1上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2336w依赖关系表明一个元素(包括类,用例,等等)依赖关系表明一个元素(包括类,用例,等等)知道另外一个元素知道另外一个元素n用虚线箭头表示用虚线箭头表示w在类图中,依赖关系可以表示非属性可见性,即:在类图中,依赖关系可以表示非属性可见性,即:参数,全局或者局部可见性参数,全局或者局部可见性上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2337SalesLineItemquantit
28、y : IntegergetSubtotal()ProductCatalog.getSpecification(.)ProductSpecificationdescription : Textprice : MoneyitemID: ItemID.Storeaddress : Addressname : TextaddSale(.)Paymentamount : Money.Contains1.*Contains1.*Register.endSale()enterItem(.)makeNewSale()makePayment(.)Saledate : DateisComplete : Bool
29、eantime : TimebecomeComplete()makeLineItem(.)makePayment(.)getTotal()CapturesHousesUsesLooks-inPaid-byDescribes1111111111111*A dependency of Register knowing aboutProductSpecification.Recommended when there is parameter,global or locally declared visibility.Logs-completed4*1上海交通大学计算机科学与工程系上海交通大学计算机科
30、学与工程系2022-6-2338SampleClassclassAttribute+ publicAttribute- privateAttributeattributeWithVisibilityUnspecifiedattribute1 : typeburgers : List of VeggieBurgerattribute2 : type = initial valuefinalConstantAttribute : int = 5 frozen /derivedAttributeclassMethod()+ 玞onstructor?SampleClass(int)methodWith
31、VisibilityUnspecified()methodReturnsSomething() : FooabstractMethod()abstractMethod2() abstract / alternate+ publicMethod()- privateMethod()# protectedMethod() packageVisibleMethod()finalMethod() leaf methodWithoutSideEffects() query synchronizedMethod() guarded method1WithParms(in parm1:String, ino
32、ut parm2: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 fr
33、ozen name : Stringstyle : Integer = 0.+ getFont(name : String) : Font+ getName() : String.java.awt.Toolkitorjava.awt.Toolkit abstract . / there are attributes, but not shown# createButton(target : Button) : ButtonPeer+ getColorModel() : ColorModel.FinalClass leaf . / there are methods, but not shown
34、玦nterface粆Runnablerun()AlarmClockrun().an emptycompartmentwithout ellipsismeans there isdefinitely nomembers (inthis case, noattributes)上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2339Register.endSale()enterItem(id, qty)makeNewSale()makePayment(cashTendered) ProductSpecification spec = catalog.getSpecifica
35、tion(id); sale.makeLineItem(spec, qty);public void enterItem( id, qty ) ProductSpecification spec = catalog.getSpecification(id); sale.makeLineItem(spec, qty);UML notation:A method body implementation may be shown in a UML note box. It should be placed within braces, whichsignifies it is semantic in
36、fluence (it is more than just a comment).The synax may be pseudo-code, or any language.It is common to exclude the method signature (public void .), but it is legal to include it.上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2340Register. . .Saledate. . .1. . . . .Domain ModelUse-Case ModelDesign Model: Regi
37、sterenterItem(itemID, quantity): ProductCatalogspec := getSpecification( itemID ). . .inspiresthe namesandattributesof somesoftwareclasses inthe designmakeNewSale()Sample UP Artifact Relationships for Design Class DiagramsRegister.makeNewSale()enterItem(.).ProductCatalog.getSpecification(.).1*. . .
38、. . . .1Saledate.use-caserealizations(UCRs)designclassdiagrams(DCDs)the design classesdiscovered whiledesigning UCRs aresummarized in DCDsrequires UCRssuggests domainconcepts上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2342w交互图和交互图和DCD可以作为代码生成过程的输入可以作为代码生成过程的输入w实现模型包括源代码,数据库定义,
39、源代码,实现模型包括源代码,数据库定义,源代码, JSP/XML/HTML上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2343w现代方法现代方法: Design-while-programmingw但是我们经常在编程前进行可视化建模但是我们经常在编程前进行可视化建模上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2344w设计中也包括决策和创新工作设计中也包括决策和创新工作w代码的生成代码的生成 = 机械翻译过程机械翻译过程?n不完全对不完全对n需要修改,详细的问题将出现并被解决需要修改,详细的问题将出现并被解决上海交通大学计算机科学与工
40、程系上海交通大学计算机科学与工程系2022-6-2345RequirementsAnalysisDesignImplementationand TestingIterative Cyclesof DevelopmentRequirementsAnalysisDesignImplementationand TestingRequirementsAnalysisDesignImplementationand TestingTime上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2347public class S
41、alesLineItemprivate int quantity;public SalesLineItem(ProductSpecification spec, int qty) . public Money getSubtotal() . SalesLineItemquantity : IntegergetSubtotal() : MoneyProductSpecificationdescription : Textprice : MoneyitemID : ItemID.Described-by1*It is derived from the create(spec, qty) messa
42、ge sent to a SalesLineItem上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2348w类的引用属性是依据类图中的关联和方向性来的类的引用属性是依据类图中的关联和方向性来的SalesLineItemquantity : IntegergetSubtotal() : MoneyProductSpecificationdescription : Textprice : MoneyitemID : ItemID.Described-bypublic class SalesLineItemprivate int quantity;private Prod
43、uctSpecification productSpec;public SalesLineItem(ProductSpecification spec, int qty) . public Money getSubtotal() . *1Simple attributeReference attribute上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2349w角色名字是角色的标识角色名字是角色的标识SalesLineItemquantity : IntegergetSubtotal() : MoneyProductSpecificationdescription
44、: Textprice : MoneyitemID : ItemID.Described-bypublic class SalesLineItem.private int quantity;private ProductSpecification productSpec;productSpecRole name used inattribute name.*1上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2350Saledate : DateisComplete : Booleantime : TimebecomeComplete()makeLineItem()ma
45、kePayment()getTtotal()public class Saleprivate Date dateTime = new Date();.In Java, the java.util.Date class combines both dateand timestamp information. Therefore, the separateattributes in the design can be collapsed when mappingto Java.上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2351w消息的顺序被翻译成方法定义中的一系列声
46、明消息的顺序被翻译成方法定义中的一系列声明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)上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2352ProductCatalog
47、.getSpecification(.)Saledate : DateisComplete : Booleantime : TimebecomeComplete()makeLineItem(.)makePayment(.)getTotal()CapturesLooks-inRegister.endSale()enterItem(id: ItemID, qty : Integer)makeNewSale()makePayment(cashTendered : Money)public class Registerprivate ProductCatalog catalog;private Sal
48、e sale;public Register(ProductCatalog pc) .public void endSale() .public void enterItem(ItemID id, int qty) .public void makeNewSale() .public void makePayment(Money cashTendered) .1111上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-23532: makeLineItem(spec, qty)enterItem(id, qty)1: spec := getSpecification(id
49、):Register:Sale:ProductCatalog ProductSpecification spec = catalog.getSpecification(id); sale.makeLineItem(spec, qty);上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2354SalesLineItemquantity : IntegergetSubtotal()Contains1.*Saledate : DateisComplete : Booleantime : TimebecomeComplete()makeLineItem()makePaymen
50、t()getTtotal()public class Sale.private List lineItems = new ArrayList();A collection class is necessary tomaintain attribute visibility to all theSalesLineItems.1上海交通大学计算机科学与工程系上海交通大学计算机科学与工程系2022-6-2355w从从DCD翻译类的定义、从交互图翻译方法是比翻译类的定义、从交互图翻译方法是比较直接的过程较直接的过程w但是在编程阶段依旧有许多地方需要做决策,设但是在编程阶段依旧有许多地方需要做决策,设计