pta blog
前言
课程以航空航班载重配平系统为核心主题,依次布置三道迭代式作业,功能不断叠加完善,从基础货物装载逐步拓展到完整航班数据校验、位置管理、货物排序、载重判定、重心配平计算全流程业务。
整体学习过程循序渐进,知识点覆盖 Java 基础语法、面向对象封装思想、集合容器使用、数据合法性校验、业务逻辑分层设计、边界条件处理、程序输出格式规范等内容。三次作业题量逐次增加,业务逻辑愈发复杂,从单一功能实现走向多类协同联动开发,难度稳步提升。
经过本单元训练,我不仅熟练掌握 Java 日常编码写法,初步建立起面向对象分层设计思维,深刻体会到代码高拓展性、低耦合设计的实际意义,同时自主搭建起简易自动化测试流程,养成先测试再提交的编码习惯。
一、复杂度分析相关概念梳理
本次总结采用专业代码复杂度度量指标对三次作业源码进行客观分析,核心指标定义如下:
1.v (G) 循环复杂度:代表程序独立执行路径总数,数值越大说明分支判断越多,代码越容易出错,调试难度越高;
2.ev (G) 基本复杂度:衡量代码结构化程度,数值越高代表代码结构越混乱,冗余逻辑越多;
3.iv (G) 设计复杂度:体现方法之间的调用耦合程度,数值越高,代码耦合性越强,后期修改牵一发而动全身;
4.OCavg:单个类下所有方法的平均循环复杂度;
5.WMC:类总体循环复杂度,直观反映一个类的整体设计臃肿程度。
借助以上指标,能够精准定位代码臃肿、逻辑混乱、设计不合理的区域,为代码优化提供明确方向。
二、三次作业程序结构设计与源码分析
第一次作业
作业需求
实现基础航班前后舱货物最大载重录入、简单货物录入、基础货物装载判断,仅完成核心装载逻辑,无严格数据校验与重心计算。
实现思路
采用基础实体类拆分设计,定义货物类存储货物编号与重量,货舱类存储最大载重与已装载货物集合,主类完成数据读取与顺序装载判断,满足装载则存入货舱,超载直接终止程序。
代码规模
整体代码体量偏小,仅包含基础实体类与主运行类,方法数量少,整体代码简洁,无冗余逻辑。

复杂度分析
类名 OCavg WMC
Main 2.8 14
Cargo 1.0 2
CargoHold 3.2 16
方法名 v(G) iv(G) ev(G)
CargoHold.addCargo 3 2 1
Main.main 8 6 2
本次作业整体复杂度偏低,仅货舱装载判断方法存在少量分支判断,v(G)、iv(G)均处于较低水平。唯一复杂度偏高的方法为装载判定方法,原因是直接将超载判断、货物存入逻辑写在同一方法内,没有进行功能拆分,存在少量连续if判断。整体代码以功能实现为主,没有进行结构优化,面向对象思想运用较为浅显。
设计心得
首次作业更偏向基础语法练习,实体类仅做简单属性封装,类与类之间依赖关系简单,没有规划统一数据校验流程,所有判断逻辑集中在主方法中,代码拓展性极差,后期新增功能必须大面积修改主程序代码。
第二次作业
作业需求
在首次作业基础上新增大量约束规则:加入航班信息录入、乘客与行李数据录入、严格负数数据拦截、前后舱货物数量范围校验、货物按重量降序排序后再依次装载,完善基础非法输入拦截功能。
实现思路
新增乘客类、行李类完成人员重量统计,编写独立数据校验工具类统一拦截负数、超限数值;创建货物排序工具类,通过冒泡排序完成货物重量降序排列;严格按照排序结果依次完成前后舱货物装载,违规输入直接提示并退出程序。
代码规模
代码量明显提升,新增工具类、多类实体结构,方法划分更加细致,业务流程分为数据录入、数据校验、货物排序、货物装载四大模块。

