一、前言
一共有3次关于航空器配载的作业,整体围绕飞机货运配载、多货舱管理、载重平衡计算等功能进行编写,题量适中、难度一次比一次难,知识点衔接紧密,在上一次作业的基础上每次增加一点新功能,贴合航空配载基础业务逻辑,通过三次练习,逐渐掌握相关的编程技巧和航空方面知识。
从知识点来看,作业1主要是基础航班货运配载,核心是类的单一职责设计、航班信息管理、货物按重量排序及超载判断;作业2增加功能变为多货舱管理,新增货舱信息(标识、载重、位置网格)、货物指定货舱装载的逻辑;作业3新增旅客和行李管理,核心是载重平衡计算(力矩、重心、重心百分比核算),还有输入校验、手写冒泡排序等技巧。
从题量来看,三次作业题量比较合理:作业1题量最少,只需实现基础装载和判断功能;作业2题量略有增加,增加了多货舱的管理和装载逻辑;作业3题量最多,要完成旅客、货物、配平计算等多个模块。同时三次作业都需要做到单一职责和封闭性原则。
从难度来看,三次作业难度是循序渐进的,作业1难度最低,掌握基础类设计和简单逻辑就行;作业2难度中等,需要弄清楚多个类之间的关系,实现多货舱的装载判断;作业3难度最大,需要编写许多配平计算的公式,做好输入校验,对编程能力和逻辑思维要求更高。
二、设计与分析
(一)NCHU_航空器配载与货运管理系统1
1.源码设计分析:本次作业主要有4个类,完全遵循单一职责原则。Flight类负责存储航班信息(航班号、最大业载重量),提供getter方法;Cargo类存储货物信息(名称、重量);LoadManager类负责货物装载、重量计算、超载判断;Main类负责输入输出。
2.SourceMonitor分析:项目代码约102行,包含15个方法,平均方法复杂度 为2.3,整体无复杂逻辑。核心方法LoadManager.addCargo(货物排序与重量计算)实现简洁高效,执行效率表现良好。

3.PowerDesigner类图:Flight类与LoadManager类为依赖关系,LoadManager类与Cargo类为聚合关系。

- 心得:作业1核心是理解单一责原则,刚开始会比较容易把多个功能放在同一个类里的问题,在先确定每个类应该做什么后,再写代码可以让代码结构更清晰同时也更便于后续的维护工作。
(二)航班货运配载模块(迭代二)—— 多货舱管理与重量排序装载
1.源码设计分析:在作业1基础上新增2个类(Position类、InputValidator类),共7个类,延续单一职责原则。Position类仅负责表示货舱中的位置(行、列),提供位置名称方法;InputValidator类仅负责输入数据的合法性校验;CargoCompartment类新增位置网格生成、货物装载判断功能,Flight类新增货舱列表管理,LoadDispatcher类负责货物排序和查找。
2.SourceMonitor分析:项目代码约259行,包含7个类、约30个方法,平均方法语句数 3.30,整体无复杂逻辑。核心方法LoadManager.addCargo(货物排序与重量计算)实现简洁高效,执行效率表现良好;项目最大圈复杂度为 6,代码结构清晰。

- PowerDesigner类图:类图中新增Position类与CargoCompartment类的组合关系,CargoCompartment类与Cargo类的聚合关系,Flight类与CargoCompartment类的关联关系,类间关系明确,符合题目要求的组合、聚合关系设计。

- 心得:作业2的重点是多货舱管理和类间关系的设计,刚开始容易混淆组合关系和聚合关系,通过绘制类图,明确了Position类是CargoCompartment类的组成部分,而Cargo类可独立于货舱存在,同时输入校验类的引入,让代码的鲁棒性有所提升。
(三)航空器配载与货运管理系统——配平计算
- 源码设计分析:在作业2基础上新增4个类(Passenger类、Luggage类、WeightBalanceCalculator类,优化InputValidator类),共11个类,严格遵循题目要求,无继承、多态。Passenger类组合Luggage类,只负责计算旅客总重量;Luggage类只记录行李重量;WeightBalanceCalculator类作为纯计算工具类,只负责配平计算;InputValidator类优化后,只提供统一的输入校验静态方法;原有Flight类新增旅客列表管理,LoadDispatcher类改用手写冒泡排序,禁止使用朗姆达和Collections.sort()表达式。
2.SourceMonitor 分析:项目代码约418行,含11个类、40余个方法,平均方法语句数 4.71。项目最大圈复杂度为 20,核心业务方法存在一定复杂度偏高问题,注释率为 0%。

3.PowerDesigner类图:类图中新增Passenger类与Luggage类的组合关系,WeightBalanceCalculator类与Flight类的依赖关系,Flight类与Passenger类的关联关系,所有类职责单一,类间关系清晰。

