




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1/6212/27/20212/6212/27/2021 3/6212/27/2021n这部分的内容不是给你在编程方面的快速课程,而是为了演示我们已经建立的一些模型是如何映射到代码。n我们不解释每条指令。代码的讨论涉及它同类图和序列图的关系。n对于类图,我们讨论哪些行代码是实现类、类的属性、方法和关系的。n我们利用序列图作为线路图来指导我们实现程序指令被执行的序列。n其它的代码讨论局限于解释没有在早期模型中表示的定义特性。 4/6212/27/2021n系统用Java语言实现。 n它也被我们已经在建立UML模型时使用的CASE工具支持。n为了简洁,产生的代码仅仅是Wheels系统实现的部分:
2、Issue bike用例的一个场景。 n代码局限于处理一位顾客租借一辆自行车。这意味着一些方法,例如Payment的方法calculateTotalPayment()似乎是无用的,因为它是设计用来处理多辆自行车租赁的。n因为我们要求代码是为了表述的目的,因而简单代码比全部功能的代码更重要。 5/6212/27/2021n诸如引用其它类的细节已经添加到类。因此,我们忽略了在分析模型中表示的一些属性和方法。 n这允许我们保持图表在可管理的大小内。 n从现在起我们称方法methods而不是操作operations;这在此阶段是合适的,因为程序员是关注实现一个过程的代码部分。n在早期我们谈论操作而不是
3、方法,因为分析和设计活动更关注过程的界面,而不是它的实现。6/6212/27/2021 n在图9.1中的实现类图最初是根据代码由CASE工具产生的。 n它表示了完整的实现细节,即属性、方法参数(带类型和返回值)、以及方法返还类型的可见性、类型和初始值。 n为了生成类图的目的,即忽略和方法,简单地设置或返回属性的值。n例如,Customer有三个get方法,getCustomerNumber()、 getName()和getPostcode(),它们都没有在类图中显示。7/6212/27/2021 nStartUp是一个新类。 nJava应用必须总有一个main()方法; 当Java应用运行时,
4、它总是第一个执行的方法。 n在包括main()的Java每个方法必须在一个类中;因此,我们建立 StartUp类的原因部分是为了放置main()。 nStartUp建立的另一个原因是模拟,如果这部分代码是带有欢迎菜单和其它显示界面层的整个可执行系统的一部分时,它模拟将会发生什么。n这个类有效地模拟了在图9.2中序列图建模的接待员的功能。 n四个方法调用,showBikeDetails()、calculateCost()、 newCust()和calcTotals(),原来由Receptionist发送到:IssueBikeUI,现在由StartUp发送。 8/6212/27/2021 n这个类
5、结合了控制类和界面类的功能。 n它的前四个属性chosenBike、customer、payment和hire都被用来存放 IssueBikeUI需要交互的对象的对象标识符(或引用)。 这些属性被用来实现在类图中表示的由IssueBikeUI发出的单向导航路径。 n最后的属性numberOfDays存放租借的时间长短。当calculateCost(numDays)被调用时它被设置,随后被用作 Hire产生的参数。9/6212/27/2021 n这是同分析模型中建立的Payment类相同的实体类,仅仅是为了简单,省略了一些属性。n属性: nCustomer用来存放对一个Customer对象的引用
6、;这允许每一个Payment对象被联接到正确的Customer对象。它实现了在类图中表示的到Customer类的单向导航。npaymentId被用来存放惟一标识每个:Payment的数字。这个数字是一个整数,不像一个引用(或对象标识符)仅被计算机使用,该数字能被人阅读和理解。10/6212/27/2021 n属性:(续)npaymentCount是一个类变量,其允许应用赋值一个数字,该数字惟一标识每个:Payment (paymentId)。每次一个新的Payment对象产生,它就被更新。 nPayment(cust:Customer) 是一个构造器。当调用时,它产生一个新的 Payment对
7、象,并将其关联到:Customer引用,该引用被作为参数传递。 ncalculateTotalPayment(hire:Hire) 设计用于为一位租借多辆自行车的顾客计算出总的费用。 因为在这个实现中,仅有一位顾客租借一辆自行车的情况,因此,本方法仅部分实现;calculateTotalPayment() 调用私有方法issueReceipt()。nissueReceipt(hire:Hire)打印一张收据。注意在类图中这个方法前面是一个负号,表示其是一个私有方法。这意味着它仅能被 Payment类的实例所使用。11/6212/27/2021 nBike类类nBike类结合了Bike实体类,以
8、及一个有所有:Bike标识符的清单的集合类 。n为了简化,我们已经限制了Bike属性仅有deposit、rate和bikeNumber。 n方法方法Methods: nBike(dep:int, rat:int, num:int) 是一个构造器。当调用时,它产生一个新的Bike对象,并将其属性设置成传递的参数值。 nfindBikeByNumber(bikeNum:int) 是集合类功能的一部分;它在表:Bikes中搜寻,直到找到一个带有相同自行车编号的自行车。 nshowDetail() 用来显示由findBikeByNumber()发现的自行车的细节ncalculateCost(numbe
9、rOfDays:int) 计算出自行车租借一段时间的费用。12/6212/27/2021 nCustomer类类nCustomer类是同分析模型中定义相同的实体类。 n同Payment对象类似,每一个:Customer有一个惟一的customerId,其是由类变量 customerCount产生的。 n为了简单,我们利用邮政编码代替完整的地址。虽然在代码中有三个get方法,但在这个模型中仅表示的方法是一个构造器。 nHire类类 nHire类是同分析模型中定义相同的实体类。n同Payment和Customer对象类似,每一个:Hire 有一个惟一的hireId,其是由类变量 hireCount
10、 产生的。n属性customer和bike被用来存放对Customer和Bike对象的引用。 n虽然在它有四个get方法,但在图中仅表示的方法是一个构造器。13/6212/27/2021 nStartUp类的类图在图9.3中表示,StartUp类的代码在图9.4中表示。 n代码的行01声明StartUp是在一个名称为 bikeshop的包内 (如同在代码中所有的类一样)。 nStartUp类声明是在行05。在类中的每一内容必须用波形括号括起来,这个括号告诉编译器类的开始和结束的地方 。左括号在行05,右括号在行27。 nmain()方法是在行07声明。这个方法的所有程序指令被放在第二个波形括号
11、中,左括号在行07,右括号在行26。 n在main()中的第一条指令产生一个IssueBikeUI对象ui(行13),其后四条指令是对 IssueBikeUI对象的调用。这四条指令实现在 Issue bike 用例场景中的主要步骤。 14/6212/27/2021nIssueBikeUI类的类图在图9.5中表示,其代码在图9.6中表示。 nIssueBikeUI类在行34声明 n 属性(也被称为方法的变量)37-41声明。 nshowBikeDetails(bikeNum:int):void方法在行42声明,这个方法调用在Bike类中的findBikeByNumber(bikeNum)。 nf
12、indBikeByNumber(bikeNum)反复搜寻它的bike对象数组,直到它发现一个匹配的自行车编号( 一个同参数值bikeNum匹配的)。 匹配自行车的引用(对象标识符)被返回,并被赋给属性chosenBike。这个引用然后被用来传送消息showDetails()到匹配的自行车。 15/6212/27/2021n其余的方法声明是: n+calculateCost(numDays:int):void 在行50 n+createCustomer(name:String,postcode:String,tel:int):void 在行 57 n+calculateTotalPayment(
13、):void 在行64 n注意所有这些方法是公有的(public),即它们能被任何对象调用。方法createCustomer()实际上产生一个Hire对象、一个Customer对象和一个Payment对象。 16/6212/27/2021nBike类的类图在图9.7中表示,其代码在图9.8中表示。 nBike类在行71中声明 n一个五个Bike对象的数组bikeList在行74中声明。 n属性(也被称作成员变量)在行76-78中声明 nBike构造器在行91中声明;在行93-95中,成员变量被设置成传递给构造器的参数值。 n有三个get方法: ngetDeposit() 在行98声明 nget
14、Rate()在行102中声明 ngetBikeNumber() 在行106中声明17/6212/27/2021n方法findBikeByNumber()在行110中声明。这个方法在数组:Bikes中搜寻直到发现一个自行车带有同bikeNum(作为参数传递的)相匹配的值。n当一个匹配发现后,该:Bike被返回到调用的方法。n注意这个方法+findBikeByNumber(bikeNum:int):Bike的定义,其定义了必须返回一个 Bike引用。n方法showDetails()在行128声明。这个方法显示传送给它的:Bike的 bike编号、押金和每天的租金。 ncalculateCost()
15、在行135中声明。这个方法计算租借传送给它的:Bike的总费用。18/6212/27/2021 n对于新手,试图追寻面向对象程序中执行序列是非常困惑的。n代码的结构式用类来表示,但执行的序列是由用例来表示。 n这一结果是执行序列在整个代码清单中跳转。 n现在我们 将Issuebike 用例场景的序列图同实现它的代码进行比较。 n我们将序列图中的消息同实现它的代码行进行映射。按这种方式,我们遵循计算机执行代码的序列。n这证明了序列图作为引导我们阅读代码的线路图的用处。19/6212/27/2021 n我们将要使用的序列图在图9.9中表示。 n完整的代码在图9.10中列出。表9.1将每一序列的代码
16、消息映射到实现它的代码行。 n表9.1表示: n栏1,序列图中的消息 n栏2,实现消息的代码行的行号n栏3,发送消息的对象或类 n栏4,接受消息的对象或类 20/6212/27/2021 nJava应用总是从 main()方法的执行开始 nmain()方法在StartUp类中,代码行07 n序列图从main()方法发送的第一个消息开始,在行 13,即IssueBikeUI ui = new IssueBikeUII)。这产生一个新的:IssueBikeUI。n下一条消息 showBikeDetails(bikeNum),在行16,是由StartUp发送到新的:IssueBikeUI。 n为了找
17、出下一步发生什么,我们需要找到在IssueBikeUI 类中的方法showBikeDetails(bikeNum) (行42)然后跟随实现这个方法的代码直到我们发现下一条消息(或方法调用) 。n下一条消息是findBikeByNumber(bikeNum),在44行的指令 chosenBike = Bike.findBikeByNumber(bikeNum)中。这个调用是从:IssueBikeUI到Bike类。 21/6212/27/2021 n然后我们到Bike类,发现方法findBikeByNumber(bikeNum)并跟随实现它的代码行,直到我们遇到下一个方法调用 。这个方法 find
18、BikeByNumber(bikeNum) 是在110行。 n下一个方法调用时在116行,在那里getBikeNumber() 消息被传送到在bikeList数组中的每一个 :Bikes ,这是一个反射或自引用消息。n每一 :Bike的编号依次同 bikeNum的值比较。当一个匹配的 :Bike 被发现,对该:Bike的引用被返回给 :IssueBikeUI。 22/6212/27/2021 n随着返回语句,控制被返回给调用的方法,在方法调用的下一条指令。这意味着下一行将要执行的是行45。行45是一个 if语句,其检查是否发现匹配的自行车(如果没有发现,则返回一个空引用)。如果发现一辆自行车,它的引用被返回,然后赋值给变量 chosenBike。然后,一个showDetails() 消息(行47)被传送到适当的:Bike。 nshowDetails()显示 :Bike的细节,然后在48行将控制返回给 :IssueBikeUI。 n行48有波形括号表示if语句的结束。行49包含有表示showBikeDetails()方法结束的波形括号,所以在行19控制被返回到StartUp。 23/6212/27/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 计算机软件升级合同
- 维修工程劳务合同
- 法人授权协议
- 五金批发市场企业品牌传播渠道拓展与优化考核试卷
- 洗涤设备的定制化市场需求考核试卷
- 玻璃制品检测仪器操作考核试卷
- 百货零售企业风险管理体系构建考核试卷
- 电动汽车噪音与振动控制技术考核试卷
- 矿物加工过程中的数学建模与应用-石墨滑石考核试卷
- 绢纺和丝织的智能制造技术发展现状与趋势分析考核试卷
- 高速公路收费站QC小组成果如何降低入口发卡差错率
- (高清版)JTG D81-2017 公路交通安全设施设计规范
- 压轴题10 压强与浮力选填压轴题(解析版)-2023年中考物理压轴题专项训练
- 中医外科 男性不育症
- (正式版)JTT 1490-2024 港口安全设施分类与编码
- 21《杨氏之子》公开课一等奖创新教案
- 车辆应急预案方案恶劣天气
- 【部编版】语文五年级下册第五单元《交流平台 初试身手》精美课件
- 枇杷文化知识讲座
- 浙江伟锋药业有限公司年产100吨拉米夫定、50吨恩曲他滨、30吨卡培他滨技改项目环境影响报告
- 公路养护安全作业规程-四级公路养护作业控制区布置
评论
0/150
提交评论