1.前言
这是第二次接触 Java 编程语言大题。相比第一次的电梯调度问题,这次面对航空货运管理系统时我不再迷茫。反复读题后,我很快确定了代码编辑方向,并一步步完成代码编写。航空货运管理系统难度不大但很繁琐,需定义许多相互关联的类,如货物类、航班类、客户类等。编写过程中,我时刻提醒自己要细心和耐心,因稍有不慎就可能出错,进而影响整个系统运行。这次经历让我深刻体会到细心和耐心在编程中的重要性,也让我在 Java 编程这条道路上又迈进了一步,增强了应对复杂项目的能力和信心。
题目集8:这次题目集涵盖NCHU_点线面问题重构(继承与多态)、NCHU_雨刷程序功能扩展设计以及NCHU_航空货运管理系统(类设计)三个题目,虽然题目量不算多,但每个题目都具有相当的复杂性。尤其是航空货运管理系统,其繁琐程度尤为突出,需要设计众多相互关联的类来构建整个系统框架。然而,这些题目的难度并非高不可攀。只要能静下心来,耐心、细致地读懂题目要求,精准把握每一个细节,并且在编写代码时保持高度的专注和谨慎,认真对待每一行代码,确保逻辑严谨、结构清晰,就能够顺利攻克这些题目,完成这次题目集的挑战。
题目集9:这次题目集涵盖了NCHU_魔方问题,NCHU_点线面问题再重构(容器类),NCHU_航空货运管理系统(继承与多态)三个题目,与上一个题目集类似,题目量不是很大,但是每个题目都十分繁琐,魔方问题要分清楚正方体和正三棱锥,然后分别计算面积和体积,点线面问题需要构建容器类来储存多个点,最后的航空货运问题需要从上一个题目集的基础上添加子类和父类,通过继承和多态来更加方便地完成题目。
2.设计与分析
1.题目集8NCHU_航空货运管理系统(类设计)
本次题目模拟某客户到该航空公司办理一次货运业务的过程: 航空公司提供如下信息: 航班信息(航班号,航班起飞机场所在城市,航班降落机场所在城市,航班 日期,航班最大载重量) 客户填写货运订单并进行支付,需要提供如下信息: 客户信息(姓名,电话号码等) 货物信息(货物名称,货物包装长、宽、高尺寸,货物重量等) 运送信息(发件人姓名、电话、地址,收件人姓名、电话、地址,所选 航班号,订单日期),虽然题目没有给具体需要定义哪些类,但是根据要求,我们可以自己定义需要的类,包括Dingdan类、Kehu类、Huowu类、Hangban类等,然后通过Main将它们串联起来,最后实现要求。
(以下是类图)

本次题目聚焦于面向对象设计原则中的单一职责原则、里氏代换原则、开闭原则以及合成复用原则,旨在考察我们对这些核心原则的理解与应用能力。我们在完成代码设计时,必须深入理解这些原则的内涵,确保代码的结构与实现符合设计规范。在编码结束后,需要进行严格的代码审查,检查内容包括:是否每个类仅负责单一功能(单一职责原则);子类是否能替代无缝父类(里氏代换原则);软件实体是否对扩展开放,对修改关闭(开闭原则);以及是否优先使用对象组合而非类继承(合成复用原则)。通过这样的检查,确保代码不仅功能正确,而且具有良好的可维护性、可扩展性及可重用性,符合面向对象程序设计的基本要求。这要求学生在代码设计过程中,不仅要关注功能实现,还要注重代码的结构设计与原则遵循,从而提升代码质量与软件系统的整体架构质量。
唯一需要注意的地方就是费率问题,根据不同的重量,有不同的计算费率。下面是我在Main中定义的静态方法,用于计算不同的费率。
private static double getFreightRate(double weight) {
if (weight >= 100){
return 0.15;
} else if (weight >= 50) {
return 0.25;
} else if (weight >= 20) {
return 0.30;
} else {
return 0.35;
}
}
这次题目涉及的航空货运管理系统虽然从难度上看并不算高,但代码量较大,这要求在编写过程中需要格外细心,避免出现字母敲错这类基础性错误。由于代码庞大,可能会在一定程度上增加开发难度和出错概率。然后还需要提升自己编写代码的速度,不然需要花费大量的时间来完成一道题目。
(下面是SourceMontor的生成报表内容)
306行代码和229个语句,其中48个是方法调用语句。代码中有3.5%的分支语句,但没有注释。文件中定义了5个类和接口,平均每类包含10.8个方法。平均每个方法有2.65个语句,最深的代码块包含226行,且最大块深度为3。最复杂的方法是 Main.getFreightRate()
,其复杂度为5,行号为214。Kiviat图显示了代码的复杂度、方法/类比率、平均语句/方法、平均深度、最大深度和最大复杂度等指标的相对比例。块直方图则展示了不同深度的代码块中语句数的分布情况,帮助我们识别需要优化或重构的代码部分。这些度量指标和图表为代码质量和结构提供了全面的可视化分析,有助于提升代码的可维护性和可读性。
2.题目集9NCHU_航空货运管理系统(继承与多态)****
这次题目集很好顺承了上一次题目集的代码,需要的基本信息相同,但是需要增加一些父类与子类的关系,并使用多态来完成计算最后的运费。需要的信息:航班信息(航班号,航班起飞机场,航班降落机场,航班日期,航班最大载 重量)客户信息(姓名,电话号码等) 货物信息(货物名称,货物包装长、宽、高尺寸,货物重量等) 运送信息(发件人姓名、电话、地址,收件人姓名、电话、地址,所选航班号,订单日期) 支付方式(支付宝支付、微信支付、现金支付)等。这次航空货运管理系统增加了客户类型,货物数量,货物类型和支付方式,不同的客户的折扣不同,不同货物的费率不同,所以需要在Main中定义更多的方法来计算运费。
(以下是类图)

