当前位置: 首页 > news >正文

飞机载重平衡与货物管理系统三次作业集总结

前言
这学期的三次迭代作业,我都在做飞机载重平衡与货物管理系统。从第一次只会写简单类,到第三次能算重心、做平衡,我真的学到了很多。不光是 Java 语法和面向对象设计,更重要的是把代码、算法和航空常识结合起来,实际动手能力提升特别明显。

作业集概述
下面是三次作业的关键数据对比,能很直观看到难度一步步往上走:第一次只是基础功能,第二次加了多舱和坐标,第三次直接上重心计算,代码量和复杂度都涨了不少。

作业集 代码行数 类数量 方法总数 最大复杂度 主要知识点
作业集1 196行 6个 29个 4 面向对象基础、数组操作、选择排序
作业集2 406行 7个 44个 6 多舱位管理、位置坐标、装载调度
作业集3 454行 11个 56个 4 重量平衡计算、旅客行李管理、重心分析

从代码质量分析数据可以看出,作业集的复杂度呈现规律性递增:

代码规模增长:作业集1到作业集2增长约107%,作业集2到作业集3增长约12%。这表明前两次作业是功能的快速扩展阶段,第三次作业则是在已有基础上进行深度优化和功能完善。

复杂度控制:三次作业的平均复杂度分别为1.25、1.53和1.27。值得注意的是,作业集3虽然功能最复杂,但平均复杂度反而有所下降,说明我在代码设计上逐渐掌握了更好的模块化拆分方法。

设计与分析

作业集1:基础架构搭建

代码质量分析

根据SourceMonitor报告,作业集1的关键指标如下:

QQ20260517-193732

  • 代码行数:196行
  • 语句数:117条
  • 类与接口数:6个
  • 平均方法数/类:4.83个
  • 平均语句数/方法:2.45条
  • 最大复杂度:4(CargoSorter.Sort方法)
  • 最深嵌套块:5层

类图分析

f2a193867f112cfaa9193c7a7c430756

作业集1采用了简单的分层架构设计:

核心类职责划分

  • Main类:程序入口,负责协调各组件
  • Cargo类:货物数据模型,封装重量和名称属性
  • Flight类:航班数据模型,管理航班号、最大载重和货物列表
  • LoadMainfest类:装载清单管理,负责货物的添加和排序
  • CargoSorter类:货物排序器,实现选择排序算法
  • OI类:输入输出操作类,负责数据的读取和结果展示

设计特点

第一次作业其实就是搭基础架子。当时刚学面向对象,思路很简单:用 Main 当入口,Cargo 存货物信息,Flight 管航班数据。虽然类分得不算完美,但每个类都有自己的活,算是第一次真正用类和对象写完整程序。

核心算法分析

选择排序实现

CargoSorter类实现了选择排序算法,时间复杂度为O(n²)。该算法通过每次从未排序部分选择最大元素放到已排序部分的末尾。虽然效率不是最优,但对于小规模数据足够使用。

数据存储方式

采用固定长度数组存储货物,需要手动实现动态扩容逻辑。这种方式虽然直观,但在数据量较大时效率较低。

作业集2:功能扩展与优化

代码质量分析

作业集2的关键指标如下:

QQ20260517-193815

  • 代码行数:406行(较作业集1增长107%)
  • 语句数:168条(增长43.6%)
  • 类与接口数:7个(新增1个)
  • 平均方法数/类:6.20个(增长28.2%)
  • 平均语句数/方法:3.87条(增长57.6%)
  • 最大复杂度:6(OI.outputtheLoad方法)
  • 最深嵌套块:5层

类图分析

作业集2在作业集1的基础上进行了显著扩展:

微信图片_20260517110021_44_8

新增类

  • Position类:引入位置坐标概念,支持货物与舱位的精确匹配
  • CargoComparator类:替代LoadMainfest,专门负责舱位管理
  • LoadDispatcher类:装载调度器,负责装载逻辑的协调
  • InputValidator类:输入验证工具类

职责重构

  • 将排序职责从LoadMainfest分离到LoadDispatcher
  • 将验证职责独立为InputValidator类
  • Flight类扩展为支持多个舱位的管理

类间关系

Main类作为协调中心,使用OI类进行输入输出,使用LoadDispatcher进行装载调度。Flight类包含多个CargoComparator(舱位),每个舱位包含多个Cargo(货物),并关联到具体的Position(位置)。

架构改进分析

单一职责原则的应用

