航空货运管理系统大作业

相比于上一次的大作业,本次大作业的题目相对较容易,类的设计比较清晰。在对Java基础的考验的同时加入了接口的知识点,引导我们在java的道路上更进一步。
一、前言

1.第一次大作业
(1)知识点:
类的设计:需设计客户类、货物类、航班类、运送信息类、订单类。
重量计算规则:根据货物实际重量和体积重量确定计费重量(体积重量 = 货物体积÷6000 ,取实际重量和体积重量较高者)。
计费规则:采用分段计算方式确定费率并计算基础运费(基础运费 = 计费重量×费率)。
输入:按客户信息、货物信息、航班信息、订单信息顺序分别输入;
注:发现有部分的输入信息没有作用,故没有将这些信息加入类中。
输出:按规定格式输出订单信息报表及货物明细报表。
(2)题量:
只有一题,但涵盖信息输入输出、数据处理以及遵循多种面向对象设计原则等多方面要求,要处理的信息较多,题量较大。
(3)难度:
中等
需要实现各类的设计与交互,准确处理计费规则,还要遵守单一职责原则、里氏代换原则、开 闭原则以及合成复用原则,对知识综合运用能力有一定要求。
1.第二次大作业
(1)知识点:
类的设计:需设计客户类、货物类、航班类、运送信息类、订单类。
(加入货物类型,用户类型,支付方式)
注:支付方式我通过接口来完成
重量计算规则:根据货物实际重量和体积重量确定计费重量(体积重量 = 货物体积÷6000 ,取实际重量和体积重量较高者)。
计费规则:先判断货物类型,然后采用分段计算方式确定费率,再依据客户类型计算基础运费(基础运费 = 计费重量×费率×折扣率 ,个人用户9折,集团用户8折 )。
输入:按客户信息、货物信息、航班信息、订单信息顺序分别输入;
注:发现有部分的输入信息没有作用,故没有将这些信息加入类中。
输出:按规定格式输出订单信息报表及货物明细报表。(加入了付款方式)
(2)题量:
只有一题,但涵盖信息输入输出、数据处理以及遵循多种面向对象设计原则等多方面要求,要处理的信息较多,题量较大。
(3)难度:
较难
需要实现各类的设计与交互,准确处理计费规则,还要遵守单一职责原则、里氏代换原则、开 闭原则以及合成复用原则,对知识综合运用能力有一定要求。
二、设计与分析
1.第一次大作业

Metrics Details For File 'Main.java'

Parameter Value
========= =====
Project Directory C:\Users\Lenovo\IdeaProjects\AirFreightManagementSystem\src
Project Name Blog2-1
Checkpoint Name der
File Name Main.java
Lines 384
Statements 125
Percent Branch Statements 3.2
Method Call Statements 9
Percent Lines with Comments 0.0
Classes and Interfaces 5
Methods per Class 9.80
Average Statements per Method 1.29
Line Number of Most Complex Method 94
Name of Most Complex Method Cargo.getRate()
Maximum Complexity 5
Line Number of Deepest Block 97
Maximum Block Depth 3
Average Block Depth 1.48
Average Complexity 1.11


Most Complex Methods in 3 Class(es): Complexity, Statements, Max Depth, Calls

Cargo.calculateBaseFreight() 1, 1, 2, 1
Cargo.calculateVolumeWeight() 1, 1, 2, 0
Cargo.Cargo() 1, 5, 2, 0
Cargo.getChargeableWeight() 1, 1, 2, 1
Cargo.getHeight() 1, 1, 2, 0
Cargo.getLength() 1, 1, 2, 0
Cargo.getName() 1, 1, 2, 0
Cargo.getRate() 5, 9, 3, 0
Cargo.getWeight() 1, 1, 2, 0
Cargo.getWidth() 1, 1, 2, 0
Cargo.setHeight() 1, 1, 2, 0
Cargo.setLength() 1, 1, 2, 0
Cargo.setName() 1, 1, 2, 0
Cargo.setWeight() 1, 1, 2, 0
Cargo.setWidth() 1, 1, 2, 0
Customer.Customer() 1, 2, 2, 0
Customer.Customer() 1, 0, 0, 0
Customer.getName() 1, 1, 2, 0
Customer.getPhone() 1, 1, 2, 0
Customer.setName() 1, 1, 2, 0
Customer.setPhone() 1, 1, 2, 0
DeliveryInfo.DeliveryInfo() 1, 8, 2, 0
DeliveryInfo.getFlightNumber() 1, 1, 2, 0
DeliveryInfo.getOrderDate() 1, 1, 2, 0
DeliveryInfo.getReceiverAddress() 1, 1, 2, 0
DeliveryInfo.getReceiverName() 1, 1, 2, 0
DeliveryInfo.getReceiverPhone() 1, 1, 2, 0
DeliveryInfo.getSenderAddress() 1, 1, 2, 0
DeliveryInfo.getSenderName() 1, 1, 2, 0
DeliveryInfo.getSenderPhone() 1, 1, 2, 0
DeliveryInfo.setFlightNumber() 1, 1, 2, 0
DeliveryInfo.setOrderDate() 1, 1, 2, 0
DeliveryInfo.setReceiverAddress() 1, 1, 2, 0
DeliveryInfo.setReceiverName() 1, 1, 2, 0
DeliveryInfo.setReceiverPhone() 1, 1, 2, 0
DeliveryInfo.setSenderAddress() 1, 1, 2, 0
DeliveryInfo.setSenderName() 1, 1, 2, 0
DeliveryInfo.setSenderPhone() 1, 1, 2, 0


