《高级结构建模》PPT课件.ppt

上传人:牧羊曲112 文档编号:5623755 上传时间:2023-08-03 格式:PPT 页数:100 大小:798.50KB
返回 下载 相关 举报
《高级结构建模》PPT课件.ppt_第1页
第1页 / 共100页
《高级结构建模》PPT课件.ppt_第2页
第2页 / 共100页
《高级结构建模》PPT课件.ppt_第3页
第3页 / 共100页
《高级结构建模》PPT课件.ppt_第4页
第4页 / 共100页
《高级结构建模》PPT课件.ppt_第5页
第5页 / 共100页
点击查看更多>>
资源描述

《《高级结构建模》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《高级结构建模》PPT课件.ppt(100页珍藏版)》请在三一办公上搜索。

1、对高级结构建模,Advanced Classes,可见性,Instance and Static Scope,Abstract,Leaf,and Polymorphic Elements,Multiplicity,Attributes,详述各个属性的可见性、范围和多重性详述各属性的类型、初始值和可变性,origin Name only+origin Visibility and nameorigin:Point Name and typename:String0.1 Name,type,and multiplicityorigin:Point=(0,0)Name,type,and initia

2、l valueid:Integerreadonly Name and property,Operations,详述各操作的可见性和范围详述各操作的参数、返回类型、并发语义和其他特性总体上,操作的名称加上它的参数(如果有的话,也包括返回类型)被称为操作的特征标记,操作和方法的区别操作详述了可以由类的任何一个对象请求以影响行为的服务方法是操作的实现类的每一个非抽象操作必须有一个方法,这个方法的主体是可执行的算法(一般用某种编程语言或结构化文本描述)在继承层次中,对于同一个操作可能有很多方法,并在运行时多态地选择层次结构中的哪一个方法被调用,displayName only+displayVisib

3、ility and nameset(n:Name,s:String)Name and parametersgetID():IntegerName and return typerestart()guardedName and property,在操作的特征标记中,可以不提供参数,也可以提供多个参数direction name:type=default-valuein 输入参数,不能对它进行修改out输出参数,为了向调用者传送信息可以对它进行修改inout输入参数,为了向调用者传送信息可以对它进行修改,已定义的可用于操作的特性query操作的执行不会改变系统的状态(完全没有副作用的纯函数)seq

4、uential 调用者必须在对象外部进行协调,以保证在对象中一次仅有一个流。在出现多控制流的情况下,不能保证对象的语义和完整性,guarded 通过将所有对象监护操作的所有调用顺序化,来保证在出现多控制流的情况下对象的语义和完整性。其效果是一次只能调用对象的一个操作,这又回到了顺序的语义static 操作没有关于目标对象的隐式参数,它的行为如同传统的全局过程,concurrent通过把操作原子化,来保证在出现多控制流的情况下对象的语义和完整性。来自并发控制流的多个调用可以同时作用于一个对象的任何一个并发操作,而所有操作都能以正确的语义并发进行。并发操作必须设计成:在对同一个对象同时进行顺序的或

5、监护的操作的情况下,它们仍能正确地执行,Template Classes,模板是一个被参数化的元素在诸如C+和Ada这样的语言中,可以写模板类,每一个模板类都定义一个类的家族(也可以写模板函数,每一个模板函数都定义一个函数的家族)模板可以包括类、对象和值的插槽,这些插槽起到模板参数的作用不能直接使用模板,必须首先对它进行实例化实例化是要把这些形式模板参数绑定成实际参数对一个模板类来说,绑定后的结果就是一个具体类,能够像普通类一样使用,JAVA中泛型,public abstract class Shape public abstract void draw();public class Rect

6、 extends Shapeimplements Serializable T m_left,m_top,m_width,m_height;public Rect(T left,T top,T width,T height).,public class Circle extends Shapeimplements Serializable T m_x,m_y,m_r;public Circle(T x,T y,T r).public class Stroke extends Shapeimplements Serializable W m_width;ArrayList m_ia;public

