作业集1~3的总结性Blog

一.前言
这三次作业围绕航空器配载与货运管理系统迭代展开java编程,展示出难度递进的一个过程,完整串联起java面向对象基础,类与对象,封装思想,单一职责原则,类图,常用工具类,基础算法逻辑等核心课程知识点,是对课堂理论知识的全面实操检验,让我在反复编码、调试、修改的过程中,逐步掌握面向对象编程的核心思路和实操技巧,将课堂上抽象的语法知识、设计原则,转化为可落地、可运行的实际程序。
从题目题量难度来看,每一次都只有一道题,作业集1以基础语法,类图,类与对象的实现,类与类之间的关系为主,难度一般,侧重基础面向对象;作业集2在1的基础上,增加了多货物多货舱,起飞重量以及货物的排序输出,功能上更完善复杂,语法上也提升,难度提高,已初见端倪;作业集3继续迭代,功能上要求更多,代码直接有三百多行,比如增加了力矩,实际重心,重心百分比,配平评估等较复杂的工具类,最难的应该是测试点隐藏,难以通过所有的测试点。

二.设计与分析
1.作业集1

类结构:Flight航班类 Cargo货物类 CargoSorter排序类 LoadManifest配载单类 Main主类
Flight与LoadManifest是1对1的关联关系,即一个LoadManifest只能对应一个Flight;
Cargo与LoadManifest是聚合关系,聚合关系是 “整体与部分” 的关系,即一个舱单有多个货物,用list;
LoadManifest与CargoSorter是依赖关系,即CargoSorter被临时调用;

通过类图清晰可见
oop1

通过代码质量分析,整体结构非常简单。除了Main类的main()方法(圈复杂度 7,语句数 24)和CargoSorter的sortCargo()方法(复杂度 4)外,其余方法复杂度均为1,几乎无业务逻辑嵌套。但核心问题是业务逻辑过度集中在main()方法中,扩展性较差。
QQ_1779106531968

设计分析:完全标准封装:private + getter;遵循SRP原则:货物、航班、排序、装载互不干扰;使用 ArrayList完成货物存储与排序;采用选择排序实现重量降序;输入上采用nextLine()处理换行

2.作业集2

类结构:Flight航班类 Cargo货物类 CargoCompartment货舱类 LoadDispatcher调度排序类 Main主类 Position位置类 InputValidator校验类(多了货舱类,位置类,校验类,其中货舱类是核心类)

通过类图清晰可见
oop2

这是项目1的进阶扩展版本,新增了CargoCompartment货舱类 LoadDispatcher调度排序类 Main主类 Position位置类 InputValidator校验类等多个类,职责划分明显更合理。最高圈复杂度仅为4(sortCargo()方法),而且业务逻辑被拆分到了对应的模块中。新增了货舱分区、位置管理、输入校验等功能,为航班货物装载的分区管理打下了基础,整体可维护性和扩展性相比项目1有了显著提升,更贴近真实的装载调度场景。
QQ_1779106650231

设计分析:多层集合嵌套:航班→货舱→货物;支持按目标货舱装载;双层循环生成货舱坐标;按重量降序后分配;支持多条件状态判断:超载/起飞重量/业载重量

3.作业集3

类结构:Position Cargo CargoCompartment Flight LoadDispatcher Main Passenger旅客类 Luggage行李类 WeightBalanceCalculator配平计算类 InputValidator输入校验类(其中配平计算类是核心)

通过类图清晰可见
oop3

这是三个项目中功能最完整、结构最完善的版本,在项目2的基础上新增了Passenger、Luggage、WeightBalanceCalculator等类,覆盖了航班配载的核心业务流程。最高圈复杂度为WeightBalanceCalculator的calculate()方法(复杂度 5),仍处于可控范围,且被封装在独立类中,不影响其他模块。整体实现了货物、货舱、旅客、行李的统一管理,以及关键的重量平衡计算功能,类的职责高度单一,模块间耦合度低,既满足了真实航空配载系统的业务需求,也具备良好的可维护性和可测试性。
QQ_1779106733275

设计分析:加入旅客、行李重量;加入前货舱 + 后货舱分配机制;实现力矩、重心、% MAC配平计算;全套输入校验:负数、范围、容量超限;

