第二次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锁来控制线程安全. 首先,明确锁的两个 ...
随机推荐
- P4118 [Ynoi2018] 末日时在做什么?有没有空?可以来拯救吗?
YNOI 智慧题 EasyVer1 [Ynoi Easy Round 2015] 世上最幸福的女孩 EasyVer2 小白逛公园 先看 EasyVer2 单点修改 区间查询最大子段和 考虑在线段树维护 ...
- 牛逼了!16.2K Star!推荐一款开源的网络爬虫和浏览器自动化库:Crawlee!
在当今的互联网世界中,网络爬虫作为一种重要的工具,被广泛应用于数据收集.内容监控.SEO优化以及自动化测试等多个领域.随着技术的不断进步,各种开源的网络爬虫库也应运而生.今天,我向大家推荐一款非常优秀 ...
- 【 Python 】补全fibersim 导出的xml语法
fibersim导出的xml文件中,node 和mesh部分的标签会缺失.即<R></R>变成了<R/>. 以下python脚本可以自动修正 # ********* ...
- docx4j转换HTML并生成word文档实践
一.背景 在项目开发中,有一个需求需要将富文本编辑器中的内容转换为word文档.在网上看了很多开源第三方工具包的对比,最终选择了docx4j,主要原因有一下几点: 可以将html转换为word 对wo ...
- 阿里云平台OSS对象存储
OSS即"OpenStorageService",概念上没啥新意,就是本地存储搬到阿里云平台上了,单个存储对象大小可以达到5G,看了下阿里的OSS教程java版本, 使用原生js和 ...
- RESTful的连接时间超时时间设定
dsResrful的连接方式时,如何设定timeout呢? DSRestConnection.HTTP.ConnectTimeout := 5000; 就这么简单.因为封装的indy的TidHTTP. ...
- langchain0.3教程:聊天机器人进阶之方法调用
我们思考一个问题:大语言模型是否能帮我们做更多的事情,比如帮我们发送邮件.默认情况下让大模型帮我们发送邮件,大模型会这样回复我们: 可以看到,大模型无法发送邮件,它只会帮我们生成一个邮件模板,然后让我 ...
- 【U-Boot】解决U-Boot的“Unknown command 'help' - try 'help'”问题
[U-Boot]解决U-Boot的"Unknown command 'help' - try 'help'"问题 零.起因 最近在玩U-Boot,自己编译U-Boot之后输入hel ...
- 保存计算过程的计算器——java实现
一.设计模型 按照MVC-Model View Control(模型,视图,控制器)的设计思想展开程序的设计和代码的编写.数据模型部分相当于MVC中的Model角色,视图设计部分给出的界面部分相当于M ...
- jmeter:结合while控制器实现性能测试
一.场景 1.导入时,导入操作的用户数比较少,但是单次导入的数据量较大 2.导入文件一共有三步操作,上传-验证-导入,执行完当前操作才可以执行下一步操作. 2.导入时,即使导入数据量较大,导入操作需要 ...