当前位置:文档之家› 信息系统分析与设计案例2010-9

信息系统分析与设计案例2010-9

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