学术小白的第一次Blog作业
这是我第一次写的Blog,欢迎大佬对我的Blog进行点评!
一、前言
本阶段共完成了三次航空器配载相关的程序设计作业,整体内容围绕“航空货运配载系统”逐步展开,从最基础的单货舱货物管理,到多货舱管理,再到最终的航空器配平计算,难度逐渐提升,系统结构也越来越接近真实的软件工程项目。
第一次作业主要实现:
1.基础航班信息管理
2.货物装载
3.重量统计
4.超载判断
5.简单排序
第二次作业在第一次基础上进一步扩展:
1.多货舱管理
2.货舱位置网格
3.聚合与组合关系
4.航班整体重量统计
5.稳定排序
6.输入校验
第三次作业则进一步接近真实航空业务:
1.旅客与行李管理
2.力矩计算
3.重心计算
4.CG%MAC换算
5.配平安全评估
6.更严格的数据校验
7.航空舱单生成
从整体来看,三次作业的知识点覆盖了:
Java面向对象设计
1.类与对象
2.封装
3.聚合与组合
4.单一职责原则(SRP)
5.排序算法
6.数据统计
7.模块化设计
8.工程化代码组织
9.航空配载业务逻辑
在题量方面,虽然每次作业只有一个主题,但内部涉及的类数量、业务逻辑和代码量都比较大。
第一次作业代码量约200行左右;
第二次增加到400行左右;
第三次已经接近800行。
从难度变化来看:
作业 难度 特点
第一次 基础 面向对象入门
第二次 中等 多类协作与系统设计
第三次 较高 工程化与真实业务逻辑
整个学习过程让我逐渐从“会写代码”转变为“会设计系统”。这种由易及难的学习节奏,也让我在编程方面更加得心应手。
二、设计与分析
- 作业内容概述
第一次作业主要实现一个基础的“航班货运配载模块”。
系统需要:
a.管理航班信息
b.管理货物信息
c.对货物进行重量排序
d.统计总重量
e.判断是否超载
虽然整体功能不算复杂,但这是第一次正式使用面向对象方式完成一个完整系统。 - 类设计分析
本次作业主要设计了以下类:
类名 职责
Cargo 管理货物信息
Flight 管理航班及货物
CargoLoader 负责排序与装载
Main 程序入口
(1)Cargo类
Cargo类负责保存:
1.货物名称
2.货物重量
属于典型的数据实体类。
class Cargo{
private String name;
private double weight;
}
该类职责单一,符合SRP原则。
(2)Flight类
Flight类负责:
1.保存航班信息
2.管理货物集合
3.计算总重量
4.判断是否超载
public double getTotalWeight()
通过遍历货物集合统计总重量。
public boolean isOverLoaded()
用于判断当前是否超载。
该类承担了系统中的核心业务逻辑。
(3)CargoLoader类
CargoLoader类负责:
1.货物排序
2.货物装载
排序部分采用插入排序:
while(j>=0)
实现货物按重量降序排列。
这样设计的优点是:
Flight类不需要关心排序细节
降低类之间耦合
更符合单一职责原则 - 排序算法分析
本次作业采用插入排序实现:
while(j>=0){
double wJ=cargos.get(j).getWeight();
if(wCurrent>wJ)
排序规则:
重量大的货物优先装载
排序复杂度:
时间复杂度 O(n²)
由于数据量较小,因此效率可以接受。 - SourceMonitor分析
通过SourceMonitor分析代码结构:
指标 分析
类数量 4
方法数量 较少
平均复杂度 较低
最大复杂度 Main类
注释率 偏低
https://img2024.cnblogs.com/blog/3800322/202605/3800322-20260518173610756-535056218.png
分析发现:
类职责较清晰
Main类逻辑偏多
注释不足
缺少异常处理 - PowerDesigner类图分析
![1]()
通过类图可以发现:
Flight聚合Cargo
CargoLoader依赖Flight
Main负责整体流程控制
整体结构已经初步具备面向对象思想。 - 优点分析
(1)基本遵循SRP原则
不同类负责不同功能。
(2)实现模块化设计
排序逻辑独立封装。
(3)代码可读性较好
命名规范较统一。 - 存在的问题
(1)异常处理不足
catch(Exception e){
}
属于空异常处理,不利于调试。
(2)Main类过长
Main承担:
输入
输出
流程控制
职责偏多。
(3)缺少输入合法性校验
当前默认输入一定正确。 - 心得体会
第一次作业让我第一次真正感受到:
“程序不仅是代码堆积,更是对象之间的协作。”
虽然代码结构还比较简单,但已经开始理解:
类职责划分
数据封装
模块化设计
这为后续更复杂的系统设计打下了基础。
(二)第二次作业集分析 - 作业内容概述
第二次作业在第一次“单货舱配载”的基础上进行了功能扩展,实现了“多货舱管理与重量排序装载”。
相比第一次作业,本次新增了:
a.多货舱结构设计
b.货舱位置网格管理
c.组合与聚合关系设计
d.多约束条件判断
e.航班整体载重统计
f.货物稳定排序
g.输入校验类设计
该阶段已经不仅仅是基础面向对象练习,而是开始接近“小型系统设计”。 - 类结构设计分析
本次作业中,我将系统划分为以下几个核心类:
类名 职责
Position 表示货舱中的位置
Cargo 表示货物信息
CargoCompartment 管理货舱与货物
Flight 管理航班整体信息
LoadDispatcher 负责排序与货舱查找
InputValidator 负责输入范围校验
Main 负责程序控制与输入输出
相比第一次作业,本次系统结构明显更加复杂,也更加符合面向对象设计思想。 - 组合与聚合关系分析
(1)组合关系
CargoCompartment内部自动创建Position对象:
private void initPositions(int rows, int columns)
说明Position对象依赖CargoCompartment存在。
(2)聚合关系
private Listcargos;
Cargo对象可以独立存在,因此属于聚合关系。
通过本次作业,我真正理解了:
组合强调生命周期依赖
聚合强调对象之间的使用关系 - 排序算法分析
本次采用Comparator实现稳定排序:
Collections.sort(cargoList, new Comparator())
实现:
重量降序
相同重量保持输入顺序
相比第一次作业:
结构更加规范
扩展性更好
时间复杂度优化为 O(nlogn) - 货物装载逻辑分析
public boolean addCargo(Cargo cargo)
通过:
getCurrentWeight()+cargo.getWeight()
判断是否超载。
同时:
private static final double EPS = 1e-6;
用于减少浮点误差影响。 - 航班整体统计分析
Flight类负责统计整体重量:
public double getTotalLoadedWeight()
分别判断:
最大起飞重量
最大业载重量
体现了“局部统计 + 全局统计”的系统思想。 - SourceMonitor分析
指标 分析
类数量 7
方法数量 明显增加
平均复杂度 中等
最大方法长度 Main类
注释率 偏低
![OOP2]()
- PowerDesigner类图分析
![未命名文件 - ProcessOn 和另外 1 个页面 - 用户配置 1 - Microsoft Edge 2026_5_18 17_50_21]()
类关系包括:
Flight聚合CargoCompartment
CargoCompartment组合Position
CargoCompartment聚合Cargo
系统结构已经较完整。 - 优点分析
(1)严格遵循SRP原则
职责划分较明确。
(2)实现真正模块化
排序、查找、统计均独立封装。
(3)引入稳定排序思想
提高程序规范性。
(4)加入EPS处理浮点误差
增强程序健壮性。 - 存在的问题
(1)InputValidator利用率较低
虽然设计了,但未充分调用。
(2)Main类仍偏长
流程控制逻辑过多。
(3)缺少异常处理
非法输入可能导致程序崩溃。 - 心得体会
第二次作业让我真正意识到:
“程序设计不仅是代码实现,更是系统结构设计。”
尤其在类数量增加后:
如果没有合理分层
代码会迅速混乱
本次实践让我对:
聚合,组合,模块化,多类协作有了更深入理解。
(三)第三次作业集分析 - 作业内容概述
第三次作业加入了航空器“配平计算”功能。
相比第二次作业,本次新增:
a.旅客与行李管理
b.力矩与重心计算
c.CG%MAC换算
d.配平安全评估
e.更严格输入校验
f.冒泡排序
g.航空舱单生成
本次已经接近真实航空业务系统。 - 系统整体结构分析
本次系统主要包含:
类名 职责
Position 表示货舱位置
Cargo 管理货物信息
Luggage 管理行李重量
Passenger 管理旅客及总重量
CargoCompartment 管理货舱
Flight 管理航班整体数据
LoadDispatcher 冒泡排序
InputValidator 输入校验
WeightBalanceCalculator 配平核心算法
Main 程序入口
系统已经具备“小型工程项目”特征。 - Passenger与Luggage组合关系分析
Passenger内部创建Luggage:
luggage=new Luggage(luggageWeight);
体现:
组合关系
单一职责
数据封装
旅客总重量:
return BODY_WEIGHT+luggage.getWeight();
符合真实航空业务。 - 冒泡排序算法分析
由于禁止使用Collections.sort():
因此采用冒泡排序:
for(int i=0;i<cargoList.size()-1;i++)
实现:
重量降序
相同重量保持输入顺序
时间复杂度:
O(n²)
虽然效率不高,但帮助我进一步理解排序算法原理。 - 输入校验设计分析
InputValidator统一负责输入校验:
if(value<0)
{
System.out.println("数值不能为负数!");
}
实现:
输入统一管理
程序鲁棒性增强
相比前两次:
程序稳定性明显提升。 - 配平核心算法分析
(1)总重量计算
double totalWeight=EMPTY_WEIGHT+passengerWeight+cargoWeight;
(2)总力矩计算
double totalMoment=EMPTY_WEIGHTEMPTY_ARM+passengerMoment+cargoMoment;
(3)重心计算
double cg=totalMoment/totalWeight;
(4)CG%MAC换算
double percent=((cg-MAC_LEADING)/MAC_LENGTH)100.0;
这是整个系统最核心的业务算法。 - WeightBalanceCalculator设计分析
特点包括:
(1)使用静态常量管理航空参数
public static final double EMPTY_WEIGHT=40000.0;
(2)与Flight保持依赖关系
generateLoadSheet(Flight flight)
降低类耦合。
(3)统一负责业务计算与报表生成
包括:
总重量统计
总力矩统计
重心计算
配平评估
舱单输出
已经接近真实业务报表系统。 - SourceMonitor分析
指标 分析
类数量 10
方法数量 明显增多
平均复杂度 较高
最大方法长度 Main与generateLoadSheet
注释率 一般
![OOP3]()
- PowerDesigner类图分析
对象关系包括:
![未命名文件 - ProcessOn 和另外 1 个页面 - 用户配置 1 - Microsoft Edge 2026_5_18 17_52_44]()
Flight聚合Passenger
Passenger组合Luggage
CargoCompartment组合Position
CargoCompartment聚合Cargo
系统结构已经较完整。 - 优点分析
(1)严格遵循题目限制
没有使用:
继承
多态
Lambda
Collections.sort()
(2)SRP原则落实较好
各类职责划分明确。
(3)业务逻辑贴近真实航空配载
包括:
力矩
重心
CG%MAC
安全评估
(4)输入安全性明显提高
非法输入能够及时终止程序。 - 存在的问题
(1)WeightBalanceCalculator职责偏重
同时负责:
计算
输出
评估
后续可继续拆分类。
(2)Main类仍偏长
流程控制较多。
(3)缺少自动测试机制
当前仍依赖手工测试。 - 心得体会
第三次作业让我第一次真正感受到:
“程序设计不仅服务于算法,更服务于真实业务场景。”
尤其是:
重心计算
力矩换算
配平安全评估
让我对:
软件工程
工程化设计
航空业务逻辑
都有了更深入理解。
三、采坑心得 - Scanner输入问题
第一次作业中:
nextLine()
经常读取到空字符串。
原因是:
nextInt()
不会读取回车。
解决方法:
scanner.nextLine();
先吸收回车。
这是我第一次真正理解Java输入缓冲机制。 - 浮点数误差问题
第二次作业中:
0.1+0.2
可能不等于0.3。
因此加入:
EPS = 1e-6
避免误判超载。 - 聚合与组合关系难理解
一开始很难区分:
聚合
组合
后来通过:
Position依赖CargoCompartment
Cargo可独立存在
才真正理解两者区别。 - Main类越来越臃肿
随着功能增加:
Main越来越长。
这让我意识到:
“一个系统必须不断重构。” - 排序算法容易出错
尤其是:
稳定排序
相同权重顺序
经常出现逻辑错误。
通过反复调试才解决。
四、改进建议 - 引入文件输入
目前仍采用控制台输入。
后续可支持:
txt文件
csv文件
提高工程化程度。 - 增加GUI界面
目前程序全部为命令行。
后续可以:
JavaFX
Swing
实现可视化系统。 - 增加数据库支持
目前数据无法持久化。
后续可以:
MySQL
SQLite
实现真实数据管理。 - 优化类职责
部分工具类职责仍偏重。
后续可继续拆分。 - 引入自动化测试
例如:
JUnit
自动测试数据
提高程序可靠性。
五、总结
通过本阶段三次作业,我逐渐完成了从“基础代码编写”到“系统设计”的转变。
我学习到了:
面向对象设计思想
单一职责原则
聚合与组合关系
模块化开发
排序算法
工程化代码组织
航空配载业务逻辑
同时,我也认识到自己仍存在不足:
代码重构能力不足
异常处理不够完善
自动化测试意识较弱
注释与文档编写不够规范
后续我还需要进一步学习:
软件工程,设计模式,数据结构与算法,数据库开发,GUI开发
工程级项目管理
对于课程,我认为:
题目设计非常贴近真实业务
能够有效训练系统设计能力
三次迭代式作业难度递进合理
建议后续:
增加更多工程化指导
加入单元测试教学
增加Git协作训练
提供更多真实案例分析
总体来说,本阶段作业让我受益很大,也让我真正开始理解:
“优秀的软件不仅是能运行,更是结构清晰、职责明确、可持续维护的工程系统。”
以上是我的Blog内容分享,期待下一次的分享能有巨大的进步!!!





浙公网安备 33010602011771号