NCHU_航空货运管理系统-第二次bolg作业-java
一、前言
随着现代物流行业的快速发展,航空货运作为重要的运输方式之一,对信息系统的依赖日益增强。本次项目通过两次迭代开发,逐步构建了一个航空货运管理系统原型。第一次迭代聚焦于基础类结构的设计与实现,第二次迭代则引入了继承与多态特性,进一步完善系统功能。本报告旨在全面总结两次迭代开发过程中的经验教训,分析代码质量,并提出改进建议。
通过对比分析两次迭代的代码复杂度、结构设计和问题解决过程,我们能够深入理解面向对象设计原则在实际项目中的应用,掌握处理复杂业务逻辑的方法,并认识到代码可维护性的重要性。
二、航空货运管理系统
1.第一次迭代作业(类设计)
1.1 测试样例
输入:

输出:

1.2 核心问题分析
(1)收、发件人的电话、地址、姓名,对应错位
输入:

输出:

原因:
addressor类、recipient类、client类,共同继承user类,但user只有一个构造方法,且client类的姓名、电话、地址的输入与addressor类、recipient类的不同,
导致输入错位。
解决方案:
再构建一个构造方法,添加形参format,区分client类与addressor类、recipient类的输入不同。
(2)异常输入时未正确输出
输入:

输出:

原因:
当输入货物总重量超出航班最大运载重量时,其他部分照常运行并输出,订单总重量输出变为“The flight with flight number:%shas exceeded its load capacity and cannot carry the order.”
解决方案:
调整代码结构,先计算总重量,再进行异常输入判断,最后再输出。
(3)异常输入格式错误
这个卡了我很久,完全复制题目的异常输出,也还是格式错误。

后来我才知道,题目中的异常输出需要在has前添加空格。
1.3 类结构设计



1.4 代码复杂度分析

(1)类与方法结构
1.类和接口总数:7 个
2.平均每个类包含的方法数:7.71 个
3.平均每个方法的语句数:2.11 条,表明大多数方法逻辑较简单
(2)复杂度分析
1.最复杂方法:Main.main(),复杂度为 3(最大值)
2.其他方法复杂度基本为 1,表示逻辑较为线性,分支较少
3.平均复杂度:1.06,整体控制良好
(3)关键方法分析
Main.main()
1.复杂度:3
2.语句数:37 条
3.调用其他方法次数:34 次
4.块深度:3
建议:
方法职责过多,应考虑拆分逻辑,遵循单一职责原则
可将部分逻辑封装到独立方法或服务类中,提升可读性和测试覆盖率
(4)块深度分布
| 块深度 | 语句数 |
|---|---|
| 0 | 9 |
| 1 | 77 |
| 2 | 99 |
| 3 | 15 |
| 4+ | 0 |
1.最大块嵌套深度为 3,出现在 Main.main() 和 order.show() 中
2.嵌套层级适中,但建议避免超过 3 层的嵌套逻辑,保持代码清晰易读
(5)优点总结
1.大多数方法复杂度低(为 1),逻辑清晰
2.方法粒度较小,便于理解和维护
3.类设计合理,方法数量适中
(6)改进建议
1.拆分主方法:Main.main() 过于庞大,建议拆分为多个子方法或使用命令模式
2.优化 order.show() 和 goods.goods():适当解耦内部调用,减少方法依赖
3.提高可测试性:通过接口抽象或依赖注入方式降低类间耦合度
2.第二次迭代作业(继承与多态)
2.1 测试样例
输入:

输出:

2.2 核心问题分析
(1)应交运费输出错误
输入:

输出:

原因:
输出了打折后的钱。
解决方案:
调整代码结构,先计算总重量,再计算打折后的钱,最后再输出。
2.3 类结构设计

2.4 代码复杂度分析

