第二次Blog作业
一、前言
题目集8=9总结
题目集8-9,主要考核的是继承与多态的运用,这两个是Java中的核心机制,在代码结构优化、可维护性提升和系统扩展性增强方面有着非常大的作用。继承主要通过创建子类扩展父类来实现,多态主要通过继承、方法重写和父类引用指向子类对象实现,我们主要学习使用父类子类,抽象类和接口解决问题。
题目集8,主要考核的是继承与多态的运用,这两个是Java中的核心机制,包含3个题目,1、点线面问题重构 2、雨刷程序功能扩展设计 3、航空货运管理系统。点线面问题重构非常基础,主要是让我们熟悉抽象类与如何构建父类与子类,从而实现代码复用和多态性。雨刷程序功能扩展设计较点线面问题重构难度有提升,但逻辑依旧较为简单,只需要将原代码的类改为子类,创建抽象父类,设计雨刷第二种工作模式的代码,通过实现功能的扩展。航空货运管理系统是这两次作业的核心问题,但逻辑并不复杂,但需要满足设计原则,单一职责原则(40%)、里氏代换原则(20%)、开闭原则(20%)、合成复用原则(20%),主要通过这道题学习设计原则。
题目集9,包含3个题目,1、魔方问题,2、点线面问题再重构(容器类),3、航空货运管理系统(继承与多态)。魔方问题非常基础,点线面问题则是在上一次题目的基础上增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。航空货运管理系统(继承与多态)是在上一次题目的基础上进行功能拓展。
二、设计与分析
1、题目集8 航空货运管理系统设计与分析
题目简介:
本次题目模拟某客户到该航空公司办理一次货运业务的过程:
航空公司提供如下信息:
航班信息(航班号,航班起飞机场所在城市,航班降落机场所在城市,航班日期,航班最大载重量)客户填写货运订单并进行支付,需要提供如下信息:
客户信息(姓名,电话号码等)
货物信息(货物名称,货物包装长、宽、高尺寸,货物重量等)
运送信息(发件人姓名、电话、地址,收件人姓名、电话、地址,所选航班号,订单日期)
支付方式(支付宝支付、微信支付)
注:一个货运订单可以运送多件货物,每件货物均需要根据重量及费率单独计费。
类图如下

Source Monitor分析结果:

分析如下:
-
Main类:初步对输入的信息进行处理,创建客户、订单、航班,货物、发件人、收件人等对象,并将输入的信息 存入相应的对象中
-
Customer类:表示客户信息,包含客户编号、姓名、电话和地址。
-
Cargo类:表示货物信息,包含编号、名称、尺寸(宽、长、高)和重量。
-
Flight类:表示航班,包含航班号、出发机场、到达机场、起飞时间和最大载重等信息。
-
Order类:表示订单,包含订单号、货物列表和订单时间等属性,同时负责计算运费和显示订单详情。
-
People抽象类:作为发件人和收件人的基类,包含姓名、电话和地址等通用信息。
-
Recipient类和Sender类:继承自 People 类,分别表示发件人和收件人。
通过Source Monitor分析结果可以看出我的代码存在许多问题:
-
% Percent Lines with Comments(注释行占比):仅 0.5% 。由于这一题的逻辑较为简单,我忽视了在写代码的过程中添加注释,导致代码可读性差,维护成本高。注释是代码的重要组成部分,用来帮助理解和修改代码,应该重视这个问题。
-
Avg Complexity(平均复杂度):为 1.15 。Max Complexity(最大复杂度): 5,复杂度较高,可读性和维护性差。
心得:
刚接触Java中的设计原则,我对它们的特点还不是特别了解,在单一职责原则方面,Main类:承担了过多职责,包括输入数据收集和结果展示,违反单一职责原则。Order类:同时包含数据模型(订单信息)和业务逻辑(运费计算),导致类职责不清晰,应该将所有展示设为一个类。在里氏替换方面,基类设计缺陷:People 类的 display() 方法为空实现,子类必须重写才能正常工作,违反 LSP 中 “父类能出现的地方子类应该可以替换” 的原则,应该在父类中写一个最基本的方法,在子类中拓展。在开闭原则方面,Order 类的 crate() 方法硬编码了费率规则(如 <20kg 时费率为 35),若新增规则(如节假日费率调整),需直接修改 Order 类,违反开闭原则。display2() 方法直接在类中定义了展示格式,若需支持新的展示方式(如 JSON 格式),需修改原代码,应该将计算方法单独设为一个抽象类,通过子类扩展。在合成复用方面,过度使用继承,Sender 和 Recipient 继承自 People,但仅复用了基本属性(name, phonenum, address),若未来 People 新增与发件人 / 收件人无关的方法,会导致子类依赖不必要的行为。总体来说,可实现功能,但应该进行一些优化,使其满足规范。
2、题目集9 航空货运管理系统设计与分析
题目简介:本次题目模拟某客户到该航空公司办理一次货运业务的过程:航空公司提供如下信息:
航班信息(航班号,航班起飞机场,航班降落机场,航班日期,航班最大载重量)
客户填写货运订单并进行支付,需要提供如下信息:
客户信息(姓名,电话号码等)
货物信息(货物名称,货物包装长、宽、高尺寸,货物重量等)
运送信息(发件人姓名、电话、地址,收件人姓名、电话、地址,所选航班号,订单日期)
支付方式(支付宝支付、微信支付、现金支付)
注:一个货运订单可以运送多件货物,每件货物均需要根据重量及费率单独计费
航空公司或货代根据航线、货物类型、市场行情等制定。本次作业费率与货物类型有关,货物类型分为普通货物、危险货
物和加急货物三种
类图如下

