blog作业集1-3
这三次作业是从简单航班货物装载一步步升级到旅客 + 行李 + 多货舱 + 重心配平的完整航空配载系统,整体是迭代式开发。
知识点上,从最基础的类、封装、集合,慢慢用到组合关系、排序、输入校验、静态工具类、重量重心计算。题量一次比一次大,难度也是递增:第一次只做货物排序和超载判断;第二次加了货舱、位置、分配逻辑;第三次直接把旅客、行李、前后货舱、重心安全范围全部整合,逻辑最复杂。
整体做下来,明显能感觉到从面向过程慢慢转向面向对象,类越拆越细,职责越来越清晰,也真正体会到封装和模块化的好处。
一、设计与分析(含类图 + 复杂度 + 心得)
我把三次作业的类结构、PowerDesigner 类图、复杂度、设计思路全部写清楚,直接对照截图就能交作业。
第一次作业:基础货物装载与排序
- 功能说明
输入航班号、最大载重、货物信息
按重量降序排序
计算总重量,判断是否超载 - 类设计
![屏幕截图 2026-05-18 193549]()
关系:Flight 组合 Cargo(航班包含货物) - 代码规模与复杂度
总行数:150 行左右
复杂方法:sortCargo()、getTotalWeight()
循环复杂度 v (G):都 < 5,结构很简单 - 设计心得
第一次完全是入门级 OO,只用到最基本的类和 ArrayList。我当时的想法就是:货物是货物,航班是航班,分开写就完了。
优点:结构简单,不容易出错。
缺点:完全没有扩展性,加功能就要大改。
第二次作业:多货舱 + 位置 + 分配策略
- 功能说明
多个货舱,各自有最大载重、行列位置
货物指定目标货舱
按重量排序后依次装入,装不下就提示失败
输出每个货舱状态 - 类设计
![屏幕截图 2026-05-18 193734]()
Main
关系
CargoCompartment 组合 Position、Cargo
Flight 组合 CargoCompartment
Main 依赖所有类 - 复杂度分析
复杂方法:
CargoCompartment.addCargo():判断载重,v (G)≈3
LoadDispatcher.sortCargos():排序,v (G)≈4
Main 输入处理逻辑最长,条件多 - 设计心得
第二次开始真正拆类:把位置、货舱、调度、校验都单独写成类。
我最大的感受是:原来一个功能可以拆这么细。比如排序不用写在 Flight 里,单独一个LoadDispatcher,以后换算法直接改这个类就行,符合单一职责。
第三次作业:旅客 + 行李 + 前后货舱 + 重心配平(完整版)
- 功能说明
旅客 + 标准体重 + 行李重量
前货舱、后货舱分别装载
计算总重量、总力矩、重心、% MAC
判断重心是否在25%~38% 安全范围
货舱满了直接报警退出 - 类设计
![屏幕截图 2026-05-18 193923]()
Main
关系
Passenger 组合 Luggage
Flight 组合 Passenger、CargoCompartment
CargoCompartment 组合 Cargo
WeightBalanceCalculator 依赖 Flight - 复杂度分析(重点)
最高复杂度方法:
WeightBalanceCalculator.cgMac( ):重心公式计算,v (G)≈6
CargoCompartment.addCargo():判断超载,v (G)≈4
Main.main():流程最长,v (G)≈9
类的平均复杂度 OCavg:
工具类(InputValidator、LoadDispatcher):≈1.0
实体类(Cargo、Luggage):≈1.0
计算类(WeightBalanceCalculator):≈3.5
主类 Main:≈5.0 - 设计心得
第三次是真正的工程思维。
我把数据、计算、调度、输入完全分开:
实体类只存数据
工具类只做一件事
计算类只管公式
这样写出来的代码,改 bug、加功能比较轻松。
二、雷霆踩坑红温系列 - 第一次作业
1:排序写反,变成升序
货物从轻到重排,和要求相反
原因:Double.compare(a,b) 写反
解决:改成c2.getWeight() - c1.getWeight()
2:小数输出格式不对
表现:出现多位小数,不符合%.1f
解决:统一用printf格式化 - 第二次作业
1:货舱找不到
表现:输入货舱 ID 匹配不上,返回 null
原因:字符串equals()写成==
心得:字符串比较永远用equals()
2:货物重量累加错误
表现:总重量比实际大
原因:循环里重复加了一遍
解决:单步调试看每一步add的值
3:输入切分错误
表现:货物名称带空格就炸裂
解决:把最后两列以外的都拼回名称 - 第三次作业
1:重心计算错误
表现:% MAC 算出来不在 25-38 之间,但数据是对的
原因:力臂、空机重量、公式顺序写错
解决:拿计算器一步一步核对,把公式拆成单行写
2:货舱装满后没有立即退出
表现:继续装,导致超重
解决:addCargo返回false直接System.exit(0)
3:输入负数没有拦截
表现:重量负数,程序继续跑
解决:在InputValidator里判断<0直接退出
4:冒泡排序把 ID 排错
表现:货物顺序乱
原因:交换时get/set用错
心得:排序逻辑一定要单独测,别直接扔到主流程
三、改进建议
老实人,不空,都是能直接改的。 - 代码结构改进
现在:Main 里流程太长
改进:把输入、装载、输出拆成 3 个方法
好处:可读性强,便于测试 - 异常处理改进
现在:直接System.exit(0)
改进:自定义OverLoadException、InputException
好处:更规范,便于定位错误 - 重心计算类改进
现在:全部静态方法
改进:改成单例,或传入 Flight 对象构造
好处:更容易做单元测试 - 货舱分配策略改进
现在:固定前 p 个装前舱,剩下装后舱
改进:做智能配平算法,自动分配让重心更稳
好处:更贴近真实民航配载逻辑 - 测试改进
现在:手动测
改进:写 JUnit 测试用例
好处:改代码不怕崩,一键跑测
四、整体总结 - 我学到了什么
真正理解面向对象:类该怎么拆、职责该怎么分
掌握组合关系:航班包含货舱、旅客包含行李
学会工具类思想:排序、校验、计算都单独封装 - 加强点
工厂模式、单例、策略模式这些还不熟,不会自动造数据、自动比对,只会简单判断,不会规范抛出
结尾
这三次作业从简单到复杂,一步步把航空配载系统做完整,虽然踩了很多坑,但确实学到最多、进步最快。从一开始只会写在一个类里,到现在能拆出十几个类、越来越nb了




浙公网安备 33010602011771号