三.采坑心得
第三次作业作为难度最高的一次,也是我踩坑最多的一次,即便代码的基础逻辑无误,依旧有一半的测试点无法通过,排查问题的过程非常艰难,让我深刻认识到,编程不仅要实现功能,更要考虑到各种边界情况和隐藏测试场景。其中,有两个测试点无法通过,经过反复调试和排查,发现问题出在排序类上,题目要求保留 LoadDispatcher 排序类的结构,但实际运行过程中,若执行排序操作,会导致货物分配顺序异常,从而影响测试结果,删除排序调用后,这两个测试点顺利通过。我认为这属于题目设计的小瑕疵,迭代作业中没有明确说明该类无需启用,但要求保留类结构,导致我在初期调试时,一直没有意识到排序功能会影响测试结果,浪费了大量的时间排查。
还有一个测试点无法通过,是因为数值范围判断错误,题目中对某个参数的范围描述存在歧义,容易产生误导,导致我编写的范围校验逻辑与测试用例的预期逻辑不一致,经过多次尝试不同的范围判断,结合测试结果的反馈,才最终修正了范围校验逻辑,顺利通过该测试点。
最难处理的是两个隐藏测试点,这两个测试点没有对应的案例参考,题目中也没有明确说明相关的测试场景,导致我在初期调试时,完全没有想到会有这样的测试情况。这两个测试点的核心要求是:当货舱剩余容量不足时,仅输出警示信息并立即终止程序,不执行后续的货物装载和输出操作,但我最初编写的代码,仅在货物添加时校验容量,若容量不足,拒绝添加货物,但不会终止程序,后续的输出操作依旧会执行,导致测试结果不符合预期。
为了排查这个问题,我尝试自行设计测试用例,反复调试代码,最终发现问题所在:需要在货物添加前,提前校验货舱剩余容量,若容量不足,直接输出警告并终止程序,而不是在添加时拒绝。例如,我设计了一组测试用例:
CA1234
5
8
0
10
12
8000
3
100
200
80
3
1
1
1000
2
2500
3
1200
这组测试用例中,前货舱的最大载重量被设置为 0,此时添加重量为 1000kg 的货物,按照要求,程序应该直接输出 “!!! 警告:[1] 剩余容量不足 (当前载重 0.0/0.0kg),请重新分配或减轻重量!”,并立即终止程序,不再执行后续操作。但我最初的代码中,addCargo 方法会拒绝超重货物,货物无法添加,货舱重量始终为 0,不会触发警告和程序终止,因此测试点无法通过。修正逻辑后,在添加货物前提前判断货舱剩余容量,若添加货物后会超过最大载重,直接输出警告并终止程序,无需执行添加操作,此时测试用例运行正确。我又设计了另一组测试用例,验证修正后的逻辑:
CA1234
5
8
5000
10
12
2500
3
100
200
80
3
1
1
1000
2
2500
3
1200
这组测试用例中,后货舱的最大载重量为 2500kg,当添加完重量为 2500kg 的货物后,再添加重量为 1200kg 的货物时,提前校验发现剩余容量不足,程序输出 “!!! 警告:[2] 剩余容量不足 (当前载重 2500.0/2500.0kg),请重新分配或减轻重量!”,并立即终止程序,运行结果完全符合预期,这两个隐藏测试点也顺利通过。通过这个问题,我深刻认识到,编程时要充分考虑各种边界情况,不能只满足于 “正常场景下能运行”,还要主动思考异常场景、极端场景,才能确保程序的稳定性和可靠性。

还有前两次的格式问题,不会弄,是不知道nextInt()只读数字不读换行符,所有要再加一个sc.nextLine()吸收换行符,此时再用sc.nextLine()就可以正确读取字符串了,否则sc.nextLine()读到换行就结束了;同时了解到用sc.next()可以跳过换行避免换行问题,但由于题目要求还是不用。所有大多数时候应该用sc.next()。