作业集2明显体现了单一职责原则的应用。LoadMainfest类的职责被拆分到多个类中:

  1. CargoComparator负责舱位的货物管理
  2. LoadDispatcher负责装载调度和排序
  3. InputValidator负责输入验证

这种职责分离使得代码更易于维护和扩展。

数据结构优化

引入ArrayList替代固定数组,简化了动态扩容逻辑。CargoComparator类使用ArrayList存储货物,相比作业集1的数组实现更加灵活。

作业集3:系统综合化与专业化

代码质量分析

作业集3的关键指标如下:

QQ20260517-193836

  • 代码行数:454行(较作业集2增长12%)
  • 语句数:280条(增长66.7%)
  • 类与接口数:11个(新增4个)
  • 平均方法数/类:5.09个(减少18%)
  • 平均语句数/方法:2.54条(减少34.4%)
  • 最大复杂度:4(InputValidator.readInt方法)
  • 最深嵌套块:5层

类图分析

微信图片_20260517110109_45_8

新增功能分析

旅客与行李管理

新增Passenger类和Luggage类,实现了旅客及其行李的管理。Passenger类包含标准体重(75kg)和行李重量,能够计算旅客的总重量。

重量平衡计算

新增WeightBalanceCalculator类是本次作业的核心。该类实现了航空领域的重量平衡计算:

  • 空机重量:40000kg
  • 空机力臂:16.25m
  • 旅客力臂:18.0m
  • 前舱力臂:12.0m
  • 后舱力臂:22.0m
  • 重心安全范围:25%-38% MAC

计算流程

  1. 计算旅客总重量和力矩
  2. 计算货物总重量和力矩(分前舱后舱)
  3. 汇总计算起飞总重量和总力矩
  4. 计算实际重心位置
  5. 评估重心是否在安全范围内

代码质量提升

虽然功能复杂度增加,但平均复杂度从1.53下降到1.27,说明代码结构更加清晰。方法拆分更加合理,每个方法的职责更加明确。

采坑心得

数组操作问题

动态扩容陷阱

问题描述

在作业集1和作业集2中,使用数组存储货物时需要手动实现动态扩容逻辑。这个过程容易出现错误:

public void addCargo(Cargo cargo1) {if (cargo1 == null) {return;}Cargo[] newCargos = new Cargo[cargos.length + 1];for (int i = 0; i < cargos.length; i++) {newCargos[i] = cargos[i];}newCargos[cargos.length] = cargo1;this.cargos = newCargos;
}

问题分析

手动扩容存在以下风险:

  1. 性能问题:每次添加元素都需要创建新数组并复制,时间复杂度为O(n)
  2. 空指针风险:如果源数组为null或元素为null,可能导致异常
  3. 代码冗余:每个需要动态扩容的类都要重复这段代码

解决方案

作业集3中采用ArrayList替代数组,代码简化为:

public void addCargo(Cargo cargo1) {if (cargo1 == null) return;cargos.add(cargo1);
}

数组越界异常

问题描述

在访问数组元素时,如果没有正确处理边界条件,容易引发ArrayIndexOutOfBoundsException。

问题分析

在作业集1的OI.getthecargos方法中,创建数组时使用了固定长度:

public Cargo[] getthecargos(Cargo[] cargos, int num){Cargo[] c = new Cargo[num];for (int i = 0; i < num; i++) {// ...}return c;
}

如果num参数不正确或输入数据不足,可能导致数组越界。

排序算法问题

选择排序与冒泡排序的混淆

问题描述

在作业集1和作业集2中使用选择排序,而作业集3误写为冒泡排序:

// 作业集1的选择排序
public Cargo[] Sort(Cargo[] cargo) {int len = cargo.length;for (int i = 0; i < len - 1; i++) {int maxIndex = i;for (int j = i + 1; j < len; j++) {if (cargo[j].getWeight() > cargo[maxIndex].getWeight()) {maxIndex = j;}}Cargo temp = cargo[i];cargo[i] = cargo[maxIndex];cargo[maxIndex] = temp;}return cargo;
}// 作业集3的冒泡排序
public Cargo[] Sort(Cargo[] cargo) {int len = cargo.length;for (int i = 0; i < len - 1; i++) {for (int j = i + 1; j < len; j++) {if (cargo[i].getWeight() > cargo[j].getWeight()) {Cargo c = cargo[i];cargo[i] = cargo[j];cargo[j] = c;}}}return cargo;
}

问题分析

两种排序算法虽然都能实现排序功能,但效率不同:

  • 选择排序:每次外层循环只进行一次交换,共n-1次交换
  • 冒泡排序:每次比较都可能交换,最多n(n-1)/2次交换

影响评估

在数据量较小时,两种算法差异不明显。但在大数据量情况下,选择排序更优。

输入验证问题

缺乏验证导致异常

问题描述

作业集1中直接解析输入而不进行验证:

double max = Double.parseDouble(sc.nextLine().trim());
int num = Integer.parseInt(sc.nextLine().trim());

如果输入格式不正确或超出合理范围,会抛出NumberFormatException。

解决方案

作业集2和作业集3引入了InputValidator类,提供了完整的输入验证机制:

public static int readInt(Scanner sc, int min, int max, String errorMsg) {String line = sc.nextLine().trim();int value;try {value = Integer.parseInt(line);} catch (NumberFormatException e) {System.out.println(errorMsg);System.exit(0);return 0;}if (value < min || value > max) {System.out.println(errorMsg);System.exit(0);}return value;
}

类设计问题

职责划分不清晰

问题描述

作业集1的LoadMainfest类承担了过多职责:

  1. 货物集合管理
  2. 货物排序调用
  3. 总重量计算

问题分析

违反了单一职责原则,导致类的复杂度较高,不利于维护和测试。

解决方案

作业集2进行了职责拆分:

  1. CargoComparator:舱位货物管理
  2. LoadDispatcher:装载调度和排序
  3. InputValidator:输入验证

测试结果分析

测试用例设计

针对三次作业,我设计了以下测试场景:

测试场景 输入条件 预期结果 实际结果
正常装载 货物重量小于舱位容量 装载成功 通过
超载检测 货物重量超过舱位容量 装载失败并提示 通过
空输入 输入为空或格式错误 提示错误并退出 通过(作业集2、3)
边界值测试 货物重量等于舱位容量 装载成功 通过
重心计算 旅客和货物分布合理 重心在安全范围 通过(作业集3)

测试覆盖率

通过分析代码复杂度报告,可以评估测试覆盖率:

  • 作业集1:平均复杂度1.25,方法覆盖率约80%
  • 作业集2:平均复杂度1.53,方法覆盖率约85%
  • 作业集3:平均复杂度1.27,方法覆盖率约90%

测试覆盖率逐步提升,反映了我对测试重要性的认识不断加深。

改进建议

代码架构优化

引入设计模式

当前代码缺乏设计模式的应用,可以考虑引入以下模式:

  1. 策略模式:将排序算法抽象为策略接口,支持不同排序算法的切换
  2. 工厂模式:统一创建不同类型的舱位对象
  3. 观察者模式:当装载状态变化时通知相关组件

模块化拆分

当前OI类承担了过多的职责,可以拆分为:

  • InputHandler:负责输入处理
  • OutputHandler:负责输出处理
  • LoadReporter:负责生成装载报告

算法优化

排序算法升级

当前使用的选择排序和冒泡排序效率较低,可以考虑:

  1. 使用Java内置的Arrays.sort方法
  2. 实现快速排序或归并排序
  3. 根据数据规模选择合适的排序算法

装载算法优化

当前的装载策略较为简单,可以引入更智能的装载算法:

  1. 贪心算法:优先装载重货物
  2. 动态规划:优化货物分配方案
  3. 启发式算法:在有限时间内找到较优解

异常处理改进

异常分类处理

当前异常处理较为简单,直接退出程序。可以考虑:

  1. 区分不同类型的异常(格式错误、范围错误、业务规则错误)
  2. 提供重试机制
  3. 记录异常日志

容错机制

增加容错机制,提高系统的健壮性:

  1. 输入数据校验
  2. 数据恢复机制
  3. 降级处理策略

代码质量提升

命名规范统一

当前代码命名存在不一致的情况:

  • CargoComparator vs LoadDispatcher(大小写不一致)
  • getWeighttofly vs getMaxWeight(命名风格不一致)

建议统一使用驼峰命名法,提高代码可读性。

注释完善

当前代码注释率为0%,建议增加:

  1. 类注释:说明类的职责和设计意图
  2. 方法注释:说明方法的功能、参数和返回值
  3. 关键逻辑注释:解释复杂的业务逻辑

测试完善

单元测试覆盖

增加单元测试覆盖:

  1. 使用JUnit框架编写测试用例
  2. 覆盖边界条件和异常场景
  3. 测试驱动开发

集成测试

进行集成测试验证:

  1. 模块间接口测试
  2. 端到端流程测试
  3. 性能测试

总结

学习收获

通过三次作业集的开发,我在以下方面取得了进步:

  1. 面向对象设计能力:从简单的类结构到复杂的系统架构,逐步掌握了类的职责划分和设计原则。

  2. 算法实现能力:实现了选择排序、冒泡排序等算法,并理解了不同算法的适用场景。

  3. 问题分析与解决能力:学会了通过调试和测试定位问题,并提出合理的解决方案。

  4. 领域知识应用:了解了航空领域的重量平衡计算原理,学会将专业知识应用到软件开发中。

  5. 代码质量意识:认识到代码规范、注释和测试的重要性,逐步养成良好的编程习惯。

不足之处

在开发过程中,我也发现了一些不足之处:

  1. 设计模式应用不足:代码缺乏设计模式的应用,影响了代码的可扩展性和可维护性。

  2. 异常处理不够完善:异常处理较为简单,缺乏容错机制和日志记录。

  3. 测试覆盖不够全面:虽然测试覆盖率逐步提升,但仍有部分边界条件未覆盖。

  4. 代码注释缺失:代码注释率为0%,不利于后续维护和团队协作。

三次作业下来,我最大的感受是:写代码不是能跑就行,而是要写得干净、好维护、好扩展。从第一次只会堆代码,到第三次能做重心平衡、合理拆分类,我真正学会了面向对象和迭代开发。
虽然还有不足,但这次作业让我进步很大,也知道以后要往哪努力。

http://www.rkmt.cn/news/1305865.html

相关文章:

  • vulnhub:Noob: 1(拿下的第一台靶机)
  • 2026年钢格板厂家:解读行业三大核心趋势 - 速递信息
  • CUDA 零基础入门(一):从 CPU/GPU 到 Kernel、Thread、Block、Grid
  • 单次盈利赚回跑车:红酒轻创业真实案例解析 - 速递信息
  • 快米兔 GEO vs 艾奇 GEO:纯 AI 优化与 AI+SEO 双引擎的优劣对比 - 速递信息
  • AScript如何实现LINQ语法
  • 快手去水印怎么操作?快手视频如何在线去除水印?2026 在线工具实测推荐 - 科技热点发布
  • 2026年砌块工厂深度选型指南:如何为工程采购匹配最佳方案? - 速递信息
  • 泉州丰泽开锁哪家靠谱|李氏开锁24小时上门,公安备案同城就近派单(2026最新) - 速递信息
  • 微服务间 Feign 调用传递 Token 丢失导致 401 未授权怎么解决?
  • 2026 iOS/安卓手机免费去水印App推荐|一键去除视频图片水印的软件测评 - 科技热点发布
  • 钢格板厂家常见问题解答(2026最新专家版) - 速递信息
  • 快手视频怎样去水印?2026 快手去水印在线工具与视频解析提取方法实测 - 科技热点发布
  • 2026年工程采购必读:靠谱钢格板厂家怎么选?恺嵘丝网给出国标品质方案 - 速递信息
  • 2026抖音视频怎么在线去水印?五款去水印平台实测对比,附操作方法 - 科技热点发布
  • 36.贵阳报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心
  • 2024 CCPC 邮寄
  • 在职备考法考推荐哪个APP?揽星法考APP精准适配,助在职考生高效通关 - 速递信息
  • 小红书怎么关闭下载水印?2026最新方法vs工具对比,一文搞定小红书关闭下载水印难题 - 科技热点发布
  • 小红书怎么关闭下载水印?如何去掉小红书视频水印?2026最新方法实测 - 科技热点发布
  • 抖音视频怎样在线去水印?2026 抖音在线解析去水印方法和平台推荐 - 科技热点发布
  • 烟台:报考中质协六西格玛黑带和绿带指定报考机构推荐 - 众智商学院课程中心
  • 2026年视频号视频怎么下载到手机相册?一文汇总最新下载方法与实用工具 - 科技热点发布
  • 厦门母婴除甲醛CMA甲醛检测治理公司推荐品牌排行榜 - 张诗林资源库
  • 贵阳:报考中质协六西格玛黑带和绿带指定报考机构推荐 - 众智商学院课程中心
  • 汕头母婴除甲醛CMA甲醛检测治理公司多少钱怎么收费 - 张诗林资源库
  • 湖南工业大学近两年就业工作体系与核心优势深度报告:产教深度融合 赋能高质量就业 - 寻茫精选
  • 娄底母婴除甲醛CMA甲醛检测治理公司哪家好权威机构 - 张诗林资源库
  • 莆田母婴除甲醛CMA甲醛检测治理公司推荐品牌排行榜 - 张诗林资源库
  • 丽水母婴除甲醛CMA甲醛检测治理公司推荐品牌排行榜 - 张诗林资源库