复杂度分析
类名 OCavg WMC
Main 3.5 21
InputCheck 1.8 9
LoadSort 4.2 13
Flight 1.5 6
Passenger 1.2 5
CargoHold 3.3 17
方法名 v(G) iv(G) ev(G)
LoadSort.sort 5 4 1
InputCheck.rangeCheck 3 2 1
Main.main 10 7 3
CargoHold.addCargo 3 2 1
本次作业复杂度明显上升:
1.数据校验工具类内部判断条件增多,多类型数值校验堆砌,拉高整体循环复杂度;
2.货物排序方法嵌套双层循环,v(G)数值显著提高;
3.航班统筹调度方法调用大量其他类方法,iv(G)设计耦合度偏高;
4.装载提示输出方法加入格式限定语句,大量格式判断导致代码结构臃肿。
设计心得
本次作业开始正式运用面向对象思想进行分层设计,将通用功能抽离为工具类,实现代码复用。但依旧存在明显缺陷:工具类方法过于集中,单一校验方法承担多种校验功能;装载逻辑与提示文案绑定过深,修改输出格式需要改动核心业务代码。
第三次作业
作业需求
最终完整版综合作业,在前两次所有功能之上全面升级:新增货舱行列位置初始化、严格 Position 位置创建规则、完整航班重心配平计算公式、重心百分比判定、标准舱单格式化输出、精准超载提示文案与数值展示,同时完善全部边界测试场景适配。
实现思路
新增位置实体类,严格按照行列序号从 1 开始初始化货舱存放位置;整合全部重量数据,代入题目给定固定常量完成空机重量、乘客力矩、货物力矩、总力矩、重心位置、重心百分比全套运算;划分安全重心区间,自动判定配平安全 / 危险状态;统一规范所有输出语句格式,精准匹配评测输出要求。
代码规模
三次作业中体量最大,实体类齐全,工具类功能完善,业务逻辑分层清晰,涵盖输入、校验、排序、装载、位置初始化、力学运算、格式化输出全流程。
类图结构

