题目集8~9的“航空货运管理系统”题目总结

一、系统类图分析
1.1 类图总体结构
航空货运管理系统包含六个核心类:Client(客户)、Goods(货物)、GOODS(扩展货物类)、Pay(支付方式)、Order(订单)、Flight(航班),通过继承与关联关系协同工作。
类图说明(PowerDesigner 风格):
plaintext
+-----------------+ +-----------------+ +-----------------+
| Client | | Goods | | GOODS |
+-----------------+ +-----------------+ +-----------------+
| - type: String | | - type: String | | - client: Client|
| - phone: String | | - number: String| | |
| - name: String | | - name: String | | +GOODS() |
| - number: String| | - c: double | | +GOODS(...) |
| - site: String | | - k: double | | +money(): double|
+-----------------+ | - g: double | +-----------------+
^ | - m: double | ^
| | +Goods() | |
| | +Goods(...) | |
+-----------------+ | +setType(...) | |
| Pay |<----| +getType() | |
+-----------------+ | +setNumber(...) | |
| - type: String | | +getNumber() | |
| +Pay() | | +setName(...) | |
| +Pay(...) | | +getName() | |
| +setType(...) | | +setC(...) | |
| +getType() | | +getC() | |
| +Type(): String | | +setK(...) | |
+-----------------+ | +getK() | |
^ | +setG(...) | |
| | +getG() | |
| | +setM(...) | |
+-----------------+ | +getM() | |
| Order |<----| +jfM(): double | |
+-----------------+ | +fl(): double | |
| - beginName: String | +money(): double| |
| - beginNumber: String | | |
| - beginSite: String | | |
| - endName: String | | |
| - endNumber: String | | |
| - endSite: String | | |
| - orderNumber: String | | |
| - orderTime: String | | |
| +Order() | | |
| +Order(...) | | |
| +getBeginName() | | |
| +getBeginNumber()| | |
| +getBeginSite() | | |
| +getEndName() | | |
| +getEndNumber() | | |
| +getEndSite() | | |
| +getOrderNumber()| | |
| +getOrderTime() | | |
+-----------------+ | |
^ | |
| | |
+-----------------+ | |
| Flight |------------------|-----------------|
+-----------------+ | |
| - number: String| | |
| - beginSite: String| | |
| - endSite: String| | |
| - time: String | | |
| - max: double | | |
| +Flight() | | |
| +Flight(...) | | |
| +getNumber() | | |
| +getBeginSite() | | |
| +getEndSite() | | |
| +getTime() | | |
| +getMax() | | |
+-----------------+ | |
1.2 类间关系说明
继承关系:
GOODS 类继承 Goods 类,扩展与 Client 的关联,并覆盖money()方法实现客户折扣。
关联关系:
GOODS 与 Client 是组合关系,每个 GOODS 实例必须关联一个 Client。
Order 与 Goods、Flight 与 Goods 是业务关联,订单包含货物,航班承载货物。
1.3 核心类功能解析
1.3.1 Client 类
存储客户信息(类型、姓名、电话等),客户类型(个人 / 企业)影响运费折扣。
1.3.2 Goods 类
货物基类,包含类型、重量等属性,实现计费重量(jfM())、费率(fl())和运费(money())计算。
1.3.3 GOODS 类
继承 Goods,关联 Client,重写money()方法:个人客户 9 折,企业客户 8 折。
二、采坑心得
2.1 继承与多态实现误区
构造函数调用错误
初始未在 GOODS 构造函数中调用super(),导致父类属性未初始化:
java
// 错误示例(缺少super调用)
public GOODS(String type,...Client client){
this.client = client;
}

修正:显式调用父类构造函数
java
public GOODS(String type,...Client client){
super(type,...); // 必须位于构造函数首行
this.client = client;
}

方法重写逻辑漏洞
重写money()时未正确调用父类方法,导致折扣计算错误:
java
// 错误示例(未调用fl()/jfM())
double money = 100 * 0.9;

修正:通过super或直接调用父类方法
java
double baseMoney = fl() * jfM(); // 调用父类计算逻辑
money = clientType.equals("Individual") ? baseMoney * 0.9 : baseMoney * 0.8;

2.2 输入输出格式陷阱
输入顺序混淆
读取货物信息时误将类型与编号顺序颠倒:
java
String number = in.next(); // 错误:先读了编号
String type = in.next(); // 后读类型,导致数据错位

修正:严格按输入说明顺序读取
java
String type = in.next(); // 先类型
String number = in.next(); // 后编号

格式化输出精度错误
未按要求保留 1 位小数:
java
System.out.printf("总重量:%.2fkg", sumM); // 错误:保留2位

修正:使用%.1f控制精度
2.3 业务逻辑典型错误
计费重量计算错误
误用整数除法:ckg/6000(丢失小数位),应改为ckg/6000.0。
费率条件判断顺序错误
条件范围颠倒(如if(jfM()<50)先于if(jfM()<20)),导致逻辑失效。
2.4 类关联管理问题
Client 对象未正确传递:创建 GOODS 时未传入 Client,导致折扣计算失败。
航班载重检查错误:误用实际重量(sumM1)而非计费重量(sumM2)进行载重判断。
三、改进建议
3.1 设计模式优化
策略模式重构运费计算
定义接口FreightStrategy,不同货物类型实现具体策略:
java
public interface FreightStrategy {
double calculate(double weight);
}
public class NormalStrategy implements FreightStrategy {
public double calculate(double weight) { /* 普通货物费率逻辑 */ }
}

工厂模式创建货物对象
通过工厂类封装对象创建逻辑,便于扩展新货物类型:
java
public class GoodsFactory {
public static Goods create(String type,...) {
if ("Normal".equals(type)) return new NormalGoods(...);
else if ("Dangerous".equals(type)) return new DangerousGoods(...);
// 其他类型...
}
}

3.2 代码健壮性增强
输入验证机制
添加参数合法性检查:
java
if (weight <= 0) throw new IllegalArgumentException("重量必须为正数");

异常处理完善
使用 try-catch 捕获输入输出异常,并给出明确错误提示:
java
try {
// 输入处理代码
} catch (Exception e) {
System.err.println("输入错误:" + e.getMessage());
}

3.3 功能扩展方向
数据持久化:使用文件或数据库存储订单信息,实现历史记录查询。
货物追踪:添加运输状态字段,记录货物位置与物流进度。
GUI 界面:使用 Swing/JavaFX 开发图形界面,提升用户体验。
四、阶段总结
4.1 技术收获
深入理解面向对象三大特性,能熟练运用继承与多态处理业务逻辑。
掌握复杂业务逻辑的拆解方法(如运费计算分步骤实现)。
提升代码调试能力,学会通过日志和单步调试定位问题。
4.2 待提升方向
设计模式的深入应用(如模板方法、观察者模式)。
数据持久化技术(文件 IO、JDBC)与软件架构设计。
单元测试编写,提高代码可靠性。
4.3 对课程的建议
加强设计模式实战:通过案例演示策略模式、工厂模式的应用场景。
增加项目迭代训练:从简单到复杂逐步扩展系统功能,培养架构思维。
代码审查指导:针对作业中的典型设计问题提供优化建议,提升代码质量。

posted @ 2025-05-24 14:24  晚安10086  阅读(25)  评论(1)    收藏  举报