blog作业集1-3

这三次作业是从简单航班货物装载一步步升级到旅客 + 行李 + 多货舱 + 重心配平的完整航空配载系统,整体是迭代式开发。
知识点上,从最基础的类、封装、集合,慢慢用到组合关系、排序、输入校验、静态工具类、重量重心计算。题量一次比一次大,难度也是递增:第一次只做货物排序和超载判断;第二次加了货舱、位置、分配逻辑;第三次直接把旅客、行李、前后货舱、重心安全范围全部整合,逻辑最复杂。
整体做下来,明显能感觉到从面向过程慢慢转向面向对象,类越拆越细,职责越来越清晰,也真正体会到封装和模块化的好处。
一、设计与分析(含类图 + 复杂度 + 心得)
我把三次作业的类结构、PowerDesigner 类图、复杂度、设计思路全部写清楚,直接对照截图就能交作业。
第一次作业:基础货物装载与排序

  1. 功能说明
    输入航班号、最大载重、货物信息
    按重量降序排序
    计算总重量,判断是否超载
  2. 类设计
    屏幕截图 2026-05-18 193549
    关系:Flight 组合 Cargo(航班包含货物)
  3. 代码规模与复杂度
    总行数:150 行左右
    复杂方法:sortCargo()、getTotalWeight()
    循环复杂度 v (G):都 < 5,结构很简单
  4. 设计心得
    第一次完全是入门级 OO,只用到最基本的类和 ArrayList。我当时的想法就是:货物是货物,航班是航班,分开写就完了。
    优点:结构简单,不容易出错。
    缺点:完全没有扩展性,加功能就要大改。

第二次作业:多货舱 + 位置 + 分配策略

  1. 功能说明
    多个货舱,各自有最大载重、行列位置
    货物指定目标货舱
    按重量排序后依次装入,装不下就提示失败
    输出每个货舱状态
  2. 类设计
    屏幕截图 2026-05-18 193734
    Main
    关系
    CargoCompartment 组合 Position、Cargo
    Flight 组合 CargoCompartment
    Main 依赖所有类
  3. 复杂度分析
    复杂方法:
    CargoCompartment.addCargo():判断载重,v (G)≈3
    LoadDispatcher.sortCargos():排序,v (G)≈4
    Main 输入处理逻辑最长,条件多
  4. 设计心得
    第二次开始真正拆类:把位置、货舱、调度、校验都单独写成类。
    我最大的感受是:原来一个功能可以拆这么细。比如排序不用写在 Flight 里,单独一个LoadDispatcher,以后换算法直接改这个类就行,符合单一职责。

第三次作业:旅客 + 行李 + 前后货舱 + 重心配平(完整版)

  1. 功能说明
    旅客 + 标准体重 + 行李重量
    前货舱、后货舱分别装载
    计算总重量、总力矩、重心、% MAC
    判断重心是否在25%~38% 安全范围
    货舱满了直接报警退出
  2. 类设计
    屏幕截图 2026-05-18 193923
    Main
    关系
    Passenger 组合 Luggage
    Flight 组合 Passenger、CargoCompartment
    CargoCompartment 组合 Cargo
    WeightBalanceCalculator 依赖 Flight
  3. 复杂度分析(重点)
    最高复杂度方法:
    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
  4. 设计心得
    第三次是真正的工程思维。
    我把数据、计算、调度、输入完全分开:
    实体类只存数据
    工具类只做一件事
    计算类只管公式
    这样写出来的代码,改 bug、加功能比较轻松。
    二、雷霆踩坑红温系列
  5. 第一次作业
    1:排序写反,变成升序
    货物从轻到重排,和要求相反
    原因:Double.compare(a,b) 写反
    解决:改成c2.getWeight() - c1.getWeight()
    2:小数输出格式不对
    表现:出现多位小数,不符合%.1f
    解决:统一用printf格式化
  6. 第二次作业
    1:货舱找不到
    表现:输入货舱 ID 匹配不上,返回 null
    原因:字符串equals()写成==
    心得:字符串比较永远用equals()
    2:货物重量累加错误
    表现:总重量比实际大
    原因:循环里重复加了一遍
    解决:单步调试看每一步add的值
    3:输入切分错误
    表现:货物名称带空格就炸裂
    解决:把最后两列以外的都拼回名称
  7. 第三次作业
    1:重心计算错误
    表现:% MAC 算出来不在 25-38 之间,但数据是对的
    原因:力臂、空机重量、公式顺序写错
    解决:拿计算器一步一步核对,把公式拆成单行写
    2:货舱装满后没有立即退出
    表现:继续装,导致超重
    解决:addCargo返回false直接System.exit(0)
    3:输入负数没有拦截
    表现:重量负数,程序继续跑
    解决:在InputValidator里判断<0直接退出
    4:冒泡排序把 ID 排错
    表现:货物顺序乱
    原因:交换时get/set用错
    心得:排序逻辑一定要单独测,别直接扔到主流程
    三、改进建议
    老实人,不空,都是能直接改的。
  8. 代码结构改进
    现在:Main 里流程太长
    改进:把输入、装载、输出拆成 3 个方法
    好处:可读性强,便于测试
  9. 异常处理改进
    现在:直接System.exit(0)
    改进:自定义OverLoadException、InputException
    好处:更规范,便于定位错误
  10. 重心计算类改进
    现在:全部静态方法
    改进:改成单例,或传入 Flight 对象构造
    好处:更容易做单元测试
  11. 货舱分配策略改进
    现在:固定前 p 个装前舱,剩下装后舱
    改进:做智能配平算法,自动分配让重心更稳
    好处:更贴近真实民航配载逻辑
  12. 测试改进
    现在:手动测
    改进:写 JUnit 测试用例
    好处:改代码不怕崩,一键跑测
    四、整体总结
  13. 我学到了什么
    真正理解面向对象:类该怎么拆、职责该怎么分
    掌握组合关系:航班包含货舱、旅客包含行李
    学会工具类思想:排序、校验、计算都单独封装
  14. 加强点
    工厂模式、单例、策略模式这些还不熟,不会自动造数据、自动比对,只会简单判断,不会规范抛出

结尾
这三次作业从简单到复杂,一步步把航空配载系统做完整,虽然踩了很多坑,但确实学到最多、进步最快。从一开始只会写在一个类里,到现在能拆出十几个类、越来越nb了

posted @ 2026-05-18 20:32  黎皓洋  阅读(0)  评论(0)    收藏  举报