第二次blog——航空货运管理

一.引言

这次的航空货运管理的大作业相对上次的电梯来说是比较简单一点的,至少在第八次题目集刚看到这个航空货运管理的题目,刚读完题目时,我稍微的理解到了题目意思,也有思路,不会像上次一样像一个无头苍蝇一样,逻辑也比较简单,主要是单一职责原则,里氏代换原则,开闭原则,依赖倒转原则的运用,也学习到和用到了新的东西,比如:四大原则,接口父类这些东西,也吸取了上次写大作业的教训,所以在这次大作业中完成的也比较快,但还是出现了许多问题,以及不理解的地方,在航空货运管理的其他题目中还有一些题目的测定点还是搞不明白,这次的代码注释也有了一些,比上次多了,在我二次读代码也可以稍微的看懂了,希望在之后的题目集中可以完成的更加完美

二.设计与分析

第八次题目集的题目分析:

雨刷程序功能拓展设计题目分析:

这道题是对之前作业中的雨刷问题进行重构,将功能进行拓展,原则上是比较简单的因为是在上一次的代码基础上进行修改,可是当控制杆一直升档时,我的程序一直都是答案错误,在控制杆一直升档时我的输出结果一直都是非零返回,在尝试了多次的修改和测试时还是无法解决,之后我就放弃了这个测试点,跳过了这题,现在在回去看这题还是有点不着头脑,代码的逻辑也稍微有点混乱
image

航空货运管理系统题目分析:

题目要求:

题目的大概意思也是非常的好理解,就是计算货物的运费以及输出订单信息,货物计费重量的判断和费率的分类,代码写起来的逻辑也是比较好理解的
https://images.ptausercontent.com/499d204b-fcef-4610-a9ca-c8fbf5e346d9.pdf

类图设计:

image
Order 类
功能:用于表示订单,管理订单相关信息与操作
属性:包含订单编号、日期、收发货地址、姓名、电话,关联的商品列表、航班、客户、支付方式
方法:获取和设置各属性值,计算订单总金额、展示订单信息、检查订单
Goods 类
功能:描述商品信息
属性:商品编号、名称、宽、长、高、重量
方法:获取和设置属性值,计算商品体积、重量相关金额
Flight 类
功能:管理航班信息
属性:航班编号、出发地、目的地、时间、最大载重量、当前载重量
方法:获取和设置属性值,比较载重量、增加载重量
Customer 类
功能:存储客户信息
属性:客户编号、姓名、电话、地址
方法:获取和设置属性值
Payment 类
功能:支付抽象类(接口),可以修改支付方式
方法:pay 方法用于执行支付操作,输出支付金额
WechatPay 类和 AliPay 类
功能:分别实现微信支付和支付宝支付,继承自 Payment。
方法:重写 pay 方法,实现具体支付逻辑。
showOrder 类
功能:负责展示订单信息。
方法:Print 方法用于打印订单。

Source Monitor分析结果:

image

代码整体分析:

代码的总行数是379,对于我来说是比较适中的,有259条语句,这次代码的分支数占比比较小,方法调用语句有37条,调用方法的程度相对频繁,注释虽然有,对我自己来说理解是够的,但别人读我的代码这点注释量可能还是不够,代码中类和接口的数量有7个,还是比较多的,有一定复杂数,,每个方法的语句数相对少一点,代码的逻辑相对简单,代码整体复杂度不算很高,代码最复杂的行数是268行,在订单类的检查方法中方法较复杂,因为在检查订单的同时还调用的打印订单类中的Print方法,代码平均块深度为1.3,平均复杂度为1.15.

第九次题目集的题目分析:

点线面问题再重构(容器类)题目分析:

这道题目是在第八题的基础上进行再次重构,在第八次题目集的题目中新添加一个了一个容器类,来储存点,线,面,然后又增加和删除操作最后再输出,刚看到这个题目时还是有点懵逼的不是很懂怎么写这个,后面又去看了一遍学堂在线的List泛型的课,才开始动笔写,写完之后发现在Main类的输入上一直出问题,编译错误和答案错误,后面才解决这个问题,经过点线面再重构这个题目,我对List泛型的理解和使用更加的了解了,也了解了该怎么去使用。

航空货运管理系统(继承与多态)题目分析:

这次的题目在之前的基础上添加的对货物的类型提供不一样的费率来计算运费以及对客户类型的不同提供折扣,在支付方式上也新添加了现金支付,处理支付方式的问题比较简单只需要在上次的代码上新添加一个实现接口类来输出,但是对货物的分类和费率的分类的处理还是有点烧脑的,一开始的我并没有什么思路,也让我无从下手,直到上课蔡老师讲到了工厂模式才有了一点思路

题目要求:对货物,支付方式和用户类进行扩展达到题目要求

https://images.ptausercontent.com/b9cec79b-8012-4901-843e-3d48f27d28a6.pdf

类图设计

