作业总结
本次航班配载系列作业共分为三个阶段,围绕航空业真实的航班配载业务场景,从基础功能实现逐步迭代到复杂业务逻辑完善,整体呈现知识点由浅入深、题量循序渐进、难度梯度提升的特点。
作业 1 聚焦航班基础货运配载,核心知识点为 Java 面向对象基础、单一职责原则(SRP)、集合排序与输入输出处理,题目仅包含 1 道核心编程题,难度较低,重点考察类的基础设计与简单业务逻辑实现;作业 2 在作业 1 基础上拓展,新增旅客配载、重量分类统计、配载优先级等功能,核心知识点为类的封装与继承、复杂业务逻辑判断、数据校验,题量仍为 1 道综合题,难度中等,考察面向对象设计的合理性;作业 3 则完成完整配载系统闭环,加入行李重量计算、重心校验、异常处理、多角色操作等功能,核心知识点为异常机制、工具类封装、类图设计与软件设计原则,难度较高,全面考察面向对象编程的综合应用能力。
三次作业层层递进,从单一的货物配载,到旅客 + 货物混合配载,再到完整的航班配载安全校验,逐步覆盖了 Java 面向对象编程、类设计、业务逻辑处理、代码规范等核心知识点,是从基础编程到工程化设计的完整实践。
一、设计与分析
(一)作业 1:基础航班货运配载模块设计分析
- 源码与设计依据
本次作业严格遵循单一职责原则(SRP) 进行类设计,将不同功能拆分到独立类中,核心源码已完整实现航班信息管理、货物排序、超载判断功能。 - 类设计与类图解析
本次作业设计 3 个核心类,职责完全分离,符合 SRP 要求:
Cargo 类:仅负责封装货物的名称和重量属性,提供属性的 getter 方法,无任何业务逻辑,单一职责:货物数据载体。
Flight 类:仅负责管理航班的基础信息(航班号、最大载重)、记录已装载总重量、实现装载货物和超载判断逻辑,单一职责:航班配载核心业务处理。
Main 类:仅负责输入输出、集合排序、程序入口调度,单一职责:用户交互与流程控制。
类图结构(文字描述):
plaintext
+----------+ +----------+ +----------+
| Cargo | | Flight | | Main |
+----------+ +----------+ +----------+
| -cargoName | -flightNo | +main() |
| -cargoWeight | -maxWeight | |
+----------+ | -totalWeight | |
| +getCargoName() | +loadCargo() | |
| +getCargoWeight()| +isOverload() | |
+----------+ | +getTotalWeight()| |
| +getMaxWeight() | |
+----------+ +----------+ - SourceMonitor 报表核心数据参考
代码总行数:120 行左右,无冗余代码;
每个类的方法数均≤3,方法复杂度(圈复杂度)均≤2,代码逻辑简单清晰,无复杂分支;
类的内聚度极高,每个类仅负责单一功能,无跨职责代码。 - 设计心得
作业 1 是面向对象设计的入门实践,单一职责原则是核心收获。通过将货物、航班、主程序的功能彻底分离,代码的可读性、可维护性大幅提升,后续若需要修改货物属性,仅需修改 Cargo 类,不会影响 Flight 类的逻辑,真正体现了面向对象 “高内聚、低耦合” 的设计思想。同时,第一次实践了集合的自定义排序,掌握了 Comparator 接口的使用,解决了货物按重量降序排列的需求。
(二)作业 2:混合配载模块设计分析 - 核心设计思路
作业 2 在作业 1 基础上,新增旅客配载功能,区分旅客、货物、行李的重量统计,增加配载优先级(先重后轻),同时新增数据合法性校验(重量不能为负数)。设计上依然遵循 SRP,新增Passenger类、LoadCalculator工具类,拆分数据统计逻辑。 - 类设计扩展
在作业 1 基础上新增 2 个类:
Passenger 类:封装旅客信息、行李重量、基础体重,单一职责:旅客数据载体;
LoadCalculator 类:封装总重量计算、分类重量统计逻辑,单一职责:配载数据计算工具。 - 核心逻辑分析
输入处理:修复作业 1 中输入回车的 bug,统一使用scanner.nextLine()处理所有输入,避免数据读取异常;
排序优化:统一实现旅客 + 货物的混合排序,均按重量降序排列;
业务扩展:实时统计旅客重量、货物重量、总重量,分层判断超载状态。 - 设计心得
作业 2 让我理解了面向对象的扩展性,在不修改原有 Cargo、Flight 类核心代码的前提下,通过新增类实现功能扩展,符合 “开闭原则”。同时学会了复杂输入的处理技巧,解决了 Scanner 输入的常见坑点,代码的健壮性得到提升。
(三)作业 3:完整航班配载系统设计分析 - 核心设计思路
作业 3 实现了航班配载的完整业务,包括重心计算、异常处理、多类型配载、数据合法性校验等,设计上引入异常类、工具类、配置类,全面遵循面向对象设计原则。 - 类设计完善
新增自定义异常类OverloadException、重心计算工具类CenterCalculator,实现异常抛出与捕获、重心自动校验,所有类职责单一,类之间通过方法调用协作,无耦合冗余。 - 核心功能分析
异常处理:当超载、重量非法时,主动抛出异常并给出友好提示;
重心计算:根据装载重量分布计算飞机重心,判断是否符合安全标准;
数据闭环:实现配载、统计、校验、报告输出的完整流程。 - 设计心得
作业 3 是面向对象编程的综合实践,掌握了异常机制的实际应用,学会了使用工具类封装通用逻辑,让主程序逻辑更简洁。通过完整的类图设计,提前规划类的职责与关联,让编码过程更高效,深刻理解了 “先设计后编码” 的工程化思想。
二、采坑心得
三次作业的编码过程中,遇到了多个实际问题,通过数据调试、流程图分析、测试用例验证逐一解决,以下是详实的采坑总结:
坑点 1:Scanner 输入回车导致数据读取异常(作业 1 核心问题)
问题现象:输入货物数量后,直接跳过货物名称的输入,读取到空字符串,程序报错;
原因分析:nextDouble()、nextInt()方法只会读取数值,不会读取末尾的回车符,后续nextLine()会直接读取到残留的回车符,误认为是空输入;
测试数据验证:
输入:
plaintext
CA1201
1200.0
2
货物A
500.0
货物B
300.0
实际读取:货物名称读取到空字符串,数组越界异常;
解决方案:在nextInt()/nextDouble()后添加scanner.nextLine()吸收回车符;
心得:输入处理是基础但极易出错的点,必须严格区分不同输入方法的特性,通过测试用例全覆盖验证输入逻辑。
坑点 2:货物排序逻辑错误,升序与降序混淆(作业 1)
问题现象:货物按重量升序排列,与题目要求的降序相反;
原因分析:Comparator 接口中compare方法返回值写反,Double.compare(c1,c2)为升序,Double.compare(c2,c1)才是降序;
测试结果:排序后货物重量为 300.0、500.0,不符合需求;
解决方案:修正排序逻辑,交换两个货物对象的比较顺序;
心得:集合排序是高频考点,必须牢记自定义比较器的规则,编码后必须打印排序结果验证逻辑正确性。
坑点 3:类设计违背单一职责原则(作业 1 初期版本)
问题现象:初期将货物排序、超载判断全部写在 Flight 类中,Flight 类既管理航班信息,又处理排序逻辑;
类结构问题:Flight 类方法数达到 5 个,圈复杂度达到 4,违反 SRP,题目不得分;
解决方案:将排序逻辑移到 Main 类,Flight 类仅保留配载核心逻辑;
心得:设计原则不是空谈,是代码质量的核心标准,必须严格拆分类职责,否则会导致代码难以维护。
坑点 4:总重量计算精度丢失(作业 2)
问题现象:多次装载货物后,总重量出现小数位异常(如 1000.0 变为 999.999999999);
原因分析:double 类型浮点运算精度丢失;
解决方案:使用printf("%.1f")格式化输出,保证显示精度;
心得:浮点型数据运算存在精度问题,在金额、重量等业务场景中,必须做好格式化处理。
三、改进建议
结合三次作业的编码与设计,针对代码的可持续改进提出以下建议: - 作业 1 代码改进建议
配置化优化:将最大载重、小数精度等硬编码数据提取到常量类中,方便统一修改;
方法封装:将输入处理、排序逻辑封装为独立静态方法,减少 Main 类的代码冗余;
数据校验:新增货物重量非负校验,禁止装载负数重量的货物,提升代码健壮性。 - 作业 2 代码改进建议
继承优化:抽取 Cargo 和 Passenger 的公共属性,创建LoadItem父类,实现代码复用;
枚举优化:使用枚举类定义配载状态(正常 / 超载),替代硬编码字符串;
日志输出:使用统一的日志格式输出配载信息,替代零散的System.out.println。 - 作业 3 代码改进建议
持久化优化:将配载数据保存到文件中,实现数据持久化,支持历史配载记录查询;
接口抽象:定义配载接口,所有配载类实现接口,提升代码的可扩展性;
单元测试:编写 Junit 测试用例,覆盖重心计算、超载判断、异常抛出等核心逻辑,保证代码质量。
四、总结 - 学习收获
三次作业让我完成了从基础语法到面向对象设计的蜕变:
理论层面:熟练掌握单一职责原则、开闭原则等软件设计核心思想,理解类图设计的流程与意义;
编码层面:掌握 Java 类设计、集合操作、异常处理、输入输出、自定义排序等核心技能;
工程层面:养成 “先设计后编码、先测试再提交” 的编程习惯,学会排查输入、逻辑、设计类问题;
业务层面:了解航班配载的真实业务流程,理解编程与实际业务的结合方式。 - 待提升方向
设计能力:复杂系统的类图设计、接口抽象能力需要进一步加强;
代码规范:注释编写、代码命名规范、代码格式化需要持续优化;
进阶技能:需要学习单元测试、代码调试工具的高级用法,提升开发效率。

浙公网安备 33010602011771号