7、 Stroke(W width,ArrayList ia).,ArrayList sList=new ArrayList();sList.add(new Stroke();sList.add(new Rect();sList.add(new Circle();,ArrayList的实现(JDK1.5),public class ArrayList extends AbstractList implements List,RandomAccess,Cloneable,private transient E elementData;private int size;public ArrayList

8、(int initialCapacity)super();/check if(initialCapacity 0).this.elementData=(E)new ObjectinitialCapacity;public ArrayList()this(10);.,ArrayList的实现(JDK1.4),public class ArrayList extends AbstractList implements List,RandomAccess,Cloneable,private transient Object elementData;private int size;public Ar

9、rayList(int initialCapacity)super();/check if(initialCapacity 0).this.elementData=new ObjectinitialCapacity;public ArrayList()this(10);.,结构建模Advanced Relationships,高级依赖、泛化、关联、实现和精化关系对关系网建模创建关系网,为了捕获系统中的一些细节(为了避免设计中的实际缺陷,考虑这样的细节是重要的),就需要这些关系的一些高级特性,术语和概念,关系是事物之间的联系在面向对象的建模中,4种最重要的关系是依赖、泛化、关联和实现在图形上,把

10、关系画成线段,用不同种类的线段区别不同的关系,依赖,依赖是一种使用关系,它描述了一个事物的规约的变化可能会影响到使用它的另一个事物,但反之不然对于大多数所遇到的使用关系而言,简单的、未加修饰的依赖关系就足够了为了详述其含义的细微差别,UML定义了一些可以用于依赖关系的衍型这些衍型被组织成几组,首先,有一些可应用到类图中的类和对象之间的依赖关系上的衍型bind表明源用给定的实际参数实例化目标模板derive表明可以从目标计算出源permit表明源对目标给予特定的可见性instanceOf表明源对象是目标类目的一个实例。一般用文本形式source:Target来表示instantiate表明源创建

11、目标的实例,powertype表明目标是源的幂类型。幂类型是一个类目,其对象都是一个给定父类的子类对分类其他类的类建模时,要使用幂类型,refine表明源比目标处于更精细的抽象程度上use表明源元素的语义依赖于目标元素的公共部分的语义,以下两个衍型可以应用到包之间的依赖关系import表明目标包中的公共内容加入到源包的公共命名空间中,好像它们在源中已经声明过似的access表明目标包中的公共内容加入到源包的私有命名空间中。可以在源中使用这些内容的不带限定的名字,但不可以再输出它们,以下两种衍型用于用况间的依赖关系extend表明目标用况扩展了源用况的行为include表明源用况在源所指定的位置

12、上显式地合并了另一个用况的行为,在对象之间的交互语境中会遇到一种衍型:send表明源类发送目标事件当对向目标对象(它可能有相关联的状态机)发送给定事件的操作(例如,在与状态转移相关的动作中就有这样的操作)建模时,要使用发送(send)。发送依赖在效果上是把若干独立的状态机结合在一起,在把系统的元素组织成子系统和模型的语境中,要遇到的一个衍型是跟踪trace表明目标是源的早期开发阶段的祖先当对不同模型中的元素之间的关系建模时,要使用跟踪(trace),泛化,大多数情况下,单继承就足够用了一个类要合并多个类的特征,那么用多继承对这些关系建模更为合适,UML定义了可以应用到泛化关系上的4个约束:co

13、mplete 表明已经在模型中给出了泛化关系中的所有子类,不允许再有更多的子类incomplete 表明没有给出泛化中的所有子类,允许再增加子类,disjoint表明父类的对象最多以给定的子类中的一个子类作为类型overlapping表明父类的对象可能以给定的子类中的一个以上子类作为类型以上两个约束只应用于多继承语境中用互斥来表示一组类是相互不兼容的,一个子类不可继承该组中一个以上的父类用重叠来说明一个类能从这组类中一个以上的父类进行多继承,关联,有4种可应用到关联上的基本修饰:关联名、关联每一端的角色、关联每一端的多重性以及聚合对于高级用法,还有一些可用于对微妙的细节建模的特性,如导航、限定

14、和不同风格的聚合,导航,给定两个类之间的一个简单的、未加修饰的关联,从一个类的对象能够导航到另一个类的对象除非另有指定,否则关联的导航是双向的然而,有些情况要限制导航是单向,描述关联的走向未必意味着从关联的一端永远不能得到另一端的对象导航只是陈述了一个类对另一个类的知识描述一个关联是可导航的,是说给定关联一端的对象就能够容易并直接地得到另一端的对象,通常这是因为源对象存储了对目标对象的一些引用信息,可见性,给定两个类之间的关联,除非另有显式的导航声明所规定的限制,否则一个类的对象能够看见并导航到另一个类的对象然而,在有些情况下要限制关联外部的对象通过关联访问相关对象的可见性,在UML中,像处理

15、类的特征那样,通过对角色名添加可见性符号,可以在3个级别上描述关联端点的可见性除非有别的注解,否则角色的可见性是公共的私有的可见性表明,位于关联该端的对象对关联外部的任何对象来说都是不可访问的 保护的可见性表明,位于关联该端的对象对关联外部除了另一端的子孙之外的任何对象来说都是不可访问的包的可见性表明,在同一包中声明的类能够看见给定的元素,因此对关联端点不适用,限定,在关联的语境中,最常见的一种建模的惯用法是查找给定关联一端的对象,如何识别另一端的对象或对象集?例如,考虑对一个制造厂的工作台的建模问题,在工作台上对返回的工件进行修理,在UML中,用限定符来对这样的用法建模,该限定符是一个关联的

16、属性,它的值通过一个关联划分了与一个对象相关的对象的子集合(通常是单个对象)把限定符画成与关联的一端相连的小矩形,并把属性放于小矩形中源对象连同限定符的属性值确定了目标对象(若目标端的多重性最多为1)或对象集合(若目标端的多重性为多),组合,组合是聚合的一种形式,它具有强的拥有关系,而且整体与部分的生命周期是一致的带有非确定多重性的部分可以在组合物自身之后创建,但一旦创建,它们就同生共死。这样的部分也可以在组合物死亡之前显式地撤销,这意味着在组合式聚合中,一个对象在一个时间内只能是一个组合的一部分此外,在组合式聚合中,整体负责对它的各个部分的处置,这意味着整体必须管理它的部分的创建与撤销,关联

17、类,在两个类之间的关联中,关联本身可以有特性在UML中,把这种情况建模为关联类,关联类是一种既具有关联特性又具有类特性的建模元素可以把关联类看成是具有类特性的关联,或者看成具有关联特性的类,约束,UML定义了5种可以用于关联关系的约束首先,可以描述在关联一端的对象(多重性要大于1)是有序还是无序ordered表示关联一端的对象集是显式有序的,其次,可以描述在关联一端的对象是唯一的,即它们形成了集合,或者是不唯一的,即它们形成了袋(bag)set对象唯一,不可以重复bag对象不唯一,可以重复ordered set对象唯一且有序list or sequence对象有序但可以重复,最后,还有一种约束

18、限制了关联实例的可变性readonly 一旦从关联的另一端的对象添加了一个链,就不可以修改或删除。在没有这种约束的情况下,默认可变性为无约束,实现,实现是类目之间的语义关系,在该关系中一个类目描述了另一个类目保证实现的合约在图形上,把实现画成一条带有空心三角箭头的虚线并指向描述合约的那个类目,实现与依赖、泛化和关联很不相同,所以被处理成一种独立的关系实现是依赖和泛化在语义上的一些交叉,其表示法是依赖和泛化表示法的结合在接口的语境中和在协作的语境中都要用到实现关系,对关系网建模,当对复杂系统的词汇建模时,可能要遇到数十个(如果不是成百上千的话)类、接口、构件、结点和用况建立一个包围其中每个抽象的

19、清晰边界是困难的建立这些抽象之间的无数种关系更为困难,这要求在整体上对系统形成一个平衡的职责分布,并且各抽象是高内聚的,关系可得到表达,又是松耦合的,当对这些关系网建模时,要遵循如下策略:开始不要孤立地看问题。利用用况和脚本来驱使去发现一组抽象之间的关系一般要从呈现的结构关系开始建模。这些关系反应了系统的静态视图,而且是相当明确的接下来,识别使用一般/特殊关系的机会;使用多继承要有节制,只有在完成上述步骤后,才开始寻找依赖,它们一般表示语义连接的更精确的形式对各种关系,从其基本形式开始,只有在对表达意图绝对必要时,才应用高级特性要记住,不应该也不必要在一张图或视图内对一组抽象之间的所有关系建模

20、,而是通过考虑系统的不同视图来建立系统的关系,结构建模Object Diagrams,对象图对包含在类图中的事物的实例建模对象图显示了在某一时间点上一组对象以及它们之间的关系对象图用于对系统的静态设计视图或静态交互视图建模包括对某一时刻的系统快照建模,表示出对象集、对象的状态以及对象之间的关系,Contents,对象图是表示在某一时间点上一组对象以及它们之间的关系的图对象图一般包括:ObjectsLinks像所有的其他图一样,对象图可包含注解和约束,一般用法,在对系统的静态设计视图或静态交互视图建模时,通常使用对象图来为对象结构建模为对象结构建模涉及到在给定时刻抓取系统中的对象的快照对象图表示

21、了由交互图所表示的动态场景中的一个静态画面可以使用对象图来可视化、详述、构造和文档化系统中存在的实例以及它们之间的相互关系可以把动态行为和执行表示为一系列的画面,Modeling Object Structures,如果冻结一个运行的系统,或者只想象被建模的系统的某一瞬间,就会发现这样的一组对象:每个对象都处于一个特定的状态,并与其他对象有特定的关系可以用对象图来可视化、详述、构造和文档化这些快照的结构在使用对象图时,只能有意义地显示一组感兴趣的具体对象或原型对象。这就是所谓的为对象结构建模,即对象图显示了在某一时刻相互联系的一组对象,Modeling Object Structures,结构

22、建模Components,Components,interfaces,and realizationInternal structure,ports,parts,and connectors把子构件连接在一起对API建模,构件是系统中逻辑的并且可替换的部分,它遵循并提供对一组接口的实现好的构件用定义良好的接口来定义灵活的抽象,这样就可能容易地用新的兼容构件代替旧的构件接口是连接逻辑模型和设计模型的桥梁。例如,可以为逻辑模型中的一个类定义一个接口,而这同一个接口将延续到一些实现它的设计构件通过把构件上的端口连接在一起,接口允许用小的构件来建造对大构件的实现,可以把应用程序做成一个单一的大单元,但

23、是当需求改变时,它太僵化并很难修改也无法利用一些现有的功能对于软件系统的解决方法类似于电气系统:把程序做成可灵活连接起来的、定义良好的构件,当需求发生变化时,这些构件可以单独地替换,接口(Interface)是一组操作的集合,它指明了由类或构件所请求或者所提供的服务构件(Component)是系统中可替换的部分,它遵循并提供了一组接口的实现端口(port)是被封装的构件的特定窗口,遵循指定接口的构件通过它来收发消息内部结构(Internal structure)是靠以特定方式连接起来的一组部件来表示的构件实现部件(part)是对角色的描述,该角色组成构件的局部实现。在构件的实例中,有相应的部件

24、实例.连接件(connector)是在构件语境中的两个部件或者端口之间的通信关系,Components and Interfaces,接口是一组操作的集合,用于指明类或构件的一个服务构件和接口之间的关系是非常重要,几乎所有流行的构件模型(COM+、CORBA和Enterprise JavaBeans)都以接口作为把构件绑定在一起的粘合剂基于构件来构造系统,通过描述接口(表示系统中的主要接缝)来分解系统然后提供实现这些接口的构件和通过访问接口获得服务的其他构件这样的机制允许部署一个系统,它的服务在某种程度上独立的位置,而且可以替换的,Components and Interfaces,构件所实现

25、的接口称为供接口(provided interface),意思是构件向其他构件提供的作为一个服务的接口一个构件可以声明许多供接口构件所使用的接口称为需接口(required interface),意思是一个构件向其他构件请求服务时所遵从的接口一个构件可以遵从许多需接口一个构件可以既有供接口也有需接口,Components and Interfaces,构件可以有属性和操作,但在图中这些经常被省略构件可以表示内部结构可以用两种方式来表示构件和接口之间的关系第一种方式(最通用的)是用简略的图符形式表示接口第二种方式是用展开形式来表示,这种方式可以显示出接口的操作,Components and In

26、terfaces,Replaceability,所有基于构件的操作系统工具的基本目的都是允许用二进制可替换的制品来集成系统这就意味着可以用构件来设计系统,然后用制品来实现这些构件可以用添加新构件和替换老构件的方式来更新系统,而无须重新构造系统,接口是实现上述方法的关键在可执行的系统中,可以使用任何实现构件的制品,该构件提供或遵从指定的接口可以用以下方法扩展系统:使构件通过其他接口提供新的服务,而这些接口又能被其他构件发现和使用构件遵循或提供一组接口的实现,并使逻辑设计和基于其上的物理实现的可替换性成为可能,构件是可替换的一个构件可以用遵循相同接口的其他构件来替换在设计时期,你选择一个不同的构件

27、一般情况下,在运行时系统中插入或替换制品的机制对于构件使用者来说是透明的,它通过对象模型(例如COM+和Enterprise Java Beans)或通过自动实现这种机制的工具而成为现实,上述对象模型很少需要或根本不需要人为干预转换,构件是系统的一部分构件很少单独存在,相反,一个给定的构件通常与其他构件协作,并且存在于打算使用它的体系结构或技术语境中构件在逻辑上和物理上是内聚的,代表一个较大系统的有意义的结构和(或)行为块构件可以在多个系统中复用因此,构件表示了设计和组成系统的基础构造块这个定义是递归的,某个抽象层次上的系统可能是其他更高抽象层次上系统的一个构件最后,构件遵从一组接口并提供对这

28、组接口的实现,Organizing Components,以用组织类的方式来组织构件,用包将构件分组也可以通过描述构件之间的依赖、泛化、关联(包括聚合)和实现关系来组织构件构件可以由其他构件来构造,Ports,接口对构件的总体行为声明是十分的有用的,但它们没有个体的标识构件的实现只需要保证它的全部供接口的全部操作都被实现使用端口就是为了进一步控制这种实现,端口(port)是一个被封装的构件的对外窗口在封装的构件中,所有出入构件的交互都要通过端口构件对外可见的行为恰好是它端口的总和端口是有标识的,别的构件可以通过一个特定端口与一个构件通信,该通信完全是通过由端口支持的接口来描述的,即使这个构件也

29、支持其他的接口在实现时,构件的内部部件通过特定的外部端口来与外界交互,因此,构件的每个部件都独立于其他部件的需求端口允许把构件的接口划分成离散的并且可以独立使用的包端口提供的封装性和独立性更大程度上保证了构件的封装性和可替换性,端口被表示成跨立于构件边界上的方块它表示穿过构件的封闭边界的洞供接口和需接口都附着到端口符号上供接口表示一个可以通过那个端口来请求的服务需接口表示一个该端口需要从其他构件获得的服务每个端口都有一个名字,因此可以通过构件和端口名来唯一标识它构件内部的部件用端口名来识别要通过哪个端口接收和发送消息构件名和端口名合在一起唯一地标识了一个被其他构件使用的特定构件的特定端口,端口

30、是构件的一部分端口的实例随着它们所属构件的实例被创建和撤销端口也具有多重性,以指明在构件实例中特定端口实例的可能数目构件实例中的每一个端口都有一组端口实例虽然一组端口实例都满足同样的接口并接受同样的请求,但它们可能有不同的状态和数据值,Internal Structure,构件可以被作为一段单独的代码来实现,但是在一个大型系统中,理想的做法是用一些小的构件作为构造块来组建一些大构件构件的内部结构是一些小的部件,这些部件和它们之间的连接一起组合成构件的实现在许多情况下,内部部件可以是较小的构件的实例,它们静态地连接在一起,通过端口提供必要的行为而不需要建模者额外地描述逻辑,部件(part)是构件

31、的实现单元部件有名字和类型在构件实例中,每个部件有一个或多个实例对应于部件指明的类型,部件在其所在构件内有多重性如果一个部件的多重性数目大于1,就可能在一个给定的构件实例中有多于1个的部件实例如果多重性数目不是一个单一的整数,那么部件实例的个数可能在不同的构件实例中有所不同一个构件实例是和最小个数的部件一起创建的,以后再加入额外的部件,注意,部件和类是不同的每一个部件潜在地由其名字来区别同一类型的部件可能有多个,但是可以通过它们名字来区别,并且假定它们在构件中的功能也不同。例如在上图中Air Ticket Sales(航空售票)构件为常客和普通顾客提供了不同的sales(售票)部件,它们工作相

32、同,但常客部件是只为特殊顾客服务的,很少有需要排队的情况,而且还可能提供附加的额外补贴。因为这些构件的类型相同,所以必须用名字来区别它们。另外的两个类型为SeatAssignment和InventoryManagement的构件不需要名字,因为在航空售票构件中这两个类型都只有一个构件,如果部件是有端口的构件,可以通过端口把它们连接起来规则很简单:如果一个端口提供了一个给定的接口而另一个端口需要这个接口,那么这两个端口便是可连接的端口的连接意味着请求端口将调用提供端口来获得服务端口和接口的优点就是不需要了解其他的东西,如果接口是可兼容的,那么就可以连接端口工具能自动生成从一个构件到另一个构件的调

33、用代码如果有了新的构件,这些端口也可以改接到提供相同接口的其他构件上,两个端口之间的连线被称作连接件(connector)在整个构件的实例中,它表示一个链或一个暂时链链是普通关联的实例,暂时链表示两个构件之间的使用关系暂时链可能由作为操作目标的过程参数或局部变量来提供,而不是普通关联端口和接口的优点是在设计时两个构件不需要互相了解,只要它们的接口是相互兼容的就可以了,连接件有两种表示方式第一种:如果两个构件明确地捆绑在一起,无论是直接地还是通过端口,则只在它们之间或它们的端口之间画一条线即可第二种:如果两个构件相连是由于它们有能兼容的接口,则可以使用“托球一托座”表示法来表明构件之间没有固定的

34、关系,尽管是在构件内部连接的,可以用满足接口的其他构件来代替,也可以将内部端口连接到整体构件的外部端口上,这称为委派连接件,因为外部端口的消息被委派给内部端口。这可以用一个从外部端口指向内部端口的箭头来表示。对此可采取两种看法,第一种看法是把内部端口和外部端口同样对待,它已经被移到边界上并且可以通过它进行观察第二种看法是,任何传到外部端口的消息被立即传送到内部端口,反之亦然采用哪一种看法无关紧要,在两种情况下它们行为都是相同的,对结构类建模,结构类可用于对数据结构建模,这些数据结构中的部件仅在该类中有语义联系普通属性和关联可以定义一个类的组成部件,但是在普通类图中,这些部件不能彼此相连用部件和

35、连接件来表示类的内部结构则避免了这个问题,对结构类建模,要遵循以下策略:识别类的内部部件及其类型对每个部件给出一个名字来指明其在结构类中的用途,而不是给出它的一般类型在彼此间通信或有上下文关系的部件间画出连接件可以用其他结构类作为部件的类型,但是要记住,不能连接到另一个结构类内部的部件,要连接到它的外部端口上,Modeling an API,对于一个正在将构件组装成系统的开发者,会经常想看到把这些部件粘合到一起的应用程序编程接口(API)API代表系统中的程序接缝,可以用接口和构件对它建模API本质上是由一个或多个构件实现的接口作为开发者,实际上只需要考虑接口本身,只要有构件实现这个接口,则哪一个构件实现了接口操作是无关紧要的,对API建模,要遵循以下原则:识别系统中的接缝,将每个接缝建模为一个接口,并收集形成边界的属性和操作只显露那些对于在给定语境中进行可视化来说是比较重要的接口特性,隐藏那些不重要的特性,必要时可以将这些特性保存在接口的规约中作为参考仅当API对于展示特定实现的配置重要时,才对其实现建模,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号