Java课程前三次作业总结

一、前言
作业概况:概述三次作业的主题——都围绕“航空货物装载”这一业务场景,从简单模拟逐步演进到包含配平计算的专业系统。
知识点覆盖:
第一次:类与对象的基础使用、定长数组、基本排序。
第二次:ArrayList动态集合、职责拆分(LoadDispatcher)、方法重写(toString→getPosName)。
第三次:完整的工具类设计(InputValidator、WeightBalanceCalculator)、静态方法与常量的运用、航空领域建模。
题量与难度:
第一次:题量小,难度低,主要考察Java语法入门。
第二次:题量适中,引入货舱概念后业务复杂度提升,输入解析开始变得棘手。
第三次:题量最大,难度显著提升,重心计算和输入校验对正确性和鲁棒性提出了更高要求。
二、设计与分析
第一次作业:
image

类名 方法 圈复杂度估算 问题分析
Flight sortByWeight() 6 选择排序双循环,复杂度偏高,但算法本身就这样
Flight addCargo() 2 很简单,就是赋值+累加
Main main() 8 负责所有输入输出和流程调用,职责太多
Cargo 构造方法+getter 1 纯数据类,没问题

第一次作业要求很简单,我就照着题目写了Cargo和Flight两个类。Flight类里面直接写死了选择排序,因为当时觉得排序就是航班干的事,没想那么多。整个程序就一个Main类管输入输出,一个Flight类管所有逻辑。
看下分析报表:
用SourceMonitor跑了一下,Flight.sortByWeight这个方法的圈复杂度最高。
类图:
image
第二次作业:
我改了啥:
这次加了货舱的概念,我一想,货物和货舱肯定得分开啊,于是搞了个CargoCompartment类。然后看Flight类太乱了,就把排序逻辑踢了出去,搞了个LoadDispatcher专门管排序。数组也全换成ArrayList了,因为第一次作业虽然没出bug,但总怕数组越界,这次直接一步到位。
image
看下分析报表:
Main.main的复杂度还是最高。这也没办法,这次的输入格式更复杂了,我全塞在Main里读的,确实不应该。但是CargoCompartment.addCargo这些业务方法的复杂度都很低,说明我拆分的思路是对的。
类图:
image

第三次作业
构建了包含旅客(Passenger)、行李(Luggage)、位置(Position)、前/后货舱、力臂、重心计算的完整航空配载模型,接近真实业务系统。InputValidator(输入校验)和WeightBalanceCalculator(配平计算)作为独立工具类出现。这是第二次作业中LoadDispatcher思路的延续和深化,实现了数据实体与操作逻辑的有效分离。
领域算法:重心位置(CG)计算、%MAC换算、包线判断等算法的实现,标志着代码从“纯业务逻辑”向“专业领域计算”的跃迁。
image
看下分析报表:
WeightBalanceCalculator.generateLoadSheet的圈复杂度直接爆了。我看了下,主要是因为里面太多printf输出格式了,各种判断和拼接
类图:
image
这次类最多,而且InputValidator和WeightBalanceCalculator都跟Main交互,Flight作为数据中心在中间,结构明显比前两次复杂了一档。

三、采坑心得
问题描述:在初学Java时,nextInt()/nextDouble()与nextLine()混用会导致“幽灵换行符”被错误读取。
“在第一次作业中我无意识地全部使用了nextLine()后解析的模式,侥幸避开了问题。到第二次、第三次作业处理更复杂的输入时,我已有意识地坚持这一习惯,从根源上杜绝了此类格式异常。这是我在输入处理上学到的第一课。”
问题描述:第三次作业中,Flight和Cargo使用了ArrayList,但CargoCompartment内部依然用了Cargo[]定长数组。
“这导致设计中存在不一致的风险——如果货物数量超过100,会出现ArrayIndexOutOfBoundsException,而我的canAddCargo检查只验证了重量,无法预防此错误。这让我认识到‘部分重构’带来的技术债务,统一的数据结构规范至关重要。”
还有我完成作业花费的时间较长,打字速度满,且容易打错,产生大量字符错误
四、改进建议
数组和列表要统一:以后写代码之前,先定好规矩,所有“一对多”的关系,没特殊情况一律用ArrayList,杜绝数组混用,不然维护起来真的烦。

排序器可以更灵活:LoadDispatcher现在只能按重量降序排。下次应该让它接收一个Comparator参数,这样想怎么排就怎么排,不用改LoadDispatcher的代码。

输入校验要补异常处理:InputValidator里面对parseInt/parseDouble必须加上try-catch,并且校验失败应该抛异常,而不是直接System.exit(0),这样调用方没法处理。

配平参数应该抽出来:WeightBalanceCalculator里那些力臂、空机重量什么的,全是硬编码。后面应该搞个AircraftModel类来存这些配置,换机型直接换配置对象就行。
五、总结
三次作业的知识点递进总结
层次 第一次 第二次 第三次
数据结构 定长数组 ArrayList ArrayList + 少量数组
类设计 数据类+上帝类 职责初步拆分 工具类独立
输入处理 简单读取 split分割 带校验的输入器
输出格式 printf基础 printf基础 完整报表格式
思维层次 面向过程 开始有OO意识 系统化建模
关键学习收获

  1. 面向对象思维
  • ✅ 理解"类"是对现实事物的抽象
  • ✅ 掌握封装、继承、多态的基本概念
  • ✅ 学会设计类之间的关系
  1. 问题分析能力
  • ✅ 将业务需求转化为代码逻辑
  • ✅ 分析问题的边界条件
  • ✅ 设计合理的数据结构
  1. 代码质量意识
  • ✅ 编写可读性强的代码
  • ✅ 考虑代码的可扩展性
  • ✅ 关注算法效率
  1. 调试与测试能力
  • ✅ 通过输出验证逻辑正确性
  • ✅ 定位和修复代码错误
  • ✅ 测试边界情况
    课程建议:希望能拥有更多练习机会,老师讲解更详细,提高我对知识点的理解与应用,增加对一些工具软件的教学,介绍SourceMonitor、PowerDesigner、JUnit等工具的基本用法,帮助我们快速上手。
posted @ 2026-05-18 09:20  Mxythree  阅读(6)  评论(0)    收藏  举报