1、第二部分 面向对象系统分析与设计 第八讲主要内容:第14章-FROM REQUIREMENTS TO DESIGN IN THIS ITERATION 到目前为止,我们在分析案例时强调了需求调查,到目前为止,我们在分析案例时强调了需求调查,领域的概念以及与系统有关的操作。按照领域的概念以及与系统有关的操作。按照UPUP指导,可能指导,可能有有10%10%的重要需求在初始阶段调查,细化阶段第一次迭代的重要需求在初始阶段调查,细化阶段第一次迭代已稍微细致地进行了调查和分析。下来可以对这一部分已稍微细致地进行了调查和分析。下来可以对这一部分需求转入进行解决方案的设计。设计工作是借助于设计需求转入进行
2、解决方案的设计。设计工作是借助于设计软件对象间的协作来完成的。软件对象间的协作来完成的。主要思想 迭代地做正确的事情,所作的事情要正确。(需求分析)(系统设计)以对象(object)来进行设计。按对象设计的方案包括建立交互图(interaction diagrams)和设计类类图(design class diagrams)应用职责分配(assigning responsibilities)的原则和设计模式(design patterns)来建立交互图第15章-INTERACTION DIAGRAM NOTATION顺序图(Sequence Diagrams)和协作图(Collaboratio
3、n Diagrams)协作图(Collaboration Diagrams)顺序图(Sequence Diagrams)交互图(Interaction Diagrams)图:图:15.1 Collaboration diagram bamessage1()message2()message3()method1()b.method2()b.method3()method1()method2()method3()图:图:15.2 Sequence diagram.message1()message2()message3()协作图的例子:makePayment说明:消息makePament被发送给一
4、个Register的实例。没有指出发送者。Register的实例发送makePament消息给一个Sale的实例。Sale的实例创建一个Payment的实例。图:图:15.3 Collaboration diagram.makePayment(cashTendered)1:makePayment(cashTendered)1.1:create(cashTendered)图:图:15.4 Sequence diagram.:RegisterAn activation box showing the focus of control交互图表示法的公共部分/1表示类(classes)和实例(inst
5、ances)图:图:15.5 Class and instances.交互图表示法的公共部分/2基本的消息表达式The UML has a standard syntax for message expressions:return:=message(parameter:parameterType):returnType Type information may be excluded if obvious or unimportant.For example:spec:=getProductSpect(id)spec:=getProductSpect(id:ItemID)spec:=getP
6、roductSpect(id:ItemID)ProductSpecification 基本协作图的基本表示法连接线(Link)消息(Messages)发给自身的消息(Messages to“self”or This)实例创建(Creation of Instances)消息编号顺序(Message Number Sequencing)条件消息(Conditional Messages)互斥条件的路径(Mutually Exclusive Conditional Paths)迭代(Iteration or Looping)发给对象集中对象的消息迭代(Iteration Over a Collec
7、tion(Multiobject))发给类对象的消息(Messages to Class Object)图:图:15.6 Link lines.连接连接(Link)图:图:15.7 Messages.消息消息(Messages)图:图:15.8 Messages to this.发给自身的消息发给自身的消息(Messages to“self”or This)图:图:15.9 Instance creation.实例创建实例创建(Creation of Instances)图:图:15.10 a more complex case is shown.消息编号顺序消息编号顺序(Message Nu
8、mber Sequencing)图:图:15.11 Complex sequence numbering.消息编号顺序消息编号顺序(Message Number Sequencing)图:图:15.12 Conditional message.条件消息条件消息(Conditional Messages)图:图:15.13 Mutually exclusive messages.互斥条件的路径(互斥条件的路径(Mutually Exclusive Conditional Paths)图:图:15.14 Iteration.迭代(迭代(Iteration or Looping)图:图:15.15
9、Iteration over a multiobject.对象集的迭代(对象集的迭代(Iteration Over a Collection(Multiobject))图:图:15.16 Messages to a class object(static method invocation).类对象消息(类对象消息(Messages to Class Object)顺序图的基本表示法连接线(Links)-顺序图不用连接符号消息(Messages)表示消息返回(Illustrating Returns)发给自身的消息(Messages to“self”or This)实例创建(Creation
10、of Instances)对象生命线和对象销毁(Object Lifelines and Object Destruction)条件消息(Conditional Messages)互斥条件消息(Mutually Exclusive Conditional Messages)单一消息的迭代(Iteration for Single Message)一组消息的迭代(Iteration for a Series of Messages)发给对象集中对象的消息迭代(Iteration Over a Collection(Multiobject))发给类对象的消息(Messages to Class O
11、bject)图:图:15.17 Messages and focus of control with activation boxes.消息(消息(Messages)同步消息同步消息异步消息异步消息图:图:15.18 Showing returns.表示消息返回(表示消息返回(Illustrating Returns)消息返回消息返回图:图:15.19 Messages to this.发给自身的消息(发给自身的消息(Messages to“self”or This)图:图:15.20 Instance creation and object lifelines.实例创建(实例创建(Creat
12、ion of Instances)图:图:15.21 Object destruction 对象生命线和对象销毁(对象生命线和对象销毁(Object Lifelines and Object Destruction)图:图:15.22 A conditional message.条件消息(条件消息(Conditional Messages)图:图:15.23 Mutually exclusive conditional messages互斥条件消息(互斥条件消息(Mutually Exclusive Conditional Messages)图:图:15.24 Iteration for on
13、e message.单一消息的迭代(单一消息的迭代(Iteration for Single Message)图:图:15.25 Iteration for a sequence of 一组消息的迭代(一组消息的迭代(Iteration for a Series of Messages)图:图:15.26 Iteration over a multiobject 对象集的迭代(对象集的迭代(Iteration Over a Collection(Multiobject))图:图:15.27 Invoking class or static methods类对象消息(类对象消息(Messages
14、 to Class Object)第16章-GRASP:DESIGNING OBJECTS WITH RESPONSIBILITIES职责(Responsibility)和方法(Methods)UML定义职责定义职责(Responsibility)为为“一个类型的契约一个类型的契约或义务或义务(a contract or obligation of a classifier)”。方法方法(Method)用来实现(履行)职责。用来实现(履行)职责。一个职责可能要许多类和方法一个职责可能要许多类和方法(method)来实现,也来实现,也可能只要很少方法来实现,这是由职责的粒度可能只要很少方法来实现
15、,这是由职责的粒度(granularity)来决定的。来决定的。职责(Responsibility)可分成两类:“知道知道”型职责型职责(knowing)“做做”型职责(型职责(doing)“知道知道”私有的封装数据私有的封装数据“知道知道”相关联的对象相关联的对象“知道知道”能够派生或计算出的事物能够派生或计算出的事物“做做”自身的一些事情。如创建一个对象或进行一次计算。自身的一些事情。如创建一个对象或进行一次计算。“做做”其它对象的初始化操作。其它对象的初始化操作。控制和协调其它对象的活动。控制和协调其它对象的活动。职责(Responsibility)和交互图(Interaction Di
16、agrams):在在UML制品制品(artifacts)中,通常是在建中,通常是在建立交互图的语境来考虑对象的职责分配,立交互图的语境来考虑对象的职责分配,通过方法来实现职责。通过方法来实现职责。图:图:16.1 Responsibilities and methods are related.创 建创 建 P a y m e n t s 的 职 责 用的 职 责 用makePament(cashTendered)消息引用消息引用。意味着我们应该给意味着我们应该给Sale类设计一个类设计一个方法方法 makePament(cashTendered)实现创建实现创建Payments的职责。的职责
17、。图:图:16.2 Software classes illustrate method names.UML对软件类的表示法Saledate:Datetime:TimemakePayment(cashTendered)设计模式(Patterns)富有经验的面向对象技术专家(或其它软件开富有经验的面向对象技术专家(或其它软件开发人员)为解决某些问题而设计的解决方案,可作发人员)为解决某些问题而设计的解决方案,可作为通用原则为通用原则(General Principles)和惯用法和惯用法(Idioms),用,用于指导软件设计。于指导软件设计。如果将这些原则和惯用法以一种结构化的形式如果将这些原则
18、和惯用法以一种结构化的形式加以描述,给出问题和解决方案,然后起一个名字。加以描述,给出问题和解决方案,然后起一个名字。这就是这就是(Patterns)。例如:例如:模式名:信息专家(模式名:信息专家(Information ExpertInformation Expert)问题:为了获取某些信息,分配职责给对象的基本原则是什么?问题:为了获取某些信息,分配职责给对象的基本原则是什么?解决方案:将职责分配给信息专家解决方案:将职责分配给信息专家 -含有满足职责所需信息的类。含有满足职责所需信息的类。设计模式是一些针对特定问题的成功的解决方案设计模式是一些针对特定问题的成功的解决方案GRASP:分
19、配职责通用原则的模式 作为设计模式来描述对象设计和职责作为设计模式来描述对象设计和职责分配的基本原则。分配的基本原则。GRASPGRASP模式:模式:Information Expert Creator High Cohesion Low Coupling Controllereneral esponsibility ssignment oftware attern信息专家(Information Expert)信息专家(或专家)信息专家(或专家)为了获取某些信息,为了获取某些信息,分配职责给对分配职责给对象的基本原则是什么?象的基本原则是什么?将职责分配给信息专家将职责分配给信息专家 -含有
20、满足含有满足职责所需信息的类。职责所需信息的类。图:图:12.9 A partial domain model.我们指望从领域模我们指望从领域模型找出知道销售总型找出知道销售总金额有关信息的专金额有关信息的专家,这个专家可能家,这个专家可能是是Sale假设,某些类需要知假设,某些类需要知道一次销售道一次销售(Sale)的总的总金额。我们将这个职金额。我们将这个职责分配给谁?责分配给谁?图:图:16.3 Associations of Sale.图:图:16.4 Partial interaction and class diagrams.我们按领域模型的我们按领域模型的Sale概念类设计一个软
21、概念类设计一个软件类件类Sale,将分配给对象,将分配给对象:Sale的职责,实的职责,实现为类现为类Sale 的一个方法的一个方法getTotal()。我们按我们按Information Expert模模式,给对象式,给对象:Sale分配一个取分配一个取得总金额的职责得总金额的职责getTotal()。图:图:16.5 Calculating the Sale total 按领域模型的按领域模型的SalesLineItem概念概念类设计一个软件类类设计一个软件类SalesLineItem,将分配给对象将分配给对象:SalesLineItem的职的职责实现为类责实现为类SalesLineIte
22、m的方法的方法getSubtotal()。为了得到每个销售项的子金额,为了得到每个销售项的子金额,按按Information Expert模式,给模式,给对象对象:SalesLineItem分配职责分配职责getSubtotal()。图:图:16.6 Calculating the Sale total.按领域模型的按领域模型的ProductSpecification概念类设计概念类设计一个软件类一个软件类 ProductSpecification,将分配给,将分配给对象对象:ProductSpecification 的职责实现为类的职责实现为类 ProductSpecification的一个
23、方法的一个方法getPrice()。为了得到产品价格,为了得到产品价格,按按Information Expert模式,模式,给对象给对象:ProductSpecification,分配一个取得商品,分配一个取得商品价格的职责价格的职责getPrice()。结论:为了履行知道和回答销售总金额的职责,设结论:为了履行知道和回答销售总金额的职责,设计了知道相应信息的三个类(设计类),分配给它计了知道相应信息的三个类(设计类),分配给它们相应的职责。们相应的职责。设计类设计类职责职责SaleSaleSalesLineItemSalesLineItemPruductSpecificationPruduc
24、tSpecification知道销售总金额知道销售总金额知道销售项子计金额知道销售项子计金额知道商品价格知道商品价格创建者(Creator)创建者创建者谁负责创来建某个类的新的实例?谁负责创来建某个类的新的实例?如果以下一个或多个条件成立,则可如果以下一个或多个条件成立,则可以将创建类以将创建类A A的实例的职责分配给类的实例的职责分配给类B B。B B聚集了聚集了A A对象;对象;B B包含了包含了A A对象;对象;B B记录了记录了A A对象的实例;对象的实例;B B经常使用经常使用A A对象;对象;当当A A的实例被创建时,的实例被创建时,B B具有要传递给具有要传递给A A的初始的初始
25、化数据(也就是说,化数据(也就是说,B B是创建是创建A A的实例这项任务的的实例这项任务的信息专家)信息专家)图:图:16.7 Partial domain model.在在POS应用系统中,由谁负责创建应用系统中,由谁负责创建SalesLineItem的实例?按创建者模式,的实例?按创建者模式,从领域模型找到从领域模型找到Sale类包含(聚集)类包含(聚集)了了SalesLineItem类。类。Sale类可作为类可作为SalesLineItem实例的创建者。实例的创建者。图:图:16.8 Creating a SalesLineltem.实现时给实现时给Sale类定义一个方类定义一个方法法
26、makeLineItem,用于创建用于创建SalesLineItem的实例。的实例。Sale类聚集许多类聚集许多SalesLineItem的的对象,分配对象,分配makeLineItem,职责职责给给Sale用于创建用于创建SalesLineItem的的实例。实例。创建者模式的讨论创建者模式支持低耦合度创建者模式支持低耦合度,意味着具有较低的依意味着具有较低的依赖关系和较高的重用机会。因为被创建的类很可赖关系和较高的重用机会。因为被创建的类很可能早已经对创建者类可见(即在创建者类已有方能早已经对创建者类可见(即在创建者类已有方法涉及被创建者类),耦合程度不会增加。法涉及被创建者类),耦合程度不会增加。第八讲结束