信息系统分析与设计InformationSystemAnalysisandDesign1/62内容9信息系统分析与设计InformationSystemAnalysisandDesign2/62编程简介实现类图编程序列图信息系统分析与设计InformationSystemAnalysisandDesign3/62简介-1目的这部分的内容不是给你在编程方面的快速课程,而是为了演示我们已经建立的一些模型是如何映射到代码。我们不解释每条指令。代码的讨论涉及它同类图和序列图的关系。对于类图,我们讨论哪些行代码是实现类、类的属性、方法和关系的。我们利用序列图作为线路图来指导我们实现程序指令被执行的序列。其它的代码讨论局限于解释没有在早期模型中表示的定义特性。信息系统分析与设计InformationSystemAnalysisandDesign4/62简介-2内容系统用Java语言实现。它也被我们已经在建立UML模型时使用的CASE工具支持。为了简洁,产生的代码仅仅是Wheels系统实现的部分:‘Issuebike’用例的一个场景。代码局限于处理一位顾客租借一辆自行车。这意味着一些方法,例如Payment的方法calculateTotalPayment()似乎是无用的,因为它是设计用来处理多辆自行车租赁的。因为我们要求代码是为了表述的目的,因而简单代码比全部功能的代码更重要。信息系统分析与设计InformationSystemAnalysisandDesign5/62简介-3方法诸如引用其它类的细节已经添加到类。因此,我们忽略了在分析模型中表示的一些属性和方法。这允许我们保持图表在可管理的大小内。从现在起我们称方法methods而不是操作operations;这在此阶段是合适的,因为程序员是关注实现一个过程的代码部分。在早期我们谈论操作而不是方法,因为分析和设计活动更关注过程的界面,而不是它的实现。信息系统分析与设计InformationSystemAnalysisandDesign6/62实现类图-1类图实现在图9.1中的实现类图最初是根据代码由CASE工具产生的。它表示了完整的实现细节,即属性、方法参数(带类型和返回值)、以及方法返还类型的可见性、类型和初始值。为了生成类图的目的,即忽略gets和sets方法,简单地设置或返回属性的值。例如,Customer有三个get方法,getCustomerNumber()、getName()和getPostcode(),它们都没有在类图中显示。信息系统分析与设计InformationSystemAnalysisandDesign7/62实现类图-2起始类(StartUp)类StartUp是一个新类。Java应用必须总有一个main()方法;当Java应用运行时,它总是第一个执行的方法。在包括main()的Java每个方法必须在一个类中;因此,我们建立StartUp类的原因部分是为了放置main()。StartUp建立的另一个原因是模拟,如果这部分代码是带有欢迎菜单和其它显示界面层的整个可执行系统的一部分时,它模拟将会发生什么。这个类有效地模拟了在图9.2中序列图建模的接待员的功能。四个方法调用,showBikeDetails()、calculateCost()、newCust()和calcTotals(),原来由Receptionist发送到:IssueBikeUI,现在由StartUp发送。信息系统分析与设计InformationSystemAnalysisandDesign8/62实现类图-3IssueBikeUI类这个类结合了控制类和界面类的功能。它的前四个属性chosenBike、customer、payment和hire都被用来存放IssueBikeUI需要交互的对象的对象标识符(或引用)。这些属性被用来实现在类图中表示的由IssueBikeUI发出的单向导航路径。最后的属性numberOfDays存放租借的时间长短。当calculateCost(numDays)被调用时它被设置,随后被用作Hire产生的参数。信息系统分析与设计InformationSystemAnalysisandDesign9/62实现类图-4Payment类这是同分析模型中建立的Payment类相同的实体类,仅仅是为了简单,省略了一些属性。属性:Customer用来存放对一个Customer对象的引用;这允许每一个Payment对象被联接到正确的Customer对象。它实现了在类图中表示的到Customer类的单向导航。paymentId被用来存放惟一标识每个:Payment的数字。这个数字是一个整数,不像一个引用(或对象标识符)仅被计算机使用,该数字能被人阅读和理解。信息系统分析与设计InformationSystemAnalysisandDesign10/62实现类图-5Payment类(续)属性:(续)paymentCount是一个类变量,其允许应用赋值一个数字,该数字惟一标识每个:Payment(paymentId)。每次一个新的Payment对象产生,它就被更新。Payment(cust:Customer)是一个构造器。当调用时,它产生一个新的Payment对象,并将其关联到:Customer引用,该引用被作为参数传递。calculateTotalPayment(hire:Hire)设计用于为一位租借多辆自行车的顾客计算出总的费用。因为在这个实现中,仅有一位顾客租借一辆自行车的情况,因此,本方法仅部分实现;calculateTotalPayment()调用私有方法issueReceipt()。issueReceipt(hire:Hire)打印一张收据。注意在类图中这个方法前面是一个负号,表示其是一个私有方法。这意味着它仅能被Payment类的实例所使用。信息系统分析与设计InformationSystemAnalysisandDesign11/62实现类图-6Bike类Bike类结合了Bike实体类,以及一个有所有:Bike标识符的清单的集合类。为了简化,我们已经限制了Bike属性仅有deposit、rate和bikeNumber。方法Methods:Bike(dep:int,rat:int,num:int)是一个构造器。当调用时,它产生一个新的Bike对象,并将其属性设置成传递的参数值。findBikeByNumber(bikeNum:int)是集合类功能的一部分;它在表:Bikes中搜寻,直到找到一个带有相同自行车编号的自行车。showDetail()用来显示由findBikeByNumber()发现的自行车的细节calculateCost(numberOfDays:int)计算出自行车租借一段时间的费用。信息系统分析与设计InformationSystemAnalysisandDesign12/62实现类图-7Customer类Customer类是同分析模型中定义相同的实体类。同Payment对象类似,每一个:Customer有一个惟一的customerId,其是由类变量customerCount产生的。为了简单,我们利用邮政编码代替完整的地址。虽然在代码中有三个get方法,但在这个模型中仅表示的方法是一个构造器。Hire类Hire类是同分析模型中定义相同的实体类。同Payment和Customer对象类似,每一个:Hire有一个惟一的hireId,其是由类变量hireCount产生的。属性customer和bike被用来存放对Customer和Bike对象的引用。虽然在它有四个get方法,但在图中仅表示的方法是一个构造器。信息系统分析与设计InformationSystemAnalysisandDesign13/62编程-1StartUp类StartUp类的类图在图9.3中表示,StartUp类的代码在图9.4中表示。代码的行01声明StartUp是在一个名称为bikeshop的包内(如同在代码中所有的类一样)。StartUp类声明是在行05。在类中的每一内容必须用波形括号{}括起来,这个括号告诉编译器类的开始和结束的地方。左括号在行05,右括号在行27。main()方法是在行07声明。这个方法的所有程序指令被放在第二个波形括号中,左括号在行07,右括号在行26。在main()中的第一条指令产生一个IssueBikeUI对象ui(行13),其后四条指令是对IssueBikeUI对象的调用。这四条指令实现在‘Issuebike’用例场景中的主要步骤。信息系统分析与设计InformationSystemAnalysisandDesign14/62编程-2IssueBikeUI类IssueBikeUI类的类图在图9.5中表示,其代码在图9.6中表示。IssueBikeUI类在行34声明属性(也被称为方法的变量)37-41声明。showBikeDetails(bikeNum:int):void方法在行42声明,这个方法调用在Bike类中的findBikeByNumber(bikeNum)。findBikeByNumber(bikeNum)反复搜寻它的bike对象数组,直到它发现一个匹配的自行车编号(一个同参数值bikeNum匹配的)。匹配自行车的引用(对象标识符)被返回,并被赋给属性chosenBike。这个引用然后被用来传送消息showDetails()到匹配的自行车。信息系统分析与设计InformationSystemAnalysisandDesign15/62编程-3IssueBikeUI类(续)其余的方法声明是:+calculateCost(numDays:int):void在行50+createCustomer(name:String,postcode:String,tel:int):void在行57+calculateTotalPayment():void在行64注意所有这些方法是公有的(public),即它们能被任何对象调用。方法createCustomer()实际上产生一个Hire对象、一个Customer对象和一个Payment对象。信息系统分析与设计InformationSystemAnalysisandDesign16/62编程-4Bike类Bike类的类图在图9.7中表示,其代码在图9.8中表示。Bike类在行71中声明一个五个Bike对象的数组bikeList在行74中声明。属性(也被称作成员变量)在行76-78中声明Bike构造器在行91中声明;在行93-95中,成员变量被设置成传递给构造器的参数值。有三个get方法:getDeposit()在行98声明getRate()在行102中声明getBikeNumber()在行106中声明信息系统分析与设计InformationSystemAnalysisandDesign17/62编程-5Bike类(续)方法findBikeByNumber()在行110中声明。这个方法在数组:Bikes中搜寻直到发现一个自行车带有同bikeNum(作为参数传递的)相匹配的值。当一个匹配发现后,该:Bike被返回到调用的方法。注意这个方法+findBikeByNumber(bikeNum:int):Bike的定义,其定义了必须返回一个Bike引用。方法showDetails()在行128声明。这个方法显示传送给它的:Bike的bike编号、押金和每天的租金。calculateCost()在行135中声明。这个方法计算租借传送给它的:Bike的总费用。信息系统分析与设计InformationSystemAnalysisandDesign18/62序列图-1序列图在编程中的作用对于新手,试图追寻面向对象程序中执行序列是非常困惑的。代