航空器配载三次PTA作业总结

一、前言
这门课的 OOP 作业围绕一个持续演进的系统 —— 航空器配载与货运管理系统展开。三次作业的题目一脉相承,但每一版都在业务复杂度和代码规模上稳步提升。
在完成作业的过程中,我不再只追求程序跑通测试用例,更加注重代码结构设计、编程规范与程序健壮性,循序渐进完成从基础语法练习到小型业务系统开发的转变。下表清晰展现三次作业学习侧重与能力成长方向:
1.1 知识点覆盖
image
1.2 量化指标对比
image
1.3 难度感受
作业一整体偏向入门练习,核心训练类的基础搭建与数组、列表基础操作,业务逻辑简单易懂,上手难度低;
作业二难度明显提升,新增多货舱划分、二维位置布局等内容,编写代码时需要同时兼顾货舱结构与货物调度逻辑,花费大量时间梳理各类之间的关联关系;
作业三依托题目给出的计算公式完成载重平衡开发,依托前期拆分好的各类结构,只需拆分细化功能方法即可完成开发,合理的代码拆分有效降低了复杂业务的编写难度。
二、设计与分析
2.1 作业 1:基础货物配载系统
核心指标
最大圈复杂度:5(正常范围)
注释率:16.7%(可读性良好)
作业一 UML 类图
image

作业一 SourceMonitor 代码检测截图】
698698c257c622d23cf1a7f9454cbe95

Flight:作为系统核心数据实体类,专门存储航班编号、额定载重等基础航班信息;
LoadManifest:依赖航班实体类,统一管理货物数据数组,实现总载重计算、航班超载判定核心业务;
CargoSorter:独立通用工具类,无实体依赖,仅负责完成货物重量排序功能;
ManifestDisplay:依赖货物清单管理类,专职完成控制台信息格式化输出。
设计心得
优点:初步实现基础职责分离,数据存储、业务逻辑、控制台展示三层结构划分清晰,代码结构初具面向对象思想;
缺点:排序代码存在逻辑冗余,前期先编写升序排序,再通过反转集合实现题目要求的降序效果,额外增加程序运行开销;同时初期编程规范意识薄弱,为简化编写流程直接将成员变量定义为 public,严重违背面向对象封装核心思想,也因此丢失相应作业分数。
2.2 作业 2:多货舱调度系统
核心指标
最大圈复杂度:9(中等水平)
注释率:2.9%(注释缺失,可读性较差)
【插入图 3:作业二 UML 类图】
image

【插入图 4:作业二 SourceMonitor 代码检测截图】
83228ac2b45915cc25612dc4f21af538

类图核心关系
Flight:在原有基础上拓展功能,新增多货舱管理属性与航班最大业载参数;
CargoCompartment:自定义货舱实体类,借助二维 Position 位置数组模拟真实飞机货舱网格布局,实现货物存入与单舱重量统计;
LoadDispatcher:整合货物排序、舱位装载两大核心逻辑,成为整套系统的业务调度核心工具类;
InputValidator:独立拆分输入校验功能,将数值范围判断、非法数据拦截逻辑与主体业务代码彻底解耦。
设计心得
优点:将输入校验功能独立成专属工具类,告别所有判断逻辑堆砌在主方法内的杂乱写法,让主方法流程简洁清晰;将货舱抽象为二维网格结构,贴合现实航空货运存放场景,也为后续拓展位置精准装载功能预留设计空间;
缺点:程序输出逻辑杂乱无章,多个打印输出方法互相嵌套调用,最终导致控制台输出格式混乱不统一;同时自身过于轻视代码注释作用,全程极少编写功能注释,代码后期复盘、他人阅读都存在较大阻碍。
2.3 作业 3:载重平衡全流程系统
核心指标
最大圈复杂度:10(中等水平)
注释率:13.8%(代码可读性良好)
【插入图 5:作业三 UML 类图】
image

【插入图 6:作业三 SourceMonitor 代码检测截图】
类图核心关系6bf3fb6fdc942d92a15ba63a1a10509a

