信息系统分析与设计案例2010-9
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编程-1
StartUp类
StartUp类的类图在图9.3中表示,StartUp类的代码在图9.4中表示 。
• 代码的行01声明StartUp是在一个名称为 bikeshop的包内 (如同在 代码中所有的类一样)。
• StartUp类声明是在行05。在类中的每一内容必须用波形括号{}括 起来,这个括号告诉编译器类的开始和结束的地方 。左括号在行 05,右括号在行27。
编程-2
IssueBikeUI类
IssueBikeUI类的类图在图9.5中表示,其代码在图9.6中表示。
• IssueBikeUI类在行34声明 • 属性(也被称为方法的变量)37-41声明。 • showBikeDetails(bikeNum:int):void方法在行42声明,这个方法调用
在Bike类中的findBikeByNumber(bikeNum)。 • findBikeByNumber(bikeNum)反复搜寻它的bike对象数组,直到它
在包括main()的Java每个方法必须在一个类中;因此,我们建立 StartUp类的原因部分是为了放置main()。
StartUp建立的另一个原因是模拟,如果这部分代码是带有欢迎菜单 和其它显示界面层的整个可执行系统的一部分时,它模拟将会发生 什么。
这个类有效地模拟了在图9.2中序列图建模的接待员的功能。
下一条消息是findBikeByNumber(bikeNum),在44行的指令 chosenBike = Bike.findBikeByNumber(bikeNum) 中 。 这 个 调 用 是 从 :IssueBikeUI 到 Bike类。
序列图 -3
序列图在编程中的作用(续2)
Java应用总是从 main()方法的执行开始
main()方法在StartUp类中,代码行07
序列图从main()方法发送的第一个消息开始,在行 13,即IssueBikeUI ui = new IssueBikeUII)。这产生一个新的:IssueBikeUI。
• getDeposit() 在行98声明 • getRate()在行102中声明 • getBikeNumber() 在行106中声明
编程-5
Bike 类(续)
方法findBikeByNumber()在行110中声明。这个方法在数组:Bikes中 搜寻直到发现一个自行车带有同bikeNum(作为参数传递的)相匹配 的值。
序列图 -1
序列图在编程中的作用
对于新手,试图追寻面向对象程序中执行序列是非常困惑的。 代码的结构式用类来表示,但执行的序列是由用例来表示。 这一结果是执行序列在整个代码清单中跳转。 现在我们 将‘Issuebike’ 用例场景的序列图同实现它的代码进行 比较。 我们将序列图中的消息同实现它的代码行进行映射。按这种方式, 我们遵循计算机执行代码的序列。 这证明了序列图作为引导我们阅读代码的线路图的用处。
这个类结合了控制类和界面类的功能。 它的前四个属性chosenBike、customer、payment和hire都被用来存 放 IssueBikeUI需要交互的对象的对象标识符(或引用)。 这些属 性被用来实现在类图中表示的由IssueBikeUI发出的单向导航路径。 最 后 的 属 性 numberOfDays 存 放 租 借 的 时 间 长 短 。 当 calculateCost(numDays)被调用时它被设置,随后被用作 Hire产生 的参数。
• Payment(cust:Customer) 是一个构造器。当调用时,它产生一个新的 Payment对象,并将其关联到:Customer引用,该引用被作为参数传 递。
• calculateTotalPayment(hire:Hire) 设计用于为一位租借多辆自行车的 顾客计算出总的费用。 因为在这个实现中,仅有一位顾客租借一辆 自行车的情况,因此,本方法仅部分实现;calculateTotalPayment() 调用私有方法issueReceipt()。
• paymentId被用来存放惟一标识每个:Payment的数字。这个数 字是一个整数,不像一个引用(或对象标识符)仅被计算机 使用,该数字能被人阅读和理解。
实现类图 -5
Payment类(续)
属性:(续)
• paymentCount是一个类变量,其允许应用赋值一个数字,该数字惟 一标识每个:Payment (paymentId)。每次一个新的Payment对象产生 ,它就被更新。
实现类图 -4
Payment类
这是同分析模型中建立的Payment类相同的实体类,仅仅是为了简单 ,省略了一些属性。
属性:
• Customer用来存放对一个Customer对象的引用;这允许每一 个Payment对象被联接到正确的Customer对象。它实现了在 类图中表示的到Customer类的单向导航。
属性的值。 例 如 , Customer 有 三 个 get 方 法 , getCustomerNumber() 、 getName()和getPostcode(),它们都没有在类图中显示。
实现类图 -2
起始类(Start Up)类
StartUp是一个新类。
Java应用必须总有一个main()方法; 当Java应用运行时,它总是第 一个执行的方法。
因为我们要求代码是为了表述的目的,因而简单代码比全部功能的 代码更重要。
简介-3
方法
诸如引用其它类的细节已经添加到类。因此,我们忽略了在分析模 型中表示的一些属性和方法。
这允许我们保持图表在可管理的大小内。
从现在起我们称方法methods而不是操作operations;这在此阶段是 合适的,因为程序员是关注实现一个过程的代码部分。
编程-4
Bike类
Bike类的类图在图9.7中表示,其代码在图9.8中表示。
• Bike类在行71中声明 • 一个五个Bike对象的数组bikeList在行74中声明。 • 属性(也被称作成员变量)在行76-78中声明 • Bike构造器在行91中声明;在行93-95中,成员变量被设置成传递
给构造器的参数值。 有三个get方法:
Hire类
Hire类是同分析模型中定义相同的实体类。 同Payment和Customer对象类似,每一个:Hire 有一个惟一的hireId ,其是由类变量 hireCount 产生的。 属性customer和bike被用来存放对Customer和Bike对象的引用。 虽然在它有四个get方法,但在图中仅表示的方法是一个构造器。
当一个匹配发现后,该: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对象。
• showDetail() 用来显示由findBikeByNumber()发现的自行车的细节 • calculateCost(numberOfDays:int) 计算出自行车租借一段时间的费用
。
实现类图 -7
Customer类
Customer类是同分析模型中定义相同的实体类。 同Payment对象类似,每一个:Customer有一个惟一的customerId, 其是由类变量 customerCount产生的。 为了简单,我们利用邮政编码代替完整的地址。虽然在代码中有三 个get方法,但在这个模型中仅表示的方法是一个构造器。
内容 9
编程
❖ 简介 ❖ 实现类图 ❖ 编程 ❖ 序列图
简介-1
目的
这部分的内容不是给你在编程方面的快速课程,而是为了演示我们 已经建立的一些模型是如何映射到代码。
我们不解释每条指令。代码的讨论涉及它同类图和序列图的关系。
对于类图,我们讨论哪些行代码是实现类、类的属性、方法和关系 的。
我们利用序列图作为线路图来指导我们实现程序指令被执行的序列 。
序列图 -2
序列图在编程中的作用(续1)
我们将要使用的序列图在图9.9中表示。 完整的代码在图9.10中列出。表9.1将每一序列的代码消息映射到实 现它的代码行。 表9.1表示:
• 栏1,序列图中的消息 • 栏2,实现消息的代码行的行号 • 栏3,发送消息的对象或类 • 栏4,接受消息的对象或类
• issueReceipt(hire:Hire)打印一张收据。注意在类图中这个方法前面是 一个负号,表示其是一个私有方法。这意味着它仅能被 Payment类 的实例所使用。
实现类图 -6
Bike类
Bike类结合了Bike实体类,以及一个有所有:Bike标识符的清单的集合类 。
为了简化,我们已经限制了Bike属性仅有deposit、rate和bikeNumber。
在早期我们谈论操作而不是方法,因为分析和设计活动更关注过程 的界面,而不是它的wenku.baidu.com现。
实现类图 -1
类图实现
在图9.1中的实现类图最初是根据代码由CASE工具产生的。 它表示了完整的实现细节,即属性、方法参数(带类型和返回值) 、以及方法返还类型的可见性、类型和初始值。
为了生成类图的目的,即忽略gets和sets方法,简单地设置或返回
四 个 方 法 调 用 , showBikeDetails() 、 calculateCost() 、 newCust() 和 calcTotals() , 原 来 由 Receptionist 发 送 到 :IssueBikeUI,现在由StartUp发送。
实现类图 -3
IssueBikeUI类
下一条消息 showBikeDetails(bikeNum),在行16,是由StartUp发送到新 的:IssueBikeUI。
为 了 找 出 下 一 步 发 生 什 么 , 我 们 需 要 找 到 在 IssueBikeUI 类 中 的 方 法 showBikeDetails(bikeNum) (行42)然后跟随实现这个方法的代码直到 我们发现下一条消息(或方法调用) 。
其它的代码讨论局限于解释没有在早期模型中表示的定义特性。
简介-2
内容
系统用Java语言实现。
它也被我们已经在建立UML模型时使用的CASE工具支持。
为了简洁,产生的代码仅仅是Wheels系统实现的部分: ‘Issue bike’用例的一个场景。
代码局限于处理一位顾客租借一辆自行车。这意味着一些方法,例 如Payment的方法calculateTotalPayment()似乎是无用的,因为它 是设计用来处理多辆自行车租赁的。
• main()方法是在行07声明。这个方法的所有程序指令被放在第二 个波形括号中,左括号在行07,右括号在行26。
• 在main()中的第一条指令产生一个IssueBikeUI对象ui(行13),其 后四条指令是对 IssueBikeUI对象的调用。这四条指令实现在 ‘Issue bike’ 用例场景中的主要步骤。
方法Methods:
• Bike(dep:int, rat:int, num:int) 是一个构造器。当调用时,它产生一 个新的Bike对象,并将其属性设置成传递的参数值。
• findBikeByNumber(bikeNum:int) 是集合类功能的一部分;它在表 :Bikes中搜寻,直到找到一个带有相同自行车编号的自行车。