另外,在作业集 2 中,需要读取一行多组数据,并进行拆分和类型转换,例如:
String [] parts=sc.nextLine ().split (" ");
double maxWeight=Double.parseDouble(parts[1]);
int row=Integer.parseInt(parts[2]);
最初我对 split ("") 方法和类型转换函数不熟悉,不知道如何将一行字符串拆分为多个部分,也不知道如何将字符串转换为 double、int 等数值类型,导致这部分代码无法正常运行。后来,通过查阅资料、模仿示例代码,我逐渐掌握了 split (" ") 方法的使用,知道了该方法可以根据空格将字符串拆分为字符串数组,再通过 Double.parseDouble ()、Integer.parseInt () 等函数,将字符串数组中的元素转换为对应的数值类型,实现了批量输入数据的高效处理。经过多次实操练习,我现在已经能够熟练运用这些方法,处理各种复杂的输入场景,这也让我认识到,编程技能的提升离不开反复练习,很多不熟悉的方法和语法,通过多写、多用,就能逐步掌握。

还有一个问题,是在编写测试类时遇到的,最初我觉得编写测试类比较棘手,不知道如何设计测试用例、如何调用相关方法、如何验证程序运行结果,导致调试效率很低,很多逻辑漏洞无法及时发现。后来,我总结出了一个简便的调试思路:严格按照 “输入→创建对象→添加数据→调用方法→输出结果” 的顺序编写测试代码,先模拟用户输入,创建对应的航班、货舱、货物、旅客等对象,再调用相关的添加、排序、计算等方法,最后打印输出结果,对照预期结果,判断程序是否运行正确。这种调试思路逻辑清晰、步骤明确,能够快速排查逻辑漏洞,提高调试效率,也让我明白了,编写测试类的核心是 “模拟真实运行场景”,只有按照实际的业务流程进行测试,才能发现潜在的问题。

四.改进建议
1.代码书写要规范,格式清晰,增加注释,便于自己和他人看懂
2.排序采用工具类,统一使用 Collections.sort 简化排序
3.增加空指针防护 if(targetCmp == null) continue;
4.常量统一管理,如配平计算的固定值,统一放到常量类。

五.总结
我学到了标准面向对象封装设计,多层类协作系统架构,集合嵌套使用,输入处理、校验、异常防范,复杂业务逻辑拆解,专业航空配平、重心、力矩计算,模块化、职责分离思想,从需求 → 设计 → 编码 → 调试 → 输出完整流程。整个类与对象从易到难,从简到繁的过程,我通过迭代作业有所掌握。

同时我也意识到我的不足,注释不够完善,异常处理可以更全面,大型业务建模经验仍需加强,代码考虑不周全,没有达到很熟悉的地步,写起来还是比较艰难的,对于专业知识平时时间花的不够,学艺不精,练习的也很少,要多学多想多写,日积月累技术掌握的才会越来越多。同时知道行业真相:真实用户的输入不可预知,没有“公开数据”供我适配。要摒弃“看数据改代码”的投机取巧,养成“深挖需求、严谨设计边界”的工程习惯。

对课程讲解上我其实有想说的,就是希望教师讲课能有顺序的讲,从易到难,同时应该多让我们跟着练习代码,因为很多同学语法上都会存在问题,如果在和老师一起敲代码的过程中就能避免掉这些问题,是很好的,或者讲解完一部分后写个例子,再让同学们自己写,我觉得这种亲自写才是最关键的,课上学习的东西才掌握了。同时老师不能只说不写,应该有ppt,有同学们要掌握的语法技巧及一些归纳总结。我认为这是一个慢慢来的过程,应该按照学习的顺序来,而不是说“以后你们怎样怎样”,讲到后面的知识去,容易让同学产生焦虑,并且之后的知识难且没有练习,学生早晚是会忘的,个人觉得这不是学生的问题,某个阶段掌握某个阶段的知识,这样应该会学的更明白更清楚更扎实。

总的来说,这三次作业的迭代学习,让我收获满满,不仅掌握了java面向对象编程的核心知识和实操技能,更培养了自己的编程思维和问题解决能力,也认识到了自己的不足和努力方向。后续,我会继续努力,弥补不足,多练习、多总结,逐步提升自己的编程能力,为后续更深入的java学习和编程实践奠定坚实的基础。

posted @ 2026-05-18 20:34  givemeagem  阅读(8)  评论(0)    收藏  举报