Passenger、Luggage:严格按照题目要求实现组合关系建模,搭建完整旅客携带行李载重模型,完善整机载重数据来源;
WeightBalanceCalculator:纯静态计算工具类,将整机重心、力矩、配平比例等复杂物理运算拆分为多个小型独立方法,降低代码理解难度;
InputValidator:迭代优化输入工具类,新增多种场景安全输入方法,可适配不同范围、不同类型的数据录入限制,简化主方法输入编写逻辑。
设计心得
优点:搭建的业务实体模型完整完善,高度贴合真实民航航空器载重平衡业务逻辑;将数值计算逻辑与业务调度逻辑彻底解耦,工具类代码复用性、可测试性大幅提升;统一规范系统所有输出格式,有效解决前两次作业输出混乱的问题;
缺点:Flight 核心实体类承载功能过多,依赖其他子类数量繁杂,整体类内耦合度偏高,后续优化可拆分为航班基础信息类、航班载重信息类两个独立实体,进一步精简代码结构。
三、编程踩坑与问题修复总结

  1. 未遵循封装特性,成员变量权限滥用
    问题:作业前期编写代码时,直接将 Cargo、Passenger、Flight 等实体类所有成员变量定义为 public,外部任意类都可直接篡改货物重量、航班载重、行李数量等核心业务数据,极易造成超载判定、重心配平计算结果出错,数据安全性完全无法保障。
    修复方案:统一将所有实体类成员变量使用 private 私有化修饰,仅对外提供 getter 读取方法,数据修改操作通过携带合法性校验的 setter 方法完成,严格落实面向对象封装规范。
    心得:封装是 Java 面向对象最基础也最重要的特性,航空配载业务关联飞行安全,核心业务数据绝对不能被随意篡改,养成私有化定义变量的编程习惯至关重要。
  2. 缺少空对象校验,频繁触发空指针异常
    问题:调用调度类、计算类方法时,直接传入航班对象、货物集合等参数,未提前做非空判断;同时旅客集合、货舱集合未在实体类构造方法中完成初始化,调用集合新增方法时直接抛出 NullPointerException 空指针异常,直接导致程序强制终止运行。
    修复方案:所有业务执行方法开头统一添加非空判断逻辑;在实体类构造方法内提前初始化所有集合对象,从源头避免空集合调用异常;录入空数据时提前拦截提示。
    心得:空指针异常是 Java 开发中最常见的运行时错误,在多类协同开发、集合批量操作的项目中,必须养成先校验非空、再执行业务逻辑的编写习惯。
  3. 浮点数运算存在精度丢失,数值判定出错
    问题:使用 double 类型完成重心比例、力矩数值运算时,出现浮点数精度偏移问题;直接使用等值符号对比浮点数值,导致航班配平安全范围判定、货舱超载判定出现错误结果,同时输出数值未按照作业要求统一保留小数位数。
    修复方案:浮点数值对比采用差值极小值判定方式,利用Math.abs(数值1-数值2) < 0.0001规避精度误差;通过格式化字符串统一控制输出数值保留一位小数,严格匹配作业输出格式标准。
    心得:计算机底层二进制存储方式决定浮点型数据天然存在计算误差,涉及重量、重心这类精准数值计算业务,必须提前做好精度处理与格式统一。
  4. 未遵守作业算法与类关系编写约束
    问题:编写过程中存在偷懒行为,前期直接调用系统自带排序方法完成货物排序,违背作业要求手写基础排序算法的规则;同时未严格按照题目设计要求搭建旅客与行李组合关系,采用外部传参方式绑定数据,不符合评分标准。
    修复方案:手动编写双重循环结构实现货物重量降序冒泡排序,保证同等重量货物维持原始录入顺序;在旅客实体类内部完成行李对象创建,严格实现题目规定的组合关系,全程不擅自使用继承、接口等超出学习范围的语法。
    心得:课程作业不仅是练习代码编写,更是巩固课堂知识点的过程,必须严格遵守题目给出的算法要求、类结构设计要求,贴合评分标准完成编写,才能真正达到练习效果。
  5. 代码注释编写缺失
    问题:作业二、作业三编写过程中一心追求功能实现,忽视注释编写,类功能介绍、方法作用、核心代码思路均无文字说明。
    修复方案:后续编写代码同步补充完整注释,包含类整体功能注释、成员方法作用注释、核心业务逻辑行内注释,梳理自身编写思路的同时,也提升代码整体规范性。
    心得:充足清晰的代码注释,既方便自己后期复盘修改代码,也能让他人快速读懂代码逻辑,是规范编程必不可少的一环。
    四、后期优化改进建议
    4.1 架构层面:搭建五层分层开发架构
    目前项目业务调用逻辑大多集中在 Main 主方法中,层级划分模糊,后续可优化为标准五层架构,结构清晰便于维护拓展:
    image

