1. 前言
本阶段我们完成了两次题目集(8-9)的编程实践,重点围绕"航空货运管理系统"展开。这两次题目集的知识点主要包括:
面向对象设计原则(SOLID原则的应用)
类与对象的设计与实现
枚举类型的使用
策略模式的应用
输入输出处理
异常处理机制
题量方面,两次题目集各包含1道综合性编程题,但第二次题目在第一次基础上增加了货物类型和用户类型的扩展需求,复杂度明显提升。
难度递进明显:
第一次题目集(8)主要考察基础运费计算和简单类设计
第二次题目集(9)增加了费率策略、折扣计算等业务逻辑,对设计模式的应用要求更高
2. 设计与分析
2.1 题目集8的航空货运系统设计
题目要求
航空快递以速度快、安全性高成为急件或贵重物品的首选。本题目要求对航空货运管理系统进行类设计,具体说明参看说明文件。
OO第九周作业题目说明.pdf
输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。
客户编号
客户姓名
客户电话
客户地址
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为YYYY-MM-DD)
航班最大载重量
订单编号
订单日期(格式为YYYY-MM-DD)
发件人地址
发件人姓名
发件人电话
收件人地址
收件人姓名
收件人电话
输出格式:
如果订单中货物重量超过航班剩余载重量,程序输出The flight with flight number:航班号 has exceeded its load capacity and cannot carry the order. ,程序终止运行。
如果航班载重量可以承接该订单,输出如下:
客户:姓名(电话)订单信息如下:
航班号:
订单号:
订单日期:
发件人姓名:
发件人电话:
发件人地址:
收件人姓名:
收件人电话:
收件人地址:
订单总重量(kg):
微信支付金额:
货物明细如下:
明细编号 货物名称 计费重量 计费费率 应交运费
1 ...
2 ...
注:输出中实型数均保留1位小数。
输入样例:
在这里给出一组输入。例如:
10001
郭靖
13807911234
南昌航空大学
2
101
发电机
80
60
40
80
102
信号发生器
55
70
60
45
MU1234
昌北国际机场
大兴国际机场
2025-04-22
1000
900001
2025-04-22
南昌大学
洪七公
18907912325
北京大学
黄药师
13607912546
输出样例:
在这里给出相应的输出。例如:
客户:郭靖(13807911234)订单信息如下:
航班号:MU1234
订单号:900001
订单日期:2025-04-22
发件人姓名:洪七公
发件人电话:18907912325
发件人地址:南昌大学
收件人姓名:黄药师
收件人电话:13607912546
收件人地址:北京大学
订单总重量(kg):125.0
微信支付金额:3350.0
货物明细如下:
明细编号 货物名称 计费重量 计费费率 应交运费
1 发电机 80.0 25.0 2000.0
2 信号发生器 45.0 30.0 1350.0
类图:

报表:

