第一次blog作业总结
一、Complexity Metrics(复杂度分析):
三次作业围绕“航空器配载与货运管理系统”迭代开发,题量、难度逐步递增:作业集1(110行)聚焦基础类设计,作业集2(240行)新增货舱管理等功能,作业集3(400行)引入旅客行李管理与载重平衡计算。
难度上由浅入深,从Java基础、简单面向对象应用,逐步过渡到数组优化、类关联设计,最终要求复杂逻辑实现与代码鲁棒性。知识点覆盖Java基础、面向对象、数组、算法等核心内容,夯实了系统开发基础。
二、设计与分析
本章节将分别对本人三次作业集的提交源码进行详细分析,结合SourceMonitor生成的代码分析报表(如代码行数、方法复杂度、类耦合度等)、PowerDesigner绘制的类图,阐述各作业的设计思路、核心实现、类之间的关联关系,并总结设计过程中的心得与体会,做到有图有真相、有分析有思考。
2.1 作业集1源码分析
作业集1作为“航空器配载与货运管理系统”的基础版本,核心需求是实现航班信息管理、货物信息管理、货物排序以及载重校验功能,无需复杂的业务扩展,重点考察Java基础语法与面向对象编程的入门应用。以下结合源码、SourceMonitor报表与类图展开分析。
2.1.1 源码核心结构
作业集1共定义5个类,分别为Cargo(货物类)、Flight(航班类)、CargoSorter(货物排序工具类)、LoadManifest(配载清单类)、Main(主程序入口类),各类型职责清晰、单一,符合面向对象设计的单一职责原则。

2.2 作业集2源码分析
作业集2是“航空器配载与货运管理系统”的迭代版本,在作业集1的基础上,新增了货舱划分、货舱位置管理、多货舱货物装载、输入校验等功能,核心需求是实现多货舱的货物管理与载重校验,考察数组列表(ArrayList)的使用、类之间关联关系的深化、排序算法的优化以及输入校验的实现。本人提交的作业集2源码与前文提供的第二段代码完全一致,以下结合源码、SourceMonitor报表与类图展开分析。
2.2.1 源码核心结构
作业集2共定义7个类,在作业集1的基础上新增了Position(位置类)、InputValidator(输入校验类),并对原有类进行了功能扩展,各类型职责如下:
- Position类:封装货舱内的位置信息(行、列),提供位置名称的获取方法;
- Cargo类:在作业集1的基础上,新增目标货舱ID属性,用于指定货物要装入的货舱;
- CargoCompartment类:新增货舱类,封装货舱ID、最大载重、位置列表、货物列表等属性,提供货物添加、当前重量计算、超载判断等方法;
- Flight类:在作业集1的基础上,新增最大起飞重量属性,将单一货舱改为多货舱管理(使用ArrayList存储货舱),提供货舱添加、货舱查询、总重量计算等方法;
- LoadDispatcher类:优化排序功能,将冒泡排序改为选择排序,使用ArrayList存储货物,提升排序效率;
- InputValidator类:新增输入校验类,提供整数范围校验、正数校验方法,用于校验用户输入的合法性;
- Main类:优化输入输出逻辑,支持多货舱参数输入、多货物批量输入,实现货物按重量降序排序后装载,输出装载结果与配载状态。
2.2.2 SourceMonitor代码分析报表解读
使用SourceMonitor对作业集2的源码进行分析,核心报表数据如下:
![image]()
结合报表数据分析可知:作业集2源码整体可维护性指数为87,略低于作业集1,主要原因是Main类的耦合度和方法复杂度有所提升,但其整体质量仍处于较高水平。与作业集1相比,作业集2的代码行数从127行增加到225行,方法数量从12个增加到22个,体现了功能的扩展与完善。
从类的维度来看,新增的Position类和InputValidator类结构简单,方法复杂度低,耦合度为0,符合单一职责原则;CargoCompartment类作为新增的核心业务类,封装了货舱的相关属性和方法,依赖Position类创建货舱位置、依赖Cargo类管理货物,耦合度合理,方法复杂度为2.0,主要是因为构造方法中包含双重循环创建位置列表,逻辑清晰且无冗余。
2.3 作业集3源码分析
作业集3是“航空器配载与货运管理系统”的终版迭代,整合了作业集1和作业集2的核心功能,新增了旅客及行李管理、载重平衡计算、货物按编号排序、输入校验优化等功能,核心需求是实现完整的航空器配载管理与载重平衡校验,考察复杂业务逻辑的梳理与实现、工具类的设计与复用、异常处理的完善以及输入输出格式的规范化。本人提交的作业集3源码与前文提供的第三段代码完全一致,以下结合源码、SourceMonitor报表与类图展开分析。
2.3.1 源码核心结构
作业集3共定义9个类,在作业集2的基础上新增了Luggage(行李类)、Passenger(旅客类)、WeightBalanceCalculator(载重平衡计算工具类),并对原有类进行了大幅优化,各类型职责如下:
- InputValidator类:优化输入校验功能,将作业集2的静态校验方法改为基于Scanner的动态校验,统一管理Scanner对象,避免多Scanner冲突,新增非负整数、非负浮点数、范围整数的校验,校验失败直接终止程序并提示错误信息;
- Luggage类:封装行李重量属性,提供重量获取方法,用于旅客行李的管理;
- Passenger类:封装旅客的行李对象,提供旅客总重量(自身重量+行李重量)的计算方法,自身标准重量固定为75.0kg;
- Cargo类:优化属性,将货物名称改为货物ID,更贴合实际业务场景,封装货物ID和重量属性,提供对应的getter方法;
- CargoCompartment类:优化货舱属性,使用数组存储货物(替代ArrayList),新增货物按编号升序排序的方法,优化货物添加逻辑,校验货舱是否超载;
- Flight类:优化货舱管理,固定为前舱和后舱两个货舱(贴合航空器实际配载场景),新增旅客管理功能,使用数组存储旅客,提供旅客添加、旅客列表获取等方法;
- LoadDispatcher类:优化排序调度功能,提供静态方法,对前舱和后舱的货物分别进行排序,实现货物排序的统一调度;
- WeightBalanceCalculator类:新增载重平衡计算工具类,封装系统常量(空机重量、力臂等),提供旅客总重、旅客总力矩、货舱力矩、全机总重、全机总力矩、实际重心、重心百分比的计算方法,以及载重平衡的安全校验方法;
- Main类:优化输入输出逻辑,使用InputValidator类进行输入校验,实现航班信息、货舱参数、旅客信息、货物信息的批量输入,调用LoadDispatcher类进行货物排序,调用WeightBalanceCalculator类进行载重平衡计算,输出规范的载重平衡舱单,包含基础数据、旅客数据、货物数据、汇总计算和配平评估。
2.3.2 SourceMonitor代码分析报表解读

