面向对象设计与构造--第一单元总结

前言
本学期面向对象程序设计课程围绕航空器货运配载与载重平衡真实场景,连续布置三次迭代式编程作业。三次任务从简单到复杂、从单一货舱到多货舱、从纯重量计算到重心平衡专业航空计算,完整复刻了一次工业级软件从需求到实现、从简单模型到复杂系统的开发过程。

三次作业总体难度逐级提升:
第一次作业:基础单一货舱配载,熟悉 Java 基础、类设计、集合使用、简单排序,属于入门级任务;
第二次作业:多货舱、货舱网格、货物装载、状态判断,引入聚合、组合关系、多类协作;
第三次作业:引入旅客、行李、力矩、重心、MAC 百分比、安全判断,属于航空专业算法 + 复杂类设计的综合大作业。

第一次作业
作业要求:
输入航班号、最大载重、货物数量,按重量从大到小装载,输出货物信息、总重量、超载状态。
实现方式:
Scanner 读取输入→实例化 Flight、Cargo 对象→存入 LoadManifest→调用排序工具→遍历输出→计算总重量并判断超载。
代码规模:
image
类图:
image
复杂度分析:
image
整体复杂度较低,仅print()方法因输出格式判断多,复杂度偏高;设计符合单一职责,类间耦合度低,无冗余逻辑。
Bug 分析
公测情况
程序逻辑无正确性错误,所有基础用例均通过;但输出优化不足,遗漏-1kg、1kg省略规则,导致部分性能点未满分。
互测情况
被测出 1 个核心 Bug:多个 0 重量货物叠加时,输出为空而非0kg。
原因:仅处理单个 0 重量货物合并,未考虑多个 0 项叠加场景,边界逻辑缺失;
修复:合并同类项时,遍历所有货物,若总重量为 0,统一输出0kg。
测试方法
手动构造边界用例:空输入、0 重量、负数重量、极值重量;
随机生成货物数据,验证排序稳定性与输出正确性;
代码走查,重点排查边界条件判断逻辑。

第二次作业
作业要求
在第一次作业基础上迭代扩展:支持前舱、后舱等多个独立货舱,每个货舱有专属最大载重、行列网格;货物需指定目标货舱,按重量降序装载,输出单舱装载结果、货舱状态、航班整体配载状态。
实现方式
严格遵循单一职责(SRP),拆分 6 个核心类,明确聚合 / 组合关系:
Flight(航班类):管理多个货舱列表;
CargoCompartment(货舱类):封装舱 ID、最大载重、行列网格、货物列表;
Position(位置类):封装货舱行列,与 CargoCompartment 为组合关系(舱销毁,位置同步销毁);
Cargo(货物类):继承原有设计,与 CargoCompartment 为聚合关系(货物独立,舱仅引用);
LoadDispatcher(调度工具类):实现货物降序排序、目标舱匹配;
CargoLoader(装载工具类):实现单舱装载、容量校验。
数据流程:输入航班 + 货舱 + 货物→实例化对象→调度排序→按舱装载→校验容量→输出结果。
代码规模
image
类图
image
复杂度分析
image
复杂度结论:核心业务方法复杂度可控,仅printStatus()因多舱遍历、格式判断复杂,复杂度偏高;类间耦合度适中,无高依赖设计。
Bug 分析
公测情况
无正确性错误,基础 / 边界用例均通过;但货舱容量校验逻辑不严谨,部分极限用例失分。
互测情况
被测出 4 个 Bug,均为设计 / 细节疏漏:
HashMap.remove () 失效:自定义货物键未正确重写equals()与hashCode(),无法匹配移除;
正则匹配错误:空白字符检测误用matches(),未用find(),非法空白无法识别;
排序不稳定:同重量货物未按输入顺序排列,排序逻辑分支缺失;
舱容量计算错误:货物重量累加遗漏,导致超载判断失误。
测试方法
1.多舱交叉测试、极限容量测试;
2.正则边界用例测试,覆盖空白、特殊字符;
3.代码走查,重点排查equals()/hashCode()、循环边界、累加逻辑。

