第二次BLOG大作业-航空货运管理系统

一.前言

相对于第一次大作业电梯,难度确实变小了,算法方面并没有值得过多的思考,但是题目必须要读懂。这次航班货运系统大作业主要考察的是Java语言中继承与多态,需要我们熟练运用父类子类间的关系来实现单一职责及开闭原则从而提高代码的可读性及可维护性。
遇到这个题目首先要读懂题目要求,而不是立刻敲代码,相信以后遇到的其他题目也要按照这样的步骤来处理,
下面是对这两周的回顾与小结。

二.设计与分析

1.第一次航空货运管理系统
题目
某航空公司“航空货运管理系统”中的空运费的计算涉及多个因素,通常包
括货物重量/体积、运输距离、附加费用、货物类型、客户类型以及市场供需等。
本次作业主要考虑货物重量/体积,以下是具体的计算方式和关键要点:
一、计费重量的确定
空运以实际重量(Gross Weight)和体积重量(Volume Weight)中的较
高者作为计费重量。
计算公式:
体积重量(kg) = 货物体积(长×宽×高,单位:厘米)÷ 6000
示例:
若货物实际重量为 80kg,体积为 120cm×80cm×60cm,则:
体积重量 = (120×80×60) ÷ 6000 = 96kg
计费重量取 96kg(因 96kg > 80kg)。

二、基础运费计算
费率(Rate):航空公司或货代根据航线、货物类型、市场行情等制定(如
CNY 30/kg)。本次作业费率采用分段计算方式:2
𝐑𝐚 =
𝟑 重量 < 𝟐
𝟐 𝟐 ≤ 重量 < ��
𝟑 �� ≤ 重量 < 𝟐�
𝟑 重量 ≥ 𝟐�
公式:基础运费 = 计费重量 × 费率

三、题目说明
本次题目模拟某客户到该航空公司办理一次货运业务的过程:
航空公司提供如下信息:
航班信息(航班号,航班起飞机场所在城市,航班降落机场所在城市,航班
日期,航班最大载重量)
客户填写货运订单并进行支付,需要提供如下信息:
 客户信息(姓名,电话号码等)
 货物信息(货物名称,货物包装长、宽、高尺寸,货物重量等)
 运送信息(发件人姓名、电话、地址,收件人姓名、电话、地址,所选
航班号,订单日期)
 支付方式(支付宝支付、微信支付)
注:一个货运订单可以运送多件货物,每件货物均需要根据重量及费率单独
计费。
程序需要从键盘依次输入填写订单需要提供的信息,然后分别生成订单信
息报表及货物明细报表。

四、题目要求
本次题目重点考核面向对象设计原则中的单一职责原则、里氏代换原则、开
闭原则以及合成复用原则,除需要在 PTA 平台提交源码外,还需要在超星平台
提交本次作业最终得分源码(首次提交最高分源码)的类图,评判标准为:
基础得分:PTA 实际得分
设计因素:单一职责原则(40%)、里氏代换原则(20%)、开闭原则(20%)、
合成复用原则(20%)

类图

小总结:
难度不是那么大,主要还是读题方面,类的设计也并不复杂,主要难点可能还是语法方面易出错。

2.第二次航空货运管理系统

题目
某航空公司“航空货运管理系统”中的空运费的计算涉及多个因素,通常包
括货物重量/体积、运输距离、附加费用、货物类型、客户类型以及市场供需等。
本次作业主要考虑货物重量/体积,以下是具体的计算方式和关键要点:
一、计费重量的确定
空运以实际重量(Gross Weight)和体积重量(Volume Weight)中的较
高者作为计费重量。
计算公式:
体积重量(kg) = 货物体积(长×宽×高,单位:厘米)÷ 6000
示例:
若货物实际重量为 80kg,体积为 120cm×80cm×60cm,则:
体积重量 = (120×80×60) ÷ 6000 = 96kg
计费重量取 96kg(因 96kg > 80kg)。

二、基础运费计算2
费率(Rate):航空公司或货代根据航线、货物类型、市场行情等制定(如
CNY 30/kg)。本次作业费率与货物类型有关,货物类型分为普通货物、危险货
物和加急货物三种,其费率分别为:
计算公式:基础运费 = 计费重量 × 费率 × 折扣率
其中,折扣率是指不同的用户类型针对每个订单的运费可以享受相应的折扣,
在本题中,用户分为个人用户和集团用户,其中个人用户可享受订单运费的 9
折优惠,集团用户可享受订单运费的 8 折优惠。

三、题目说明
本次题目模拟某客户到该航空公司办理一次货运业务的过程:
航空公司提供如下信息:
航班信息(航班号,航班起飞机场,航班降落机场,航班日期,航班最大载
重量)3
客户填写货运订单并进行支付,需要提供如下信息:
 客户信息(姓名,电话号码等)
 货物信息(货物名称,货物包装长、宽、高尺寸,货物重量等)
 运送信息(发件人姓名、电话、地址,收件人姓名、电话、地址,所选
航班号,订单日期)
 支付方式(支付宝支付、微信支付、现金支付)