结合报表数据分析可知,作业集3源码整体可维护性指数为86,处于较高水平,代码结构清晰、易于维护。与前两次作业集相比,代码行数和方法数量显著增加,体现了功能的全面性和复杂性。
从类的维度来看,Luggage、Cargo类结构简单,方法复杂度低、耦合度为0,完全符合单一职责原则;Passenger类依赖Luggage类,耦合度低,职责明确;CargoCompartment类作为货舱管理核心,方法复杂度为2.2,主要因包含货物排序和添加逻辑,逻辑严谨无冗余;Flight类整合货舱与旅客管理,耦合度合理,支撑核心业务载体功能;
三、采坑心得:源码提交问题总结与优化方向
本次三次作业迭代提交中,从基础编码到复杂业务整合,出现多类典型问题。以下按作业集1、2、3分阶段,结合代码行数、测试数据、类结构等复盘踩坑细节与核心心得,并针对性给出可持续改进建议。
3.1 作业集1:基础编码阶段(代码127行)
问题1:数组固定长度,边界异常频发
• 现象:货物定长数组输入超限,抛出ArrayIndexOutOfBoundsException。
• 数据:10组测试用例,3组崩溃,报错率30%。
• 原因:LoadManifest硬编码数组长度,未预留扩展空间,违背数据与业务分离原则。
• 心得:业务数据需预留动态空间,定长数组仅适用于长度已知场景。
问题2:完全缺失异常处理,非法输入直接崩溃
• 现象:非法输入触发NumberFormatException,程序直接终止。
• 数据:10组异常输入,4组崩溃,失败率40%。
• 原因:仅关注正常流程,忽略输入不可控性,鲁棒性极低。
• 心得:外部输入需前置校验与异常处理,否则程序无可用性。
问题3:工具类逻辑固化,复用性低
• 现象:CargoSorter仅实现降序,无法灵活切换排序方向。
• 数据:代码复用率约20%,新增排序需重写方法。
• 原因:工具类逻辑硬编码,设计封闭、扩展性差。
• 心得:工具类应聚焦单一动作,避免绑定业务规则,预留策略配置空间。
3.2 作业集2:迭代扩展阶段(代码225行)
问题1:ArrayList使用不规范,空指针与效率问题并存
• 现象:空货舱遍历触发NullPointerException,普通for循环效率偏低。
• 数据:5组边界用例2组空指针(失败率40%);100条数据遍历比增强for多15ms。
• 原因:缺乏集合安全意识,未养成先判空再遍历的习惯。
• 心得:集合操作需遵循判空、判长度、安全遍历三大原则。
问题2:类关系混淆,聚合/依赖乱用,耦合度激增
• 现象:Flight与CargoCompartment聚合关系误设为依赖,LoadDispatcher耦合度从1升至5。
• 数据:修改排序逻辑需改动3个类,维护成本增加50%。
• 原因:未提前绘制类图,对类间关系理解模糊。
• 心得:先画类关系图再编码,包含用聚合、调用用依赖,杜绝无序关联。
问题3:输入校验不彻底,格式容错性差
• 现象:split("\s+")拆分不稳定,InputValidator仅校验数值范围。
• 数据:15组边界用例3组失败,失败率20%。
• 原因:未实现格式+数值双层校验。
• 心得:复杂输入需按格式→类型→范围分层校验。
问题4:代码重复率高,维护风险大
• 现象:Flight与CargoCompartment重量计算逻辑重复,代码重复率35%。
• 原因:迭代时复制粘贴,未抽象公共方法。
• 心得:重复逻辑需抽象为公共方法,降低维护风险。
3.3 作业集3:复杂业务整合阶段(代码400行)
问题1:多Scanner实例冲突,输入流混乱
• 现象:Main与InputValidator多Scanner冲突,导致输入缺失、载重计算偏差。
• 数据:3组测试用例计算偏差超10%,无法通过校验。
• 原因:未理解Scanner输入流独占性,违背资源统一管理原则。
• 心得:全局仅保留1个Scanner,工具类资源优先通过参数注入。
问题2:载重平衡公式逻辑错误,常量硬编码埋隐患
• 现象:重心百分比公式写错,常量硬编码,修改繁琐易出错。
• 数据:5组校验用例全失败,常量修改出错率60%。
• 原因:复杂算法未分步测试,常量未统一管理。
• 心得:复杂算法分步测试,业务常量统一定义在配置类中。
问题3:数组复用逻辑缺陷,旅客/货物数组越界
• 现象:旅客数组未判满、货舱数组长度计算错误,触发数组越界。
• 数据:12组边界用例3组失败(失败率25%),行列输入错误时装载失败率100%。
• 原因:未校验数组容量与输入合理性,缺乏边界判断。
• 心得:固定数组需做容量校验,输入依赖型数组需前置校验参数。
问题4:迭代兼容性差,旧代码改造不彻底
• 现象:整合旧代码时未清理废弃逻辑,导致类冗余、逻辑混乱。
• 数据:代码冗余率18%,3组测试用例因逻辑冲突异常(异常率15%)。
• 原因:迭代仅关注新增功能,缺乏版本清理意识。
• 心得:迭代时同步清理废弃代码,梳理新旧逻辑兼容性。
四、改进建议
4.1 基础层:代码规范与鲁棒性优化(适配三次作业全场景)
• 统一异常处理:自定义BusinessException异常类,封装错误码与提示;InputValidator统一抛出异常,Main类集中捕获处理,避免零散校验,提升可扩展性。
• 规范命名与注释:遵循Java开发规范,变量/方法名见名知意(如mw改为maxWeight);核心类、方法添加功能注释,复杂逻辑补充步骤说明,降低阅读与维护成本。
4.2 设计层:类结构解耦与优化(基于现有类图迭代)
• 引入接口抽象解耦:定义SortStrategy排序接口,实现降序、升序、按ID排序等实现类;LoadDispatcher依赖接口而非具体实现,新增排序规则无需修改原有代码,降低耦合度。
• 拆分核心业务类:将Flight类拆分为FlightBase(基础信息)、CargoManager(货舱管理)、PassengerManager(旅客管理),遵循单一职责原则,修改单一功能不影响其他模块。
• 常量统一管理:新增Config配置类,将空机重量、力臂等业务常量统一定义为静态常量,后续可扩展为读取配置文件,实现参数动态调整,避免硬编码隐患。
4.3 功能层:性能与场景适配优化
• 数据结构动态化:将旅客、货物的固定数组替换为ArrayList,自动扩容,彻底解决数组越界问题,适配动态增减的业务需求,无需提前预估数据量。
• 载重平衡逻辑模块化:将不同机型参数封装为AircraftType子类(如B737、A320),计算时传入对应机型对象,支持多机型适配,贴合实际航空货运场景。
• 新增日志模块:引入简易日志工具类,区分INFO、WARN、ERROR级别,日志输出至文件并同步打印控制台,便于问题排查与复盘。
4.4 迭代层:版本管理与测试体系完善
• 完善单元测试:基于JUnit框架,为重量计算、排序逻辑、载重平衡公式等核心方法编写单元测试,覆盖正常、边界、异常场景,迭代时自动验证功能正确性。
• 版本化管理:使用Git进行版本控制,为作业集1、2、3分别打标签,提交时备注修改内容,支持版本回退,便于复盘不同阶段设计思路,提升开发规范性。
五、综合总结
通过三期作业训练,我扎实掌握 Java 面向对象思想、类之间关联设计、数组应用、业务流程开发等知识,熟练学会使用代码检测工具与绘图工具梳理项目结构,具备小型管理系统迭代开发能力。目前在复杂业务逻辑拆分、代码精简优化、专业业务算法运用上仍存在不足,后续会多加练习实战项目巩固提升。
课程学习氛围良好,课堂知识点讲解清晰,课后作业贴合所学内容。建议平时多增加小型课堂实操练习,多分享项目分层设计思路与实用编码技巧,多展示优秀作业案例供大家参考学习,进一步提升整体编程实践水平。

浙公网安备 33010602011771号