Block Depth Statements

0 7
1 55
2 59
3 4
4 0
5 0
6 0
7 0
8 0
9+ 0

图表分析:
(1)代码模块
总行数:384 行
语句数:125 个
(2)代码复杂性
最大复杂度:5,在一般代码复杂度衡量体系中不算高,在可维护性和开发效率间取得了良好平衡,但需结合具体场景灵活应用。
平均复杂度:1.11,表明代码整体结构极为简单,函数逻辑高度扁平化,反映出代码设计存在过度拆分或逻辑缺失的潜在问题。
(3)代码注释
含注释行占比:0,注释占比极低,这会给代码理解带来极大困难。对于后续开发者,无论是理解代码功能逻辑、修改维护还是扩展功能,都缺乏必要的文字说明引导,急需补充注释来提升代码可理解性。
(4)代码块深度
最大代码块深度:3,贴合人类认知极限,降低理解成本
平均代码块深度:1.48,“平均代码块深度:1.48” 表明代码整体结构非常扁平,嵌套层级极少。

总结:忽略了题目中所给的支付方式部分,因为这时只有微信支付。
老师提出可以将输入单独分成类,这一点启发了我,这样做在第二次迭代的时候就不需要修改太多,也能降低复杂度,避免混乱。
2.第二次大作业

Metrics Details For File 'Main.java'

Parameter Value
========= =====
Project Directory C:\Users\Lenovo\IdeaProjects\new\src
Project Name Blog2-2
Checkpoint Name Baseline
File Name Main.java
Lines 444
Statements 278
Percent Branch Statements 8.3
Method Call Statements 18
Percent Lines with Comments 0.0
Classes and Interfaces 10
Methods per Class 13.40
Average Statements per Method 1.31
Line Number of Most Complex Method 98
Name of Most Complex Method Cargo.getRate()
Maximum Complexity 16
Line Number of Deepest Block 103
Maximum Block Depth 4
Average Block Depth 1.77
Average Complexity 1.38


Most Complex Methods in 9 Class(es): Complexity, Statements, Max Depth, Calls

AlipayPayment.setSenderPhone() 1, 1, 2, 0
Cargo.calculateBaseFreight() 3, 6, 3, 2
Cargo.calculateFreight() 1, 1, 2, 1
Cargo.calculateVolumeWeight() 1, 1, 2, 0
Cargo.Cargo() 1, 7, 2, 0
Cargo.getChargeableWeight() 1, 1, 2, 1
Cargo.getHeight() 1, 1, 2, 0
Cargo.getLength() 1, 1, 2, 0
Cargo.getName() 1, 1, 2, 0
Cargo.getRate() 16, 30, 4, 3
Cargo.getWeight() 1, 1, 2, 0
Cargo.getWidth() 1, 1, 2, 0
Cargo.setHeight() 1, 1, 2, 0
Cargo.setLength() 1, 1, 2, 0
Cargo.setName() 1, 1, 2, 0
Cargo.setWeight() 1, 1, 2, 0
Cargo.setWidth() 1, 1, 2, 0
CashPayment.setSenderPhone() 1, 1, 2, 0
Customer.Customer() 1, 2, 2, 0
Customer.Customer() 1, 0, 0, 0
Customer.getName() 1, 1, 2, 0
Customer.getPhone() 1, 1, 2, 0
Customer.setName() 1, 1, 2, 0
Customer.setPhone() 1, 1, 2, 0
DeliveryInfo.DeliveryInfo() 1, 8, 2, 0
DeliveryInfo.getFlightNumber() 1, 1, 2, 0
DeliveryInfo.getOrderDate() 1, 1, 2, 0
DeliveryInfo.getReceiverAddress() 1, 1, 2, 0
DeliveryInfo.getReceiverName() 1, 1, 2, 0
DeliveryInfo.getReceiverPhone() 1, 1, 2, 0
DeliveryInfo.getSenderAddress() 1, 1, 2, 0
DeliveryInfo.getSenderName() 1, 1, 2, 0
DeliveryInfo.getSenderPhone() 1, 1, 2, 0
DeliveryInfo.setFlightNumber() 1, 1, 2, 0
DeliveryInfo.setOrderDate() 1, 1, 2, 0
DeliveryInfo.setReceiverAddress() 1, 1, 2, 0
DeliveryInfo.setReceiverName() 1, 1, 2, 0
DeliveryInfo.setReceiverPhone() 1, 1, 2, 0
DeliveryInfo.setSenderAddress() 1, 1, 2, 0
DeliveryInfo.setSenderName() 1, 1, 2, 0
DeliveryInfo.setSenderPhone() 1, 1, 2, 0
Flight.setSenderPhone() 1, 1, 2, 0
Flight.setSenderPhone() 1, 1, 2, 0
Flight.setSenderPhone() 1, 1, 2, 0
Flight.setSenderPhone() 1, 1, 2, 0
Flight.setSenderPhone() 1, 1, 2, 0
Flight.setSenderPhone() 1, 1, 2, 0
Flight.setSenderPhone() 1, 1, 2, 0
Flight.setSenderPhone() 1, 1, 2, 0
Flight.setSenderPhone() 1, 1, 2, 0
Flight.setSenderPhone() 1, 1, 2, 0
Flight.setSenderPhone() 1, 5, 2, 0
Main.setSenderPhone() 4, 42, 3, 2
Order.setSenderPhone() 2, 13, 3, 8
Order.setSenderPhone() 1, 1, 2, 1
Order.setSenderPhone() 2, 4, 3, 0
Order.setSenderPhone() 2, 4, 3, 0
Order.setSenderPhone() 1, 6, 2, 0
Order.setSenderPhone() 1, 1, 2, 0
Order.setSenderPhone() 1, 1, 2, 0
WeChatPayment.setSenderPhone() 1, 1, 2, 0