注:一个货运订单可以运送多件货物,每件货物均需要根据重量及费率单独
计费。
程序需要从键盘依次输入填写订单需要提供的信息,然后分别生成订单信
息报表及货物明细报表。

四、题目要求
本次题目重点考核面向对象设计原则中的单一职责原则、里氏代换原则、开
闭原则以及合成复用原则、依赖倒转原则,除需要在 PTA 平台提交源码外,还
需要在超星平台提交本次作业最终得分源码(首次提交最高分源码)的类图,
评判标准为:
基础得分:PTA 实际得分
设计因素:单一职责原则(20%)、里氏代换原则(20%)、开闭原则(20%)、
合成复用原则(20%)、依赖倒转原则(20%)。
最终得分:基础得分扣减所有违背设计原则分值

类图

sourcemoniter报表分析





字段 数值 解读
Lines 482 文件行数接近 500,Main.java 承载了过多核心逻辑,建议按功能拆分为多个文件。
Statements 216 业务逻辑密集,但注释与空行占比极低(仅 0.4%),代码可读性差。需补充注释以提升维护性。
Percent Branch Statements 17.6% 分支逻辑占比接近 20%,整体可控,但需关注嵌套过深的方法。
Method Call Statements 95 方法调用频繁,跨类依赖较强,需检查接口设计是否合理,避免过度耦合。
Percent Lines with Comments 0.4% 注释几乎空缺,后期维护困难。
Classes and Interfaces 12 单文件包含 12 个类/接口,严重违反单一职责原则。应分包管理(如 model、controller、util)。
Methods per Class 3.50 类方法数量合理,但文件内类过多导致职责混乱。需拆分文件并重构模块化设计。
Average Statements per Method 3.45 方法长度较短,但文件整体过长。建议合并工具类方法或抽取通用逻辑。
Name of Most Complex Method Controller.recept_twoList() 输入解析逻辑集中,圈复杂度高达 20,远超安全阈值(10),亟需拆分。
Maximum Block Depth 8 嵌套深度达 8 层(如多重 if-else),可读性极差。需通过“早返回”策略减少嵌套。
Average Block Depth 2.39 平均嵌套深度合格,但局部方法(如 recept_twoList)深度超标,需针对性优化。

小结:运用了继承中父类与子类关系,代码确实有了更好地可扩展性,维护性。

三、开发中踩过的坑
大小写坑

用户输入“Expedite”(加急)能识别,但输入“expedite”就失败,后来强制要求首字母大写。

数学计算坑

运费算出来有误差(比如10元变成9.999元),后来用四舍五入解决。

公式搞反了

体积重量原本按长×宽×高÷600算,结果比实际大10倍,查手册才发现应该是÷6000。

数据被意外修改

订单里的货物列表能被外部修改,后来加了“防改保护锁”(返回只读列表)。

四、未来怎么改进?
运费计算:拆解策略

把不同货物的运费规则分开写,像菜单一样,加新规则不用动老代码。

比如:危险品、加急品各自有独立计算模块。

输入检查:加“门卫”

java
复制
下载
// 示例:检查重量是不是负数
if (重量 <= 0) {
throw new Exception("亲,重量不能是负数或零!");
}
让类“各司其职”

新建一个“运费计算器”,专门负责算钱,订单类只负责存数据。

扩展新功能

多航班联运:如果一个航班装不下,自动拆到多个航班。

加保险服务:贵重货物可额外买保险。

历史订单查询:像淘宝一样能查半年内的订单。

五、学到了啥?

一、项目是干啥的?
这是一个管理航空货运订单的程序,能处理客户信息、计算运费、检查航班能不能装得下货物。比如你寄快递,系统会自动算运费,还能告诉你选的航班是否超重。

二、现在有啥问题?
运费计算太复杂

计算运费的代码像绕迷宫(多层if-else),改起来容易出错。

比如“危险品运费规则”写了4层判断,万一政策变了,改代码会很头疼。

中文类型硬编码

货物类型(比如“危险品”)直接写死在代码里,如果想加“冷冻货物”,得改源代码。

输入没检查

用户如果输入“-5kg”或者“2023/13/32”(错误日期),程序会直接崩溃。

三.一个类管太多事

Dingdan(订单)类既要存数据,又要算运费,就像让快递员既送货又做财务,容易乱。

代码要“分工明确”

像搭积木,每个类只干一件事(比如航班管运输、客户管信息)。

数据操作要“快准狠”

用cargoList.stream()一行代码搞定货物总重计算,不用写循环。

防御性编程

关键地方加检查,比如“货物重量不能为负”,防止用户乱输入。

输出要美观

用System.out.printf控制格式,让运费显示为“100.0元”而不是“100.0000000001元”。

posted @ 2025-05-26 12:09  夏佳宏  阅读(35)  评论(0)    收藏  举报