分析:
第一次实现采用了简单的面向对象设计,主要完成基础运费计算功能。运费计算直接内嵌在Order类中,缺乏灵活性。输入处理较为简单,没有考虑异常情况。
2.2 题目集9的改进设计
题目要求
航空快递以速度快、安全性高成为急件或贵重物品的首选。本题目要求对航空货运管理系统进行类设计,具体说明参看说明文件。
OO第十二周作业题目说明.pdf
输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。
客户类型[可输入项:Individual/Corporate]
客户编号
客户姓名
客户电话
客户地址
货物类型[可输入项:Normal/Expedite/Dangerous]
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为YYYY-MM-DD)
航班最大载重量
订单编号
订单日期(格式为YYYY-MM-DD)
发件人地址
发件人姓名
发件人电话
收件人地址
收件人姓名
收件人电话
支付方式[可输入项:Wechat/ALiPay/Cash]
输出格式:
如果订单中货物重量超过航班剩余载重量,程序输出The flight with flight number:航班号 has exceeded its load capacity and cannot carry the order. ,程序终止运行。
如果航班载重量可以承接该订单,输出如下:
客户:姓名(电话)订单信息如下:
航班号:
订单号:
订单日期:
发件人姓名:
发件人电话:
发件人地址:
收件人姓名:
收件人电话:
收件人地址:
订单总重量(kg):
[微信/支付宝/现金]支付金额:
货物明细如下:
明细编号 货物名称 计费重量 计费费率 应交运费
1 ...
2 ...
注:输出中实型数均保留1位小数。
输入样例:
在这里给出一组输入。例如:
Corporate
10001
郭靖
13807911234
南昌航空大学
Expedite
2
101
发电机
80
60
40
80
102
信号发生器
55
70
60
45
MU1234
昌北国际机场
大兴国际机场
2025-04-22
1000
900001
2025-04-22
南昌大学
洪七公
18907912325
北京大学
黄药师
13607912546
ALiPay
输出样例:
在这里给出相应的输出。例如:
客户:郭靖(13807911234)订单信息如下:
航班号:MU1234
订单号:900001
订单日期:2025-04-22
发件人姓名:洪七公
发件人电话:18907912325
发件人地址:南昌大学
收件人姓名:黄药师
收件人电话:13607912546
收件人地址:北京大学
订单总重量(kg):125.0
支付宝支付金额:4360.0
货物明细如下:
明细编号 货物名称 计费重量 计费费率 应交运费
1 发电机 80.0 40.0 3200.0
2 信号发生器 45.0 50.0 2250.0
类图:

报表:

分析:
1.引入策略模式:通过RateCalculator接口实现不同货物类型的运费计算策略
2.增加枚举类型:清晰定义客户类型和支付方式
3.优化类职责分配:将运费计算逻辑从Order类分离到专门的策略类
4.增加折扣计算功能:根据客户类型应用不同折扣率
3. 采坑心得
3.1 输入处理问题
问题:在题目集8中,直接使用Scanner按行读取输入,当输入顺序错误时程序会崩溃。
测试数据:
10001
郭靖
13807911234 // 错误:电话号码包含空格
南昌航空大学
...
解决方案:
// 改进后的输入处理
String phone = scanner.nextLine().trim(); // 去除首尾空格
if(!phone.matches("\d+")) {
throw new IllegalArgumentException("电话号码必须全为数字");
}
3.2 浮点数精度问题
问题:直接使用double计算运费时,出现如"3.0000000001"的结果。
测试用例:
Cargo cargo = new Cargo(..., 30.0);
assertEquals(900.0, cargo.calculateFreight()); // 有时失败
解决方案:
// 使用BigDecimal或格式化输出
System.out.printf("%.1f", freight); // 保留1位小数
3.3 类设计问题
初始设计:
class Order {
public double calculateFreight() {
// 包含普通货物、加急货物、危险货物的计算逻辑
}
}
问题:违反开闭原则,每次新增货物类型都需要修改Order类。
改进后:
interface RateCalculator {
double calculateRate(double weight);
}
class Order {
public double calculateFreight() {
// 委托给Cargo对象的RateCalculator
}
}
4. 改进建议
4.1 设计层面改进
增加异常处理机制:
class OrderValidator {
public static void validate(Order order) throws OrderException {
if(order.getTotalWeight() > order.getFlight().getMaxLoad()) {
throw new OrderException("超重");
}
}
}
5. 总结
通过这两次题目集的实践,我获得了以下收获:
面向对象设计能力提升:
深入理解了SOLID原则的实际应用,掌握了策略模式、工厂方法等设计模式,学会了通过接口隔离变化。
编码实践能力增强:
更加注重异常处理和边界条件,提高了代码的可测试性和可维护性,学会了使用工具分析代码质量(如SourceMonitor)。
需要进一步学习的内容:
更复杂的模式如观察者模式、装饰器模式,使用UML工具进行更专业的设计,单元测试框架的深入使用,重构技巧和代码坏味道识别。
这两次题目集让我认识到,好的程序设计不仅在于功能的实现,更在于代码的可扩展性和可维护性。在未来的学习中,我将更加注重设计原则的应用和代码质量的提升。
浙公网安备 33010602011771号