面对对象设计与构造——第一次blog作业
随着三次pta作业的结束,不断增加新的功能,我学到了很多:
1.核心语法与基础特性。如:类与对象,数据类型,流程控制,数组与集合;
2.面向对象核心。如:封装,静态成员,类的组合;
3.实用编程技能。如:输入输出,排序算法,业务逻辑封装,异常 / 边界处理;
4.工程化基础。如:代码分层,常量管理,注释与规范。
Complexity Metrics(复杂度分析)
因为下面要用到复杂度分析,所以先在此给出一些相关概念。
我们需要使用的主要是方法和类的复杂度分析。
方法的复杂度分析主要基于圈复杂度的计算。圈复杂度是一种表示程序复杂度的软件度量,由程序流程图中的 “基础路径” 数量得来。
1.Max Complexity(最大圈复杂度):即单个方法的最高圈复杂度,用来表示方法中最复杂分支路径的数量,范围在
[1,∞)之间,值越大则该方法的逻辑分支越多,越难以测试和维护,其数值直接决定了需要的最少测试用例数。
2.Max Depth(最大嵌套深度):即方法中条件 / 循环语句的最深嵌套层数,用来表示程序逻辑的层级复杂度,范围在
[1,∞)之间,值越大则代码的 “缩进层级” 越深,越容易出现逻辑混乱和阅读障碍,也间接反映了代码的结构化程度。
3.Avg Complexity(平均圈复杂度):即类或项目中所有方法的圈复杂度平均值,用来表示整体代码的复杂度水平,范围在
[1,∞)之间,值越大则整体代码的维护成本越高,也反映了项目整体的代码质量和设计水平。
第一次作业
作业要求
设计一个基础的航班货运配载模块。系统需要记录航班的基本信息(航班号、最大起飞重量、最大业载重量)。
地勤人员可以按照货物重量从高到低向该航班添加货物(货物名称、重量)。系统需要实时计算当前已装载的总重量,并判断是否超载。类设计必须符合单一职责原则(SRP)。
代码规模
Files 1
Lines 73
Statements 44
Classes 5
Avg Stmts/Method 10.33

类图

Main 类为程序入口主类
数据载体类
Flight:封装航班的基础信息,包括航班编号和航班最大载重。
Cargo:封装单个货物的基础信息,包括货物名称和货物重量。
工具类
LoadManifest:提供货物总重量计算功能,用于校验装载后是否超过航班载重限制。
CargoSorter:提供货物按重量降序排序的功能,为装载逻辑提供数据准备。
复杂度分析

Max Complexity为5,而行业要求为<=10,所以这是一个非常安全的范围
Max Depth为5,而行业要求为<=3~4,所以说明存在 “金字塔式” 的深层嵌套代码,需要进行修改,提升代码可读性
Avg Complexity为3.67,说明整体代码逻辑普遍偏简单,没有过度复杂的分支结构
踩坑心得
我出现了排序错误。我开始用的是冒泡排序,出现错误的原因可能是冒泡排序如果写得不够严谨,比如用了>而不是>=,或者交换逻辑有问题,
就会把相同重量的元素顺序打乱,导致输出顺序和题目预期不一致,直接判错。或者冒泡排序如果循环条件写错,会导致数组被错误修改,或
者在 n=1 时多做一次无意义的循环,虽然结果数值没错,但输出格式或顺序和题目预期不一致。
改进方法
1.我这次作业并没有给类增加封装性,需要给类增加封装性防止直接暴露了成员变量。
2.为解决Max Depth=5的问题可以把选择排序的核心逻辑拆分成独立方法,降低主方法的嵌套层级
第二次作业
作业要求
航班信息管理,货舱管理,货物装载,输出要求,必须严格遵循单一职责原则(SRP),不得将多个职责合并到一个类中。
代码规模
Files 1
Lines 206
Statements 147
Classes 7
Avg Stmts/Method 4.9

类图

Main 类为程序入口主类
数据载体类
Flight:封装航班核心信息,管理货舱列表,是航班业务的顶层数据模型。
CargoCompartment:封装货舱信息,维护装载货物列表,提供货物装载与重量计算功能。
Cargo:封装单个货物的基础信息。
Position:封装货舱内的位置信息,记录行列坐标。
工具类
LoadDispatcher:提供货物排序、货物查找等业务辅助功能,负责核心业务逻辑的实现。
InputValidator:提供输入数据校验方法,用于验证输入的合法性。
复杂度分析

Max Complexity 为 4,而行业要求为≤10,所以这是一个非常安全的范围,说明单个方法的控制流路径数量极少,逻辑分支简单,代码的可测试性与可维护性良好。
Max Depth 为 5,而行业要求为≤3~4,说明存在 “金字塔式” 的深层嵌套代码,需要进行修改,提升代码可读性,减少理解和维护的成本。
Avg Complexity 为 1.55,说明整体代码逻辑普遍偏简单,没有过度复杂的分支结构,大部分方法的圈复杂度都处于健康水平,整体代码质量优秀。
踩坑心得
这次作业出现部分测试用例答案错误,其主要原因可能是程序输入读取方式不合理,混用不同读取方法易造成缓冲区换行符残留,引发输入数据读取错位,
并且代码未对货物指定的目标货舱进行非空判断,若货舱编号不存在会出现空指针调用问题导致运行异常,加之程序直接使用浮点数进行大小对比,容
易因浮点精度误差造成临界重量数值判断失误,此外输出排版格式与题目标准格式存在细微偏差,多重问题共同导致部分测试案例运行结果与标准答案
不一致
改进方法
1.输入读取可以优化,统一Scanner的读取方式,通过next()/nextDouble()读取数据,并手动消耗换行符,避免了不同读取方法混用导致的输入错位问题。
2.排序稳定性优化可以优化,改进冒泡排序的判断逻辑,仅在前面货物重量小于后面时才交换位置,保证了相同重量货物的原始输入顺序不变,避免了评测系统因顺序不符判定答案错误。
3.异常处理完善的改进,增加目标货舱不存在的判断,当货物指定的货舱 ID 无效时,会输出明确的失败提示,避免了空指针异常导致的程序崩溃。
4.浮点数精度处理的优化,在所有重量比较逻辑中加入了1e-6的精度容差,解决了因浮点数精度误差导致的边界值判断错误问题。
第三次作业
作业要求
本次迭代新增约4个类,系统总类数达到10个左右。严禁使用继承和多态(无extends、无interface、无instanceof)
代码规模
Files 1
Lines 391
Statements 128
Classes 8
Avg Stmts/Method 2.85

