第二次blog作业
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的生成报表内容)

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中发布的题目。
第二次blog作业的更多相关文章
- JAVA第二次blog总结
JAVA第二次blog总结 0.前言 这是我们在博客园上第二次写博客,进行JAVA阶段学习的总结.现在我们接触到JAVA已经有一段时间了,但难点还是在于编程思想和方法的改变,第二阶段的学习让我对于理解 ...
- 南昌航空大学-软件学院-22206104-段清如-JAVA第一次Blog作业
南昌航空大学-软件学院-22206104-段清如-JAVA第一次Blog作业 前言: 这个学期才开始接触java,到现在一个多月的时间,已经差不多可以写出一些基本的简单的程序了.对比上个学期学习的C语 ...
- 2016福州大学软件工程第二次团队作业——预则立&&他山之石成绩统计
第二次团队作业--预则立&&他山之石成绩统计结果如下: T:团队成绩 P:个人贡献比 T+P:折算个人成绩,计算公式为T+T/15*团队人数*P 学号 组别 Team P T+P 03 ...
- 关于Axure RP软件的介绍——软件工程实践第二次个人作业
关于Axure RP软件的介绍——软件工程实践第二次个人作业 Axure RP是一个非常专业的快速原型设计的一个工具,客户提出需求,然后根据需求定义和规格.设计功能和界面的专家能够快速创建应用软件或W ...
- C高级第二次PTA作业
6-7 删除字符串中数字字符 1.设计思路: (1)算法: 第一步:定义一个字符数组item,输入一个字符串赋给字符数组item.调用函数delnum, 第二步:在函数delnum中定义循环变量i=0 ...
- SDN 第二次上机作业
SDN第二次上机作业 1.控制器floodlight所示可视化图形拓扑的截图,及主机拓扑连通性检测截图 拓扑 连通性 2.利用字符界面下发流表,使得'h1'和'h2' ping 不通 流表截图 连通性 ...
- 2019 SDN第二次上机作业
2019 SDN第二次上机作业 1. 利用mininet创建如下拓扑,要求拓扑支持OpenFlow 1.3协议,主机名.交换机名以及端口对应正确,请给出拓扑Mininet执行结果,展示端口连接情况 创 ...
- <你们都是魔鬼吗>第二次团队作业:团队项目选题
第二次团队作业:团队项目选题 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 你们都是魔鬼吗 作业学习目标 任务1: 团队初选项目可行性自评,使用 ...
- 第二次团队作业-需求分析(By七个小矮人)
第二次团队作业-需求分析 一.格式描述 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/ 这个作 ...
- OO第二单元——电梯作业总结
前言 本单元作业主要以设计电梯来实现多线程编程.本章主要学习了如何使用多线程以及如何确保多线程安全,从电梯的调度策略中学会了如何简单地使用synchronized锁来控制线程安全. 首先,明确锁的两个 ...
随机推荐
- 基于注意力机制与改进TF-IDF的推荐算法
前言 本篇文章是2020年8月发表于<计算机工程>的一篇期刊论文,文章名称<基于注意力机制与改进TF-IDF的推荐算法>. 文章针对传统推荐系统主要依赖用户对物品的评分数据而无 ...
- 面试题40. 最小的k个数
地址:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/ <?php /** * 面试题40. 最小的k个数 * 输入整数数组 ...
- AI回答:一个简洁的php中间件类
<?php class MiddlewareStack { private $middlewares = []; private $request; private $response; /** ...
- faker 函数支持哪些
3.2 常用函数 除了上述介绍的fake.name和fake.address生成姓名和地址两个函数外,常用的faker函数按类别划分有如下一些常用方法. 1.地理信息类 fake.city_suffi ...
- # 如何引进高级的 IT 自动化项目:一个 3 步走计划
如果您的团队与大多数 IT 组织一样,您的团队正在执行某种形式的自动化(包括开发和运营),即使只是运行简单的脚本来完成基本任务. 事实上,开始自动化之旅的最佳地点是执行普通的.低技能的任务,例如密码重 ...
- Qt 给窗口绘制阴影
文章目录 Qt 给窗口绘制阴影 前言 重载`paintEvent`法 QGraphicsDropShadowEffect方法 使用九图拼凑法 九宫格缩放阴影法 Qt 给窗口绘制阴影 前言 最近自定义一 ...
- 解决CondaError: Run 'conda init' before 'conda activate'
前言 使用 Anaconda 激活 python 环境,报错: conda activate deepseek7B CondaError: Run 'conda init' before 'conda ...
- Jupyter Notebook的所有文件ipynb保存下来
前言 如果你想要保存整个 Jupyter Notebook 工作目录,包括所有笔记本和其他相关文件,最直接的方法是将整个文件夹压缩为一个 ZIP 或 TAR 文件. 下载单个文件 压缩文件夹下载 在 ...
- HIVE将长整数转字符串的错误
有一个超长字符串,比如:441066000000001005712973,原来存放在HIVE里表A 是用DECIMAL(24)类型.现在要与另外一个用string类型保存这个字段的表B关联,老是失败. ...
- 还原大师-遍历残缺字符串匹配md5杂凑值
题目: 我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母, 为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码. 但是我们获得它的32位 ...