4.心得:作业3是最复杂的一次作业,核心难点是多个模块的联动逻辑。理解了航空配载中重心计算的基本原理,同时知道单一职责原则在复杂系统中的重要性,每个类只做一件事,即使模块增多,也能保证代码逻辑清晰、便于调试。
三、踩坑心得
(1)作业一:Scanner输入异常,nextLine()读取回车符,导致航班号或货物名称读取失败。
具体情况:输入最大业载重量后,直接使用nextLine()读取货物名称,导致读取到的是回车符,程序报错,无法正常运行。但是我在修改后在不同的地方加入scanner.nextLine();结果有的时候是对的,有的时候是错的,有的时候得分变高,有的时候又没分了。我发现不能在所有的读取后面再加一个nextLine(),他只有在特定的位置上面加得分才会变高,所以输入输出的细节很重要,不同类型的输入方法混用容易出现异常,要牢记Scanner的使用技巧。
(2)作业二:主要是类变多了然后比较难找到类和类之间的关系,而且这个要有封闭性,所以我觉得先理清楚关系再去写代码会更好一点
(3)作业三:这个题目给的数据和输出的数据不太一样,所以要自己手动去改一下,然后就是有很多的测试点不通过,要自己一点点地去试,然后就算是格式错误什么的也要自己去试,所以还是要多去试试不同的输入数据去调数据点。最初设计时,Passenger类的Luggage对象通过构造器传入,且提供了getLuggage()方法,允许外部获取Luggage对象并修改行李重量,违背了组合关系的要求,也不符合题目中行李对象必须在Passenger构造器内部new出来,不对外暴露修改的规定。Passenger类的构造器参数为Luggage对象,而非行李重量,导致Luggage对象可在外部创建和修改,破坏了组合关系的封装性。组合关系的核心是“封装性”,不对外暴露成员对象的修改接口,否则会破坏类的封装性,也违背了单一职责原则,设计时需明确类的封装范围,避免对外暴露不必要的属性和方法。
四、改进建议
三次作业都可以多用list列表来进行运行,我有的时候使用数组,这个就会比较繁琐,可以去简化代码,同时可以去增加异常处理功能,然后完善排序逻辑和查找功能。对于复杂的算法,还需要进一步练习,提升算法的效率和规范性,尤其是手写算法的能力,避免出现逻辑漏洞;类的使用还不够熟练,需要加强练习,解决小数精度偏差的问题。当前的类设计虽然遵循单一职责原则,但在复杂系统的联动逻辑上还存在不足,学会设计更具可扩展性、可维护性的系统,适应更复杂的业务场景。对航空配载的真实业务场景了解还不够深入,仅掌握了基础的配载和配平计算,后续可进一步学习航空配载的相关规范和标准,了解更多真实业务中的细节和需求,让代码更贴合实际应用。完善输入校验功能:在InputValidator类中,新增货物重量的范围校验(如货物重量不能超过对应货舱的剩余载重),提前判断货物是否能装载,避免添加货物后才提示超载,提升程序的交互性。优化货物排序逻辑,作业1将排序逻辑放在LoadManager类中,可迁移到专门的LoadDispatcher类,进一步明确职责划分,让LoadManager类仅负责装载和计算,LoadDispatcher类负责排序和查找,提升代码的可复用性。
五、总结
通过完成三次航空器配载相关作业,我不仅掌握了面向对象编程的核心技巧,也对航空配载的基础业务逻辑有了清晰的了解。在编程方面,掌握了类的单一职责原则、类间关系的设计,学会了写冒泡排序、输入校验、公式计算等技巧,提升了代码的规范性、可读性和鲁棒性;理解方面也得到了提升,从一开始的货物装载,到多货舱管理,再到载重平衡计算,逐步了解了航空配载的全流程。同时,在解决作业中遇到的问题时,我学会了主动排查错误、调试代码,培养了严谨的编程思维,也意识到细节的重要性,一个小小的逻辑错误都可能导致整个程序无法正常运行,尤其是在航空配载这种对准确性要求高的场景中,严谨性至关重要。此外,通过绘制类图、分析SourceMonitor报表,我也学会了梳理代码结构、优化代码性能等技巧。
然后我觉得我还要多去学习一些比较复杂的算法,不能仅仅就靠一些简单的算法,这样写出的代码会很繁杂,然后要多去学习靠自己调试代码来帮助去完成测试点。我觉得我在调试和理解题目这方面还是有点欠缺,而且我不是很能理清类与类之间的关系,写代码的时候有时候不知道应该怎么去写代码,知道的知识和技巧还是太少了,只会一些基础的。
对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见的话,我觉得课程可以多和书上的内容或者是ppt相关联,不仅仅是单纯的去讲知识点因为那样的话可能只能靠听但是不能看到。然后希望作业还有考试啥的能够简单点或者说时间放长一点,因为我这个人就是想题目就要一会时间所以导致我一直写不完...希望作业中可提供更多的测试用例(包括正常数据、边界数据、异常数据),方便在编写代码时进行测试,及时发现问题;