4.2 代码层面实用性优化
数据结构优化:日常开发优先使用 ArrayList 动态集合替代固定长度数组,自动扩容特性适配不确定数量的数据存储场景;频繁按照编号查找货舱对象时,可使用 HashMap 集合替代遍历查找,大幅提升查询效率。
异常机制优化:现阶段仅使用直接退出程序的方式处理错误,后续可学习自定义业务异常,搭配 try-catch 捕获异常,输出人性化错误提示,优化程序使用体验。
代码复用优化:将三次作业中重复出现的数值求和、数据遍历、格式转换等通用逻辑,统一抽离为静态工具方法,减少重复代码编写,精简项目整体代码量。
4.3 可维护性细节优化
规范代码命名规则,舍弃 tmp 临时变量、单字母无意义变量名,全部使用语义清晰、见名知意的变量名;为项目核心计算方法编写测试场景,主动覆盖边界数值、极限载重等特殊测试案例;持续精简拆分冗长方法,将项目整体代码平均圈复杂度控制在合理健康范围之内。
五、学习总结
5.1 个人收获与成长
历经三次航空器配载系统作业编写,我彻底完成了从只会背诵 Java 基础语法,到独立设计开发小型面向对象业务系统的转变。
首先,我真正吃透了面向对象建模思想,能够把现实生活中的航班、货物、货舱、旅客等实体事物,精准抽象为程序中的实体类,熟练梳理类与类之间依赖、聚合、组合等各类关联关系。其次,熟练掌握数组与 ArrayList 集合的适用场景,能够根据业务需求灵活选择合适的数据存储结构。
最重要的是编程思维的转变,从前编写代码只追求功能正常运行,如今编写代码会主动思考数据安全问题、边界异常问题、代码拓展性问题,逐步摒弃杂乱无章的编写习惯,告别堆砌式 “屎山代码”,养成规范、严谨、全面的编程思维,这也是本次系列作业带给我最大的提升。对比此前 C 语言面向过程编程,也深刻体会到面向对象编程在复杂业务开发中的便捷性与优势。
5.2 自身存在不足与提升方向
虽然三次作业均顺利通过全部测试用例,圆满完成课程任务,但自身依旧存在诸多明显短板:
第一,设计模式相关知识储备不足,仅能完成基础的职责拆分,距离高内聚、低耦合的专业代码编写标准还有较大差距,核心实体类功能冗余问题依旧存在;
第二,代码复用意识薄弱,同类通用逻辑多次重复编写,代码精简优化能力不足;
第三,工程化开发能力欠缺,不会自主搭建测试用例,异常处理方式单一,仅能依靠平台测试用例验证代码正确性;
第四,代码拆分力度不足,主方法内循环、判断分支偏多,整体代码圈复杂度偏高,代码精简优化工作依旧需要持续加强。
5.3 课程与作业整体感悟
这三次循序渐进的系列作业,不只是单纯的 Java 代码编写练习,更是一场完整的面向对象工程思维训练。从最初简单的货物运载统计,到后期整合旅客行李、整机重心配平的完整民航业务系统,我一步步学会将复杂的大型业务拆解为多个简单独立的小功能,模块化完成代码开发。
回看第一次作业编写的基础代码,能清晰发现自身编程能力、规范意识、设计思维的明显进步。在今后的 Java 面向对象课程学习中,我会继续夯实课堂基础知识点,坚持规范编写代码,主动复盘优化过往作业代码,持续学习代码优化思路与进阶编程知识,始终保持严谨细致的编程态度,稳步提升自身综合编程能力,扎实学好面向对象程序设计这门核心课程。

posted @ 2026-05-18 19:01  饶浩晖  阅读(1)  评论(0)    收藏  举报