用例规约:用例的文字描述,用例的核心进行用例阐述o成功场景(正常事件流的描述)o扩展场景(备选事件流)o约束等o需要解决的问题类图以反映类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法类图中的“类”与面向对象语言中的“类”的概念是对应的,是对现实世界中的事物的抽象从上到下分为三部分,分别是类名、属性和操作。类名是必须有的类如果有属性,则每一个属性都必须有一个名字,另外还可以有其它的描述信息,如可见性、数据类型、缺省值等类如果有操作,则每一个操作也都有一个名字,其它可选的信息包括可见性、参数的名字、参数类型、参数缺省值和操作的返回值的类型等Account-balance:double=1+Deposit(amount:double):int+ComputeInterest():double可见性-代表private+代表public#代表protected也可以使用图形表示返回值类型操作名称斜体为抽象操作缺省值类名斜体为抽象类属性名称参数列表Employee+employeeID:Integer-Employeename:String….+setEmployeeDetails()+getEmployeeDetails()-setSalary(salary:Float)#getSalary():Float….WashingMachineBrandnameModelnameSerialnumberCapacityAddclothes()Adddetergent()Removeclothes()Takedirtyclothesasinputandproducecleanclothesasoutput类名类的属性类的操作类的职责职责指类承担的责任和义务。在矩形框中最后一栏中写明类的职责。斜体为抽象类接口:一组操作的集合,只有操作的声明而没有实现抽象类:不能被实例化的类,一般至少包含一个抽象操作模版类:一种参数化的类,在编译时把模版参数绑定到不同的数据类型,从而产生不同的类Shape(标准图形)Shape+Draw()(变体图形)接口Vehicle-fMaxSpeed:float+Start():int+Stop():int抽象类模版参数模版类(1)关联关系描述了类的结构之间的关系。具有方向、名字、角色和多重性等信息。一般的关联关系语义较弱。也有两种语义较强,分别是聚合与组合UML表示法角色类的角色是“事物“多重性(用数字和*表示)1…*:1个或多个1个类图有1个或多个类1个类属于1个或多个类图ClassDiagramClass+thing+diagram1..*1..*use1..*1..*方向双向关联(省略箭头)名字关系的名字是“使用”实例不带箭头也可以ManagerCompanyWorksForManagerCompanyEmployeeEmployerFourWheeledVehicleDoor14聚合关系:特殊关联关系,指明一个聚集(整体)和组成部分之间的关系组合关系:语义更强的聚合,部分和整体具有相同的生命周期UML表示法UML表示法ThingClassDiagramRelation(空心菱形)实例类图包含有事物和关系,类图不存在了,事物和关系还可用于其它的类图ClassAssociation(实心菱形)实例类与关联关系之间有组合关系,类不存在了,则相应的关联关系也不存在FourWheeledVehicleDoor14SeatWheel42..5BuildingBulidingnameNumberofFloorssetName()setNumberofFloors()FloorfloorNumberNumberofRoomsgetFloorNumber()getNumberofRooms()RoomroomNumberroomLocationgetRoomNumber()getRoomLocation()112118(2)泛化关系在面向对象中一般称为继承关系,存在于父类与子类、父接口与子接口之间UML表示法RelationAssociationGeneralizationRealizationDependency关联、泛化、实现、依赖都是一种关系ThingClassInterface类、接口都是一种事物EmployeeClericalStaffSoftwareEngineerManagerSalesManagerProductionManager(3)实现关系对应于类和接口之间的关系UML表示法类Circle、Rectangle实现了接口Shape的操作Shape+Draw()Circle+Draw()Rectangle+Drarw()(4)依赖关系描述了一个类的变化对依赖于它的类产生影响的情况。有多种表现形式,例如绑定(bind)、友元(friend)等UML表示法模板类StackT定义了栈相关的操作;IntStack将参数T与实际类型int绑定,使得所有操作都针对int类型的数据类Memento和类Originator建立了友元依赖关系,以便Originator使用Memento的私有变量stateC++代码classVehicle{public:virtualintStart()=0;virtualintStop()=0;virtualintRun(floatfSpeed)=0;private:floatfMaxSpeed;};Java代码publicabstractclassVehicle{publicabstractintStart();publicabstractintStop();publicabstractintRun(floatfSpeed);privatefloatfMaxSpeed;}Vehicle{abstract}-fMaxSpeed:float+++Start()Stop()Run(floatfSpeed):int:int:intC++代码classDialog{private:ButtonbtnOK;ButtonbtnCancel;TextBoxtxtInfo;};classButton{};classTextBox{};组合关系,代码表现为Dialog的属性有Button和TextBox的对象TextBoxButtonDialog-btnOK:Button-btnCancel:Button-txtInfo:TextBoxJava代码publicclassSavingsAccountextendsAccount{}C++代码classSavingsAccount:publicAccount{};C++代码classShape{public:virtualvoidDraw()=0;};classCircle:publicShape{public:voidDraw();private;PointptCenter;intnRadius;};Java代码publicinterfaceShape{publicabstractvoidDraw();}publicclassCircleimplementsShape{publicvoidDraw();privatePointptCenter;privateintnRadius;}Shape+Draw()Circle--ptCenternRadius:Point:int+Draw()Rectangle---ptUpperLeftnWidthnHeight:Point:int:int+Drarw()在C++语言里面,使用抽象类代替接口,使用泛化关系代替实现关系在Java语言里面,有相应的关键字interface、implements绑定依赖TStack-size:int+Push(elem:T):int+Pop():int+GetTop():constT&IntStackFloatStackbindbindC++代码templatetypenameTclassStack{private:intsize;public:intPush(Telem);intPop();constT&GetTop();};typedefStackfloatFloatStack;C++代码(编译器生成)classFloatStack{private:intsize;public:intPush(floatelem);intPop();constfloat&GetTop();};1)分析问题域,确定需求;2)寻找类,确定类的含义和职责;3)定义类的属性和操作;4)确定类之间的关系;5)精化类和类间的关系;6)绘制类图。使用名词/动词寻找类:1)收集相关信息补充的需求规格说明用例项目说明文档其他文档2)分析信息名词、名词短语类或属性动词、动词短语操作使用CRC分析法寻找类:C-class(类)R-responsibility(职责)C-collaboration(协作)CRC分析法是根据类所要扮演的职责来确定类。1)脑力风暴收集信息。2)关键业务用类表示,其它卡片作为属性。李小平是一个爱书之人,家里各类书籍已过千册,而平时又时常有朋友外借,因此需要一个个人图书管理系统。该系统应该能够将书籍的基本信息按计算机类、非计算机类分别建档,实现按书名、作者、类别、出版社等关键字的组合查询功能。在使用该系统录入新书籍时系统会自动按规则生成书号,可以修改信息,但一经创建就不允许删除。该系统还应该能够对书籍的外借情况进行记录,可对外借情况列表打印。另外,还希望能够对书籍的购买金额、册数按特定时间周期进行统计。李小平是一个爱书之人,家里各类书籍已过千册,而平时又时常有朋友外借,因此需要一个个人图书管理系统。该系统应该能够将书籍的基本信息按计算机类、非计算机类分别建档,实现按书名、作者、类别、出版社等关键字的组合查询功能。在使用该系统录入新书籍时系统会自动按规则生成书号,可以修改信息,但一经创建就不允许删除。该系统还应该能够对书籍的外借情况进行记录,可对外借情况列表打印。另外,还希望能够对书籍的购买金额、册数按特定时间周期进行统计。“李小平”、“人”、“家里”很明显是系统外的概念,无须对其建模;而“个人图书管理系统”、“系统”指的就是将要开发的系统,即系统本身,也无须对其进行建模;很明显“书籍”是一个很重要的类,而“书名”、“作者”、“类别”、“出版社”、“书号”则都是用来描述书籍的基本信息的,因此应该作为“书籍”类的属性处理,而“规则”是指书号的生成规则,而书号则是书籍的一个属性,因此“规则”可以作为编写“书籍”类构造函数的指南。“基本信息”则是书名、作者、类别等描述书籍的基本信息统称,“关键字”则是代表其中之一,因此无需对其建模;“功能”、“新书籍”、“信息”、“记录”都是在描述需求时使用到的一些相关词语,并不是问题域的本质,因此先可以将其淘汰掉;“计算机类”、“非计算机类”是该系统中图书的两大分类,因此应该对其建模,并改名为“计算机类书籍”和“非计算机类书籍”,以减少歧义;“外借情况”则是用来表示一次借阅行为,应该成为一个候选类,多个外借情况将组成“外借情况列表”,而外借情况中一个很重要的角色是“朋友”—借阅主体。虽然到本系统中并不需要建立“朋友”的资料库,但考虑到可能会需要列出某个朋友的借阅情况,因此还是将其列为候选类。为了能够更好地表述,将“外借情况”改名为“借阅记录”,而将“外借情况列表”改名为“借阅记录列表”;“购买金额”、“册数”都是统计的结果,都是一个数字,因此不用将其建模,而“特定时限”则是统计的范围,也无需将其建模;不过从这里的分析中,我们可以发现,在该需求描述中隐藏着一个关键类—书籍列表,也就是执行统计的主体。在使用“名词动词法”寻找类的时候,很多团队会在此耗费大量的时间,特别是对于中大型项目,这样很容易迷失方向。其实在此