Source Monitor分析结果:

分析如下:
- Main类:负责从控制台接收用户输入,创建各个业务相关类的实例,并调用相关方法展示信息。
- Customer类:表示客户信息,包含客户编号、姓名、电话和地址。
- Cargo类:表示货物信息,包含编号、名称、尺寸(宽、长、高)和重量。
- Flight类:表示航班,包含航班号、出发机场、到达机场、起飞时间和最大载重等信息。
- Order类:表示订单,包含订单号、货物列表和订单时间等属性,同时负责计算运费和显示订单详情。
- Calculates 抽象类及其子类(Calculates1、Dangerous、Expedite):Calculates 抽象类定义了运费计算相关的抽象方法,为不同类型货物的运费计算提供了一个抽象父类。其子类分别实现了不同类型货物(普通货物、危险货物、加急货物)的费率计算方法。
- Display 类:负责格式化展示各类信息,包括客户信息、航班信息、订单信息(订单号、订单日期、订单总重量、支付金额、货物明细等)、发件人和收件人信息等。
- People抽象类:作为发件人和收件人的基类,包含姓名、电话和地址等通用信息。
- Recipient类和Sender类:继承自 People 类,分别表示发件人和收件人。
通过Source Monitor分析结果可以看出我的代码存在问题:
-
Most Complex Method:最复杂方法是 Main.main() ,复杂度为 5 ,位于第 5 行 。复杂方法理解、测试和维护难度大。
-
% Percent Lines with Comments(注释行占比):含注释的代码行占比仅 0.4% ,注释过少,严重影响代码可读性和可维护性。
心得:
在单一职责原则方面,在第二次作业中,我将之前Customer等类中的展示方法集中到一个display类中,进一步实现单一职责。在里氏替换方面,基类设计缺陷:People 类未定义抽象方法(如 display()),导致子类(Sender、Recipient)虽重写 display(),但父类无法强制约束行为,违反 LSP,应该将 People 声明为抽象类。在开闭原则方面,设置Calculates 抽象类,在子类中拓展,基本满足。在合成复用方面,过度依赖继承,Sender/Recipient 继承 People:仅复用属性(name、phonenum、address),但行为(display())完全由子类实现,应该通过组合实现。较上一次来说,有了许多改进的地方,可实现功能,但部分地方应该再进行一些优化,使其更加满足设计原则。
三、采坑心得
1、相较于单部电梯调度程序,这一次航空货运管理系统作业的逻辑非常简单,难点是结合最近学习的继承与多态的内容进行设计,将抽象类,父类,子类等应用当具体题目中,在练习中学会如何运用。
2、关于设计原则方面,在最开始写题目时并未过多注意,但在后面再回过头来修改时发现有非常多不满足之处,费了大功夫才把程序修改好,下一次应该在设计类图时就注意这个问题。
3、还是注释的问题,不写注释会使修改代码变得非常困难,甚至过几天自己写的代码自己都需要花很多时间去理解,应该养成写注释的习惯。
四、改进建议
-
设计原则中Java中有着非常大的作用,单一职责原则可以降低类的复杂度,减少变更引起的连锁反应,提高可维护性。开闭原则可以减少修改旧代码的风险,便于功能扩展。里氏替换原则可以确保继承体系的可靠性,避免程序出错。依赖倒置原则可以降低模块间的耦合度,便于替换实现。合成复用原则可以提高代码复用的灵活性和可维护性。应该时刻注意这个问题,保证代码的规范。
-
学习在写代码的过程中添加注释。在以后的学习与工作中,我们不仅要自己写代码,还要与别的同学,同事分工完成工作,如果没有注释的引导,理解起来将困难重重,注释可以帮助理解代码逻辑,促进团队协作提高可读性。
五、总结
经过这一次航空货运管理系统作业,我学会了Java中的继承与多态,了解了Java中的设计原则。如何通过extends关键字让子类合理继承父类的属性和方法,如何利用@Override注解重写方法以实现多态。每一个语法细节的正确运用,都让我对 Java 的严谨性有了更直观的感受。它不仅让我掌握了 Java 的基础知识和编程技巧,更培养了我的逻辑思维、问题解决能力和创新思维。在未来的学习和工作中,我会继续坚持学习Java,不断挑战自己,用代码创造更多的可能。

浙公网安备 33010602011771号