此次题目实现了一个航空货运管理系统,涵盖了客户、货物、航班和订单管理,并实现了运费计算和支付功能。代码采用面向对象设计,包含多个类和接口,如抽象类 Number
及其子类 Kehu
(客户)、Huowu
(货物)、Hangban
(航班)、Dingdan
(订单),以及支付相关的 Payment
接口和其子类 WechatPay
、AliPay
、CashPay
。主类 Main
负责输入处理、运费计算和输出。程序根据货物重量和类型计算运费,支持不同支付方式,并应用客户折扣。然而,代码缺乏注释,异常处理不够健壮,存在硬编码的费率和折扣,且有重复代码,用户输入验证不足,需改进以提升可读性、可维护性和健壮性。
以下是分别用来计算不同货物的不同费率和不同客户的不同折扣:
private static double getFreightRate(String type, double weight) {
switch (type) {
case "Normal":
if (weight < 20) return 35;
if (weight < 50) return 30;
if (weight < 100) return 25;
return 15;
case "Dangerous":
if (weight < 20) return 80;
if (weight < 50) return 50;
if (weight < 100) return 30;
return 20;
case "Expedite":
if (weight < 20) return 60;
if (weight < 50) return 50;
if (weight < 100) return 40;
return 30;
default:
return 0;
}
}
private static double getDiscountRate(String customerType) {
switch (customerType) {
case "Individual":
return 0.9;
case "Corporate":
return 0.8;
default:
return 1.0;
}
}
(下面是SourceMontor的生成报表内容)

316行代码,包含194个语句,表明代码的规模中等。代码中定义了10个类和接口,平均每类包含9.20个方法,显示了较高的类功能封装性。分支语句占比3.1%,方法调用语句有27个,显示代码逻辑和模块调用较为简单。然而,代码中没有注释行,这可能会影响代码的可读性和维护性。最复杂的方法是WechatPay.getPaymentType()
,位于第7行,复杂度为1,表明方法逻辑较为简单。最大块深度为4,出现在第189行,显示代码中存在一定程度的嵌套结构。Kiviat图和块直方图分别展示了代码的复杂度分布和其他指标的相对比例,块直方图显示了不同深度代码块中语句数的分布情况。这些信息综合起来,有助于开发者评估代码质量和复杂度,识别潜在的优化点,从而为代码优化和重构提供重要参考。
3.踩坑心得
此次航空货运管理系统问题,相比于上一次的电梯调度问题,难度小了很多,但是代码量增加了很多,需要定义更多的类,并通过继承关系,将各种类串联在一起。首先,需要注意的就是费率,刚开始忽视了这个条件,导致我找了半天错误,任然不知道哪错了,再一次次反复读题后,我发现居然还有费率,我打算都震惊了,然后第二次题目就要注意新增的客户类型,货物类型,它们都有自己不同的计算折扣,需要分清楚,还好这次读题时就发现了,但是还是需要仔细来区分。然后这次题目集有明确的输出格式,需要严格按照要求来输出,不然会一直过不了测试点的。
4.改进建议
一是类和接口设计合理但功能简单,可进一步优化。
二是数据输入需增加验证,确保数据有效性和完整性。
三是运费计算和折扣逻辑可扩展,需考虑更多实际业务因素。
四是代码可维护性和扩展性有待提高,需减少重复代码、加强模块化设计。
五是代码注释和文档不足,需加强以提高可读性和可维护性。
六是需要严格遵守面向对象程序设计原则。
5.总结
1.在过去的两周里,我完成了两次题目集。题目量不大,但都十分繁琐,尤其是航空货运管理系统问题。两次题目集的前后关联十分紧密,第二次题目集需要在第一次题目集的代码基础上进行加工处理。这样的安排让我能够更好地理解和掌握代码的结构和功能,同时提高了我的代码复用和优化能力。通过这种方式,我不仅巩固了之前的知识,还提升了编程技能和问题解决能力,为今后的软件开发工作积累了宝贵的经验。
2.尽管成功完成了这两次题目集,但我投入了大量的时间和精力,这让我意识到自己在编程效率和准确性方面仍需提升。面对繁琐的航空货运管理系统问题,我常常因拼写错误和逻辑瑕疵而受阻,暴露出我对细节把控的不足。此外,我的编程速度较慢,这在面对复杂任务时尤为明显。为了改进,我计划深入学习编程基础知识,加强代码练习以提高熟练度,并利用IDE的自动完成功能来减少错误。我还将注重代码审查和测试,以提升代码质量和可维护性,同时借助版本控制系统优化代码管理。这次经历让我清楚地认识到自己的短板,也坚定了我通过持续学习和实践来增强编程能力的决心。
3.我要跟紧老师上课的步伐,积极与老师讨论相关问题的解决方法,学习面向对象程学设计的基本原则,然后在课后积极巩固上课老师讲的知识,自己主动去做一下小题目,不只是依赖于PTA中发布的题目。