复杂度分析
表格
类名 OCavg WMC
Main 4.1 29
Position 1.0 2
Cargo 1.1 3
Luggage 1.0 2
Passenger 1.3 4
CargoHold 3.8 23
Flight 2.0 10
InputCheck 1.8 9
LoadSort 4.3 13
CalcBalance 5.6 34
方法名 v(G) iv(G) ev(G)
CalcBalance.printInfo 12 9 4
CalcBalance.calcCG 7 5 2
CargoHold.addCargo 3 2 1
LoadSort.sort 5 4 1
Main.main 11 8 3
本次作业复杂度分析:
1.货舱位置初始化方法采用双层循环遍历,循环层级多,循环复杂度偏高;
2.重心力矩计算方法整合多组常量运算与多类重量数据调用,方法内部运算逻辑密集;
3.格式化舱单输出方法存在大量条件适配语句,用于区分不同数据状态输出内容,结构较为繁琐;
4.逐件货物装载判断方法需要先预判载重再执行存入操作,分支逻辑进一步增多。
5.结合三次作业复杂度变化总结优化方向:将同类功能继续拆分细化,利用封装特性隔离属性访问,借助继承与多态统一规范通用行为;把超长判断语句拆分为多个独立子方法,让一个方法只负责一项具体功能,从根源降低代码循环复杂度与耦合度。
设计心得
第三次作业完全贴合小型业务项目开发模式,类之间聚合、组合关系清晰,整体架构趋于成熟。提前梳理实体关系再进行编码,极大减少后期修改工作量,但在常量统一管理、提示语句统一封装上依旧存在不足,代码仍有较大精简优化空间。
三、公测、互测与 Bug 详细分析
第一次作业 Bug 情况
1.公测
程序基础装载逻辑无正确性错误,仅存在输出细节不规范问题,未优化多余符号输出,丢失部分格式分数。
2.互测
被测出少量边界漏洞,仅考虑常规货物装载场景,未预留无货物、无乘客等空数据适配逻辑;同时在互相评测过程中,发现多数同学存在未提前判断载重直接存入货物的逻辑错误。
3.测试方式
手动构造常规装载、轻量超载简单测试用例,肉眼核对运行结果完成校验。
第二次作业 Bug 情况
公测
核心业务逻辑全部正确,失分点集中在数据校验范围不全,仅拦截负数数据,遗漏货物数量超限判断,导致范围非法测试用例无法通过。
互测
自身代码问题:货物排序逻辑不稳定,同等重量货物排序顺序混乱;输入校验方法调用不统一,部分数据绕过校验直接录入;
发现他人高频 Bug:货物未排序直接装载、乘客总重量计算遗漏基础 75kg 固定体重、行李重量未做负数拦截。
测试方式
搭建简易数据批量录入脚本,批量生成合法与非法数据,快速检测校验漏洞。
第三次作业 Bug 情况
1.公测
重心计算公式常量数值书写失误、力矩运算顺序颠倒,导致重心百分比计算偏差;超载提示数值展示错误,错误输出装载完成后重量,而非装载前已有载重,前后舱容量不足测试点持续失分;Position 位置行列初始化序号错误,行列相关测试用例全部判定失败。
2.互测
自身代码前期存在大量适配性 Bug,经过多次调试修改后最终无遗留漏洞;排查发现他人典型 Bug:
重心安全区间判定逻辑颠倒,25%~38% 区间内外结果判断相反;
超载提示文案格式与题目标准不一致,标点、句式存在偏差;
行列位置从 0 开始创建,不符合题目 Position 规范要求;
常数求导类同类错误延伸:固定常量手写错误,直接导致最终运算结果全部偏移。
3.测试方式
采用自动随机生成测试数据 + 手动构造极限边界用例结合模式,批量代入数值验证重心计算结果,针对性测试超载、极值、空数据、临界数量等高难度场景。
四、采坑心得
1.输入数据校验是最核心失分点前期拆分校验逻辑不彻底,仅做部分数据负数拦截,遗漏货物数量范围、行列数值、货物重量多重校验,不同输入数据调用不同校验方法,极易出现遗漏。后期统一封装全局校验工具类,所有输入强制走校验流程,从源头杜绝非法数据流入业务逻辑。
2.货物装载顺序与判断逻辑极易出错多次出错根源在于装载逻辑顺序颠倒:先累加重量再判断超载,完全违背题目单件依次装载的核心规则;同时超载提示数值混淆装载前、装载后重量,直接导致容量不足测试点全部报错,严格遵循先判断、后存入流程后问题彻底解决。
3.固定公式与常量严禁自主修改航班重心配平所有力臂数值、空机固定重量、安全重心区间均为题目给定固定值,自行修改数值、调换运算顺序都会造成最终结果全盘错误,必须逐字逐句对照需求抄写公式与常量。
4.Position 位置创建规则容易忽略日常编码习惯从 0 开始遍历行列,而作业明确要求行列序号从 1 开始初始化,细微序号差异直接导致整套位置相关测试用例全部失败,细节规范必须严格遵守题目要求。
5.输出格式优先级等同于功能正确性三次作业多次出现功能逻辑完全正确,但空格、换行、提示语句、小数保留位数不达标被判答案错误,评测系统对输出文本匹配度要求极高,不能随意简化修改标准输出语句。
6.代码臃肿带来连锁 Bug将多项业务逻辑堆砌在同一个方法内,不仅复杂度飙升,后期修改一处逻辑就容易引发多处连带错误,代码可读性大幅下降,调试排错耗时成倍增加。
五、代码改进优化建议
架构层面优化建立全局常量统一管理类,将空机重量、各类力臂数值、重心安全区间、固定体重等全部常量集中存放,修改维护一键完成;拆分超级大方法,严格遵循单一职责原则,排序、装载、计算、输出各自独立成方法。
业务逻辑优化新增货物智能调配逻辑,前舱超载自动判定存入后舱,提升程序实用性;优化重心化简判定逻辑,统一全局小数保留精度,避免运算精度丢失造成临界值判定失误;增加空数据友好提示,适配无乘客、无货物、零重量等特殊场景。
代码耦合性优化进一步解耦实体类与工具类,实体类只负责属性定义与基础取值赋值,所有运算、判断、调度功能全部交由工具类完成;运用封装特性私有化全部成员变量,通过 get/set 方法统一访问,避免属性随意篡改引发数据错误。
测试体系优化完善自动化测试脚本,批量生成合法数据、非法负数数据、超限数量数据、极限载重数据;搭建结果对比程序,自动比对程序运行结果与标准结果,减少人工核对时间;留存高频错误测试用例,形成个人错题测试库。
拓展性优化预留新增货舱、新增旅客类型、新增货物类型拓展接口,后续增加需求无需重构主体代码,直接新增实体类与对应实现方法即可快速迭代。
六、单元整体学习总结
1.个人学习收获
经过本单元三次迭代式作业训练,我彻底夯实 Java 全套基础语法,熟练掌握集合容器使用、实体类设计、多层类之间调用协同;成功建立标准面向对象编程思维,学会从现实业务场景拆分程序结构;充分认识到代码规范、分层设计、低耦合高内聚在实际开发中的重要价值;同时熟练掌握手动造测试用例、批量测试、Bug 排查调试等实用技能,具备基础小型业务程序独立开发能力。
2.自身存在不足
面对复杂多分支业务逻辑时,代码拆分能力依旧薄弱,容易出现方法臃肿问题;设计模式运用较为生疏,工厂模式、接口多态等进阶 OO 思想未能灵活运用;对于程序性能优化、代码精简化简思考较少,代码冗余现象普遍存在;边界场景预判不够全面,总是在评测报错后才能发现隐藏漏洞。
3.后续学习规划
后续重点深耕面向对象进阶知识,吃透接口、抽象类、多态、常用设计模式核心用法;加强递归、树形结构、复杂表达式解析等高难度逻辑练习;主动学习代码优化技巧,有意识降低代码复杂度;坚持编码前梳理流程、绘制简易类图,养成规范化编码习惯。
课程与教学相关建议
1.课堂教学中可以结合本次航班载重实战案例,现场演示从需求拆分到类图设计再到代码编写的完整流程,帮助大家快速建立业务设计思维;
2.课后可以组织优秀代码结构分享活动,互相借鉴分层设计、逻辑拆分的优秀写法;
3适当开放自测评判标准,让同学们提前对照输出格式、判定规则自查自纠,减少正式提交失分。

浙公网安备 33010602011771号