(1)类与方法结构
1.类与接口数量:13 个
2.每个类平均方法数:7.31
3.每方法平均语句数:2.02
(2)复杂度分析
1.最大复杂度:23(Agent.calcuatePriceRate() 方法)
2.最深嵌套块深度:5 层(同样出现在 Agent.calcuatePriceRate())
3.结论:整体代码结构较为简单,但存在一个高度复杂的方法,需要重点关注。
(3)复杂方法分析
| 方法名 | 复杂度 | 语句数 | 调用次数 |
|---|---|---|---|
| Agent.calcuatePriceRate() | 23 | 40 | 67 |
1.复杂度高(23)意味着该方法逻辑复杂、分支多,可能包含多个条件判断或嵌套循环。
2.调用频繁(67 次),说明是核心业务逻辑的一部分。
3.嵌套深度达 5 层,影响可读性和维护性。
4.建议:
将部分逻辑拆分为子方法,降低复杂度;
使用策略模式或状态模式优化条件分支;
增加单元测试覆盖该方法
(4)块深度分布
| 块深度 | 语句数 |
|---|---|
| 0 | 15 |
| 1 | 130 |
| 2 | 142 |
| 3 | 117 |
| 4 | 18 |
| 5 | 15 |
结论:大多数语句处于低嵌套层级(1~2层),整体结构清晰;但仍有部分深层嵌套,需注意控制逻辑复杂度。
(5)改进建议
1.复杂方法:重构 Agent.calcuatePriceRate(),拆分逻辑,降低复杂度
2.设计模式:考虑使用策略模式处理价格计算逻辑
3.职责分离:避免单个方法承担过多功能(如 Agent.show())
4.单元测试:对复杂方法编写充分的单元测试以确保重构安全性
四、迭代对比
1.复杂度分析
(1)复杂度显著增加:
1.Blog2-2的Agent.calcuatePriceRate()方法复杂度高达23,远高于Blog2-1的最2.大复杂度3。
3.平均复杂度为1.31(Blog2-2)vs. 1.06(Blog2-1)
Blog2-2的分支语句比例为9.5%,明显高于Blog2-1的1.5%
2.结构深度
(1)嵌套更深:
1.最大块深度:5(Blog2-2)vs. 3(Blog2-1)
2.平均块深度:1.82(Blog2-2)vs. 1.60(Blog2-1)
3.方法特征
(1)更多方法但更简洁:
1.Blog2-2有95个方法,而Blog2-1有54个方法
2.每个方法的平均语句数相近:2.02(Blog2-2)vs. 2.11(Blog2-1)
4.代码风格
(1)简单方法居多:
复杂度为1的方法占大多数
(2)功能扩展:
Blog2-2新增了Agent类的大量功能,导致复杂度和结构深度显著提升
5.建议
(1)重构建议:
对于Agent.calcuatePriceRate()等高复杂度方法,应考虑拆分逻辑、减少条件判断以降低复杂度。
(2)可维护性改进:
在两个项目中增加必要的注释,提高代码可读性和后期维护效率。
(3)持续优化:
关注嵌套深度较高的代码块,适当进行逻辑简化。
通过这些优化措施,可以有效提升代码质量和可维护性。
五、总结
通过对航空货运管理系统的两次迭代开发,我们完成了从基础类设计到继承与多态应用的完整开发过程。在第一次迭代中,我们建立了基本的类结构,实现了收件人、发件人、航班、货物等核心实体的建模;在第二次迭代中,通过引入继承与多态机制,增强了系统的灵活性和扩展性。
在开发过程中,我们遇到了多个关键问题:包括收发件人信息错位、异常处理不规范以及输出格式错误等。这些问题的解决加深了我们对面向对象设计原则的理解,特别是在构造方法设计、异常处理机制和代码结构调整方面的认识。
代码复杂度分析显示,虽然大多数方法保持了较低的复杂度(多数为1),但在第二次迭代中出现了显著的高复杂度方法Agent.calcuatePriceRate()(复杂度达23)。这提示我们在追求功能完善的同时,也要注意控制单个方法的复杂度,避免过度嵌套和条件分支过多的问题。
通过本次项目实践,我们深刻认识到:
1.合理的类结构设计是系统可扩展性的基础
2.适当的使用继承与多态可以提高代码复用性和灵活性
3.持续关注代码质量指标(如复杂度、嵌套深度)对于维护长期可维护性至关重要
4.异常处理机制需要统一规范,避免业务逻辑与异常处理混杂
5.单元测试和代码注释对于团队协作和后期维护具有重要意义
建议在后续开发中重点关注以下改进方向:
1.对高复杂度方法进行重构,采用策略模式或状态模式优化条件分支
2.增加必要的注释和文档说明,提高代码可读性
3.设计统一的异常处理框架,规范异常捕获和处理流程
4.引入单元测试覆盖核心业务逻辑
5.进一步优化类结构,遵循单一职责原则,减少类间耦合度
通过持续的迭代优化和质量管控,该系统有望发展成为一个功能完善、结构清晰、易于维护的航空货运管理解决方案。

浙公网安备 33010602011771号