Block Depth Statements

0 12
1 90
2 137
3 27
4 12
5 0
6 0
7 0
8 0
9 0

图表分析:
(1)代码模块
总行数:444 行
语句数:278 个
(2)代码复杂性
最大复杂度:16,代码可维护性急剧下降,测试成本呈指数级增长,团队协作效率受损。
平均复杂度:1.38,表明代码整体结构极为简单,函数逻辑高度扁平化,反映出代码设计存在过度拆分或逻辑缺失的潜在问题。
(3)代码注释
含注释行占比:0,注释占比极低,这会给代码理解带来极大困难。对于后续开发者,无论是理解代码功能逻辑、修改维护还是扩展功能,都缺乏必要的文字说明引导,急需补充注释来提升代码可理解性。
(4)代码块深度
最大代码块深度:3,存在一定深度的逻辑嵌套,可能是多层条件判断或循环嵌套,这会使代码执行流程跟踪难度增加,调试时定位问题也更棘手。
平均代码块深度:1.77,表明代码整体结构非常扁平,嵌套层级极少。

总结:抽象与接口的便利性有了感受
老师提出可以将输入单独分成类,这一点启发了我,这样做在第二次迭代的时候就不需要修改太多,也能降低复杂度,避免混乱。
三、踩坑心得
第一次大作业我想使用int来存储电话,但发现一直非零返回。最终使用了String。

可见对数据的类型的判断十分重要,正确的类型有利于我们打代码。
但是还是没有明白为什么非零返回。
四、改进建议
1、耐心读题是高效开发的基础,需全面理解需求核心从而提升开发效率与质量。
2、类设计的时候要符合单一职责原则、里氏代换原则、开闭原则、合成复用原则、依赖倒转原则。
3、输出部分也可以单独分成一个类,不要在main里放置太多语句。
五、总结
1、综合性总结
两次作业都发现注释写得不够,很多地方没把逻辑说清楚,比如关键步骤没解释、复杂的算法没拆分说明,这不仅让自己以后看代码费劲,同学互相看的时候也难理解。建议写代码时顺手加上注释,比如在函数开头简单说下功能,复杂的循环或判断旁边标一下思路,用 // 或者 /* */ 都行,别等写完了再补,不然容易忘。
写代码前一定要花时间把题看明白!有时候着急动手写,结果漏了条件或者误解要求,最后返工更浪费时间。可以先在纸上画画流程图,或者把题目里的关键条件列出来,比如 “输入范围”“输出格式” 这些,想清楚步骤再开始敲代码。
建议尽量一次性把一个功能写完,别写一半留到下次。有时候中断后再接着写,可能会忘记之前的思路,或者前后逻辑接不上,容易出 bug。
加强 Java 核心知识点学习,探索更高效的实现方式,逐步提升编程综合能力。

posted @ 2025-05-25 05:35  我要名字  阅读(18)  评论(0)    收藏  举报