类图

Main 类为程序入口主类,负责整体流程控制与结果输出。
数据载体类
Flight:封装航班核心信息,管理货舱列表与乘客列表,是航班业务的顶层数据模型。
CargoCompartment:封装货舱信息,维护装载货物列表,提供货物装载与重量计算功能。
Cargo:封装单个货物的基础信息。
Passenger:封装乘客信息,关联行李重量,提供乘客总重量计算功能。
Luggage:封装行李重量信息,作为乘客附属数据模型。
Position:封装货舱内的位置信息,记录行列坐标。
工具类
LoadDispatcher:提供货物排序、货物查找等业务辅助功能,为装载逻辑提供数据处理支持。
WeightBalanceCalculator:提供航班重量与重心相关计算,包括乘客重量、货物重量、总重量、力矩、重心百分比及最终配载结果计算。
InputValidator:提供输入数据校验方法,用于验证输入的合法性。
复杂度分析

Max Complexity 为 4,而行业要求为≤10,所以这是一个非常安全的范围,说明单个方法的控制流路径数量极少,逻辑分支简单,代码的可测试性与可维护性良好。
Max Depth 为 5,而行业要求为≤3~4,说明存在 “金字塔式” 的深层嵌套代码,需要进行修改,提升代码可读性,减少理解和维护的成本。
Avg Complexity 为 2.85,说明整体代码逻辑普遍偏简单,没有过度复杂的分支结构,大部分方法的圈复杂度都处于健康水平,整体代码质量优秀。
踩坑心得
这次编写航班载重平衡程序时,出现排序逻辑不严谨、浮点数判断存在误差、输入校验不完善以及边界情况考虑不全等问题,致使部分测试用例无法通过,
后续编写代码需严谨规范逻辑写法,完善异常与边界处理,注重输出格式统一,提升代码整体健壮性。
改进方法
1.优化冒泡排序逻辑,调整判断条件确保相同重量货物保持输入顺序,实现稳定排序。
2.完善输入校验机制,增加数据范围与合法性判断,避免非法数据导致程序异常。
3.修正浮点数比较方式,添加微小精度容差,解决因精度误差引发的重量判断错误。
4.拆分深层嵌套代码,将复杂逻辑抽取为独立方法,降低圈复杂度与嵌套深度,提升代码可读性。
5.统一输出格式,规范小数位数、提示文字与换行格式,保证与题目要求完全一致。
最后总结
经过三次层层递进的航空配载作业练习,我收获了很多实用知识与实操经验。学习中我熟练掌握了面向对象编程思想,能够按照单一职责原则合理划分各类,分清实体类与工具类的不同作用,理清类与类之间的关系,还学会使用集合存储数据、手写冒泡排序完成数据排序,掌握了货物装载、重量统计、旅客信息统计以及力矩重心配平等专业计算逻辑,同时也熟练学会数据输入校验、规范格式输出,整体编写代码和排查问题的能力有了明显进步。
在完成作业的过程中,我也清楚看到自身存在不少短板,对于复杂的配平计算公式容易记混,梳理多层业务逻辑不够顺畅,面对负数数据、满载装载这类边界情况考虑不够全面,代码优化能力不足,多层嵌套代码不会精简,今后我还要多刷题多练习,吃透业务计算逻辑,细心处理各类细节问题,不断补齐自身短板。
在平时写作业时,身边不少同学也经常出现各类常见问题,很多人编写代码时粗心大意,出现变量名类名拼写错误、大小写混用、少写分号和括号等基础语法错误,直接造成编译失败;输入数据时不会处理换行符,导致读取内容错乱,输入校验编写简单,无法拦截负数、超出范围等非法数据;不少同学没有遵守单一职责原则,把多种功能写在同一个类中,代码结构杂乱;还有人排序逻辑书写出错,不能正确实现重量降序排列,货物装载判断条件写错,出现错误判定超载的情况;到后期重心配平作业里,很多同学混淆前后货舱力臂数值,套用计算公式出错,算出的重心数据偏差很大,最后还有大部分同学不重视输出格式,小数保留位数、提示语句和题目要求不一致,即便逻辑正确也无法满分通过。
对于这门课程的学习安排,我也提出几点简单建议。老师平时讲课通俗易懂,知识点讲解清楚,课堂学习氛围很好。希望上课的时候可以多结合作业例题讲解,多盘点大家容易写错的代码点和易错逻辑,让我们提前避开误区。课下可以布置一些简短小练习巩固知识点,实验课多留出时间让我们现场调试代码。同时希望作业要求和输出格式可以讲解得更细致一些,方便我们一次性找准方向完成任务,整体学习安排合理有序,也希望往后能多增加师生交流机会,遇到难题可以及时沟通解决。

浙公网安备 33010602011771号