image
1.Goods(货物类)
属性:包含货物编号num、名称name、类型type、宽width、长length、高height、重量weight等。
方法:有构造函数用于初始化属性,还有设置和获取属性的方法,以及计算体积重量的cal_volumeWeight方法和获取重量的Weight方法
2.Order(订单类)
属性:有订单编号orderNum、日期date 、寄件地址senderAddress 、寄件人姓名senderName 、寄件人电话senderPhone 、收件地址receiverAddress 、收件人姓名receiverName 、收件人电话receiverPhone 、货物列表goods 、航班flight 、客户customer 、支付方式pay等
方法:包含构造函数,以及大量设置和获取属性的方法,还有计算总费用的cal_Total方法和检查订单的check方法
3.Customer(客户类)
属性:有客户编号num、姓名name、电话phone、地址address、客户类型type、折扣discount
方法:有构造函数和设置、获取属性的方法
4.Flight(航班类)
属性:有机票编号num、出发地first、目的地arrive、出发时间time、最大载重max、当前载重current
方法:包含构造函数,以及设置和获取属性的方法,还有添加货物重量的add方法
5.Payment(支付抽象类)
方法:抽象方法pay,用于执行支付操作,由具体支付方式类实现
6.AliPay、WechatPay、Cash(支付方式类)
分别实现了Payment抽象类的pay方法,提供不同的支付实现方式。
7.rateFactory(费率工厂类)
方法:getRate方法根据货物类型返回对应的费率计算对象calculateRate。
8.calculateRate(费率计算接口)
方法:calculate方法根据货物重量计算费用,由普通货物、加急货物、危险货物等类实现。
9.普通货物、加急货物、危险货物
实现了calculateRate接口的calculate方法,用于根据各自规则计算费用。
10.showOrder(订单展示类)
方法:Print方法用于打印订单信息。

Source Monitor分析结果:

image

代码整体分析:

代码总共有473行,分支语句约有29个,不过注释行占比比较少,比例偏低,代码的可维护性比较低,类和接口有9个,不过每个类的平均方法数有16个,有点多了,可能有些类违反了单一职责原则,每个方法的平均语句数是1.68个,比较低,方法过于碎片化,代码的平均复杂度为1.26还是可以的,其中最复杂的方法是rateFactory.Money(),复杂度是5,不算非常高,还可以再简化一些,最大块深度是4层嵌套,这在某些情况下可能影响代码的可读性,可以适当的减少嵌套层次,代码总体注释不足,方法零碎,以及类的方法过多。

三.踩坑心得

将题目看清楚了再思考,不然很容易白费,我在第八次题目集中,在idle调试时计算出的答案一直都是错误的,我就在想是我哪个方法调用错了还是写错了,看了半天也没发现,再看一遍题目才发现货物计算运费时需要计费重量。并不是直接计算得到的体积,在代码过于复杂时,重复语句很多时,可以写一个父类和子类来继承,就不会写的一大串的代码,发现有一大半都是重复的,可以大幅度的减少工作量。以及我在写计算运费的方法时直接就命名为Money,结果我做题目集9时想回去看一下之前的代码看了好多遍才知道这个Money是干嘛的以及在哪里用到了这个,所以在写类和方法的名字时可以写的直接一点可以直接是英文的翻译,不然很容易搞混以及后续看自己的代码时不知道这个方法和类是干嘛的。在输入时要是有nextInt或者nextDouble之类的需要在语句后面加一个nextLine来消除换行符,不然你就会得到不明所以的答案错误,在没有完全读取你的输入时,就已经输出结果了。

四.改进建议

希望在出题时可以将需要输出的写清楚一点,那个航空货运管理的异常测试时,明明是将题目给出的异常测试结果复制上去的可是一直都是报错
雨刷程序功能扩展设计编码改进建议:
Lever1 和 Dial1 子类与父类几乎完全相同,仅 Lever1 增加了对档位 5 的显示支持
可以为 Lever 类添加构造函数参数,允许指定最大档位
对航空货运管理题目编码改进建议:
第一次:
将类名showOrder改为OrderDisplay更符合 Java 命名规范
方法名遵循驼峰命名法,如cal_Totalkg改为calculateTotalWeight
在关键操作(如创建货物、航班载重计算)中添加try-catch块,捕获并处理非法参数异常,避免程序崩溃
第二次:Goods 类:当前承担计算运费、体积重量等功能,可拆分为:
Goods:仅存储货物属性。
GoodsCalculator:独立计算运费、重量等逻辑,符合单一职责
添加 try-catch 块处理可能的异常(如用户输入非数字值),避免程序崩溃

五.总结

这次大作业中的两个航空货运管理题也是成功的做出来了,不再是像上次一样全都是答案错误,无疑给了一点信心,通过这次大作业,我对List泛型的定义和使用有了更深一步的了解,以及对继承和多态的使用更加熟练,了解了单一职责原则,里氏代换原则,开闭原则,依赖倒转原则在java中是如何进行的,对工厂模式有了初步的了解和使用,也开始在代码中写父类和接口,对方法的重写等来降低代码重复率,减轻工作量,我自身的编程能力也得到了进一步的提高。

posted on 2025-05-22 19:12  aioyh  阅读(16)  评论(0)    收藏  举报

导航