第三次作业
作业要求
引入旅客、行李、力矩、重心、MAC 百分比等航空专业概念,实现完整载重平衡计算:输入航班、货舱、旅客行李、货物信息,输出专业载重平衡舱单,含重心安全评估(25%~38% 为安全)。
实现方式
采用结构化设计(无继承 / 接口),拆分 8 个核心类,新增航空计算模块:
Flight(航班类):扩展旅客列表,关联前后舱;
CargoCompartment(货舱类):新增力臂属性(前舱 12.0m、后舱 22.0m);
Passenger(旅客类):封装旅客信息,组合 Luggage(行李类);
Luggage(行李类):封装行李重量;
WeightBalanceCalculator(计算工具类):纯工具,实现力矩、重心、MAC 百分比计算;
InputValidator(校验工具类):输入合法性校验(非负、范围限制)。
数据流程:输入→合法性校验→实例化对象→装载货物→计算旅客 / 货舱力矩→总力矩 / 重心 / MAC 计算→输出专业舱单。
代码规模
image
类图
image
复杂度分析
image
复杂度结论:算法类方法复杂度低,输出方法因格式复杂、分支多,复杂度偏高;整体设计耦合度低,符合结构化设计要求。
Bug 分析
公测情况
无正确性错误,所有航空计算用例均通过;但输出格式细节、精度处理疏漏,部分性能点失分。
互测情况
无被测出 Bug;发现他人 3 类典型 Bug:
1.输入范围判断错误:指数≤10000 误写为 < 10000;
2.旅客总重计算错误:遗漏标准体重(75kg)累加;
3.重心公式参数错误:MAC 前缘距离、长度参数写错。
测试方法
航空专业数据校验:逐行核对力矩、重心计算公式;
极值测试:空机、满载、极限重心场景;
输入边界测试:负数、0、极值输入校验。
关于复杂度与设计思考
复杂度变化趋势
三次作业复杂度随功能扩展逐步上升,整体可控:
第一次:OCavg=4.4、WMC=66;
第二次:OCavg=5.16、WMC=98;
第三次:OCavg=5.89、WMC=159。
复杂度上升核心原因:功能迭代、输出格式复杂化、逻辑分支增多;但良好的面向对象设计,有效控制了复杂度增长幅度,避免代码 “臃肿化”。
设计改进方向
结合三次作业复杂度问题,后续优化思路:
1.拆分复杂方法:将超长print()、计算方法拆分为单一职责子方法,降低单方法复杂度;
2.引入多态 / 接口:同类对象统一接口,减少条件分支,降低耦合;
3.工具类封装:格式化、校验、计算逻辑统一封装,复用代码、减少冗余;
4.强化边界设计:提前预判边界场景,避免后期频繁修改。
心得体会
三次航空器配载作业,是从基础语法实践到工业级设计的完整训练,收获远超代码本身:
1.Java 能力夯实:熟练掌握集合、浮点、输入输出、异常处理,能独立开发中等复杂度程序;
2.OO 思想深化:真正理解封装、聚合、组合、单一职责,从 “写代码” 转变为 “设计系统”;
3.工程意识提升:重视代码可读性、鲁棒性、可维护性,养成注释、测试、走查习惯;
4.专业认知拓展:初步掌握航空配载、力矩、重心等专业知识,理解软件与行业结合的价值。
同时也暴露不足:前期设计粗糙、复杂逻辑调试慢、代码规范待加强。后续将重点强化设计能力、规范编码、完善测试,真正做到 “设计先行、编码后置”。
总而言之,三次作业不仅是技能训练,更是思维蜕变。面向对象不是语法堆砌,而是拆解复杂、封装细节、复用设计的智慧,这份收获将助力后续学习与实践。

posted @ 2026-05-18 22:23  SeongLu  阅读(6)  评论(0)    收藏  举报