航空货运管理

一、前言
在两次的题目集中,我们看到了继承和多态的应用。这些原则是构建灵活、可扩展系统的关键。通过实现继承,我们可以创建通用的类和接口,并通过多态实现不同类对象的统一处理。这两次的题目集相比上一次的更简单一点。主要使用继承和多态、接口。
题目集08涉及继承与多态的实现,以及程序功能的扩展设计。
7-1 NCHU_点线面问题重构(继承与多态)
在“点与线(类设计)”题目基础上,对题目的类设计进行重构,以实现继承与多态的技术性需求。对题目中的点Point类和线Line类进行进一步抽象,定义一个两个类的共同父类Element(抽象类),将display()方法在该方法中进行声明(抽象方法),将Point类和Line类作为该类的子类。
再定义一个Element类的子类面Plane,该类只有一个私有属性颜色color,除了构造方法和属性的getter、setter方法外,display()方法用于输出面的颜色,输出格式如下:The Plane's color is:颜色
在实现过程中,我首先定义了抽象类 Element。抽象类是一种特殊的类,它不能被实例化,但可以为子类提供一个通用的接口和部分实现。通过将 display() 方法声明为抽象方法,我确保了所有继承自 Element 的子类都必须实现这个方法。这种设计方式不仅提高了代码的可维护性,还为后续的功能扩展提供了极大的便利。
在主方法内,定义两个Point(线段的起点和终点)对象、一个Line对象和一个Plane对象,依次从键盘输入两个Point对象的起点、终点坐标和颜色值(Line对象和Plane对象颜色相同),然后定义一个Element类的引用,分别使用该引用调用以上四个对象的display()方法,从而实现多态特性。

抽象类与抽象方法:
定义了一个抽象类Element,并在其中声明了抽象方法display()。
Point、Line和Plane类继承自Element类,并实现了display()方法。

7-2 NCHU_雨刷程序功能扩展设计
在给定的汽车手动风挡玻璃雨刷程序的基础上,对程序进行重构(Refactoring),使得程序可以对功能进行扩展。
此题要实现两种不同的雨刷系统,我只得到了部分分数,对于控制杆一直降档的情况,不知道要怎么处理。没有使用接口避免代码复用。

7-3 NCHU_航空货运管理系统(类设计)
使用了 ArrayList 来存储货物列表(cargoList),动态管理多个货物对象。
这题的输入较多,很容易就看错了。这个问题让我深刻认识到接口在面向对象编程中的重要性。接口是一种特殊的抽象类,它只包含方法的声明,而不包含具体的实现。通过接口,可以定义一组行为规范,让不同的类实现这些规范,从而实现代码的复用和解耦。如果我在实现雨刷程序时能够合理地使用接口,就可以更清晰地定义不同雨刷系统的行为,并通过接口的多态特性来实现功能的扩展。

题目集09:
7-1 NCHU_魔方问题
问题描述:本问题中的魔方有两种,一种是正方体魔方,一种是正三棱锥魔方,其中,正方体或正三棱锥魔方是由单元正方体或正三棱锥组成,单元正方体或正三棱锥的个数由阶数(即层数)决定,即魔方边长=阶数*单元边长。
利用“立体图形”问题源码,实现如下功能:
魔方有三个属性:颜色,阶数,类型(正方体魔方、正三棱锥魔方),程序要求输出魔方的颜色、表面积和体积。

定义了抽象类 RubikCube 和 Solid,并在子类中实现抽象方法。
SquareCube 和 RegularPyramidCube 继承自 RubikCube,Cube 和 RegularPyramid 继承自 Solid。
通过继承实现代码复用,减少重复代码。
通过抽象类 RubikCube 的引用调用子类的方法。
这题由于我不熟悉三棱锥的体积计算公式白白耗了好久。

7-2 NCHU_点线面问题再重构(容器类)
在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。
在原有类设计的基础上,增加一个GeometryObject容器类,其属性为ArrayList类型的对象(若不了解泛型,可以不使用
增加该类的add()方法及remove(int index)方法,其功能分别为向容器中增加对象及删除第index - 1(ArrayList中index>=0)个对象
在主方法中,用户循环输入要进行的操作(choice∈[0,4]),其含义如下:
1:向容器中增加Point对象
2:向容器中增加Line对象
3:向容器中增加Plane对象
4:删除容器中第index - 1个数据,若index数据非法,则无视此操作
0:输入结束

定义了抽象类 Element,并在子类中实现抽象方法。
Point、Line 和 Plane 类继承自 Element 类,实现了 display() 方法。
在主程序中,通过 GeometryObject 容器管理不同类型的对象,并调用它们的 display() 方法

7-3 NCHU_航空货运管理系统(继承与多态)
在前面的基础上,对客户、支付方式以及货物类型进行泛化处理(继承),通过抽象类和接口减少代码重复,提高代码的可维护性。Element 抽象类定义了 display() 方法,Point、Line 和 Plane 类继承自 Element 类并实现 display() 方法。

二、设计与分析
题目集8的源码实现了一个基础的航空货运管理系统,涵盖了客户、货物、航班和订单的基本管理功能。

系统被分解为多个类(Cargo、Flight、Customer、Order等),每个类负责一部分功能,便于管理和扩展。但是不同货物类型的计费逻辑有重复代码。

Cargo 类是一个抽象类,定义了货物的基本属性和方法。
VolumeWeight() 方法计算货物的体积重量。
getfinalWeight() 方法返回货物的计费重量,取体积重量和毛重中的最大值。
getType() 是一个抽象方法,需要在子类中实现。

题目集9在题目集8的基础上进行了功能扩展和优化。增加了更多的业务逻辑,如支付方式、折扣计算等,使系统更贴近实际需求。增加了客户类型折扣策略和货物类型计费规则,使系统功能更加完善。通过引入新的类和方法,减少了代码重复,提高了代码的可读性和可维护性。代码实现了一个基本的航空货运管理系统,涵盖了客户、货物、航班和订单等核心概念。通过面向对象的方法,代码实现了良好的封装和一定的扩展性。

相比于题目集08,平均和最大复杂度都有所降低,这可能意味着代码的逻辑更简单

Order 类管理订单的详细信息,包括客户、货物列表、航班、订单号和日期。
addCargo() 方法用于添加货物到订单中。
TotalWeight() 和 TotalFee() 方法分别计算订单的总重量和总费用。

三、踩坑心得
在过程中,我遇到了一些挑战和问题。以下是我在源码提交过程中出现的问题、相应的解决策略以及心得体会。
1、类设计初期不够合理
在类设计初期,我没有充分考虑继承和多态的需求,导致后期功能扩展困难。例如,在“点与线”问题的初始设计中,我没有定义一个共同的抽象父类 Element,而是直接定义了 Point 和 Line 两个类。这使得在后续实现多态时,需要对代码进行大量重构。
解决策略:在类设计初期,应该充分考虑系统的扩展性和可维护性。通过定义抽象类和接口,可以为系统提供一个清晰的架构,并为后续的功能扩展提供便利。
心得体会:合理的类设计对于系统的扩展性和维护性至关重要。通过使用抽象类和继承,我们可以更容易地扩展系统功能,同时保持代码的清晰和组织性。
2、代码重复率高
在处理不同类型的货物时,计费逻辑重复,增加了代码的维护成本。引入了 Calculator 类来封装计费逻辑,并通过多态调用不同的计费方法。这样,不同类型的货物可以重用相同的计费逻辑,同时允许各自的特殊处理。像题目集09的航空货运,一开始没有对客户、支付方式以及货物类型进行泛化处理,导致写起来十分困难,反反复复对比了好多输入还是过不去测试点。消除代码重复是提高代码质量的重要步骤。通过封装公共逻辑到独立的类或方法中,我们可以使代码更加模块化,易于测试和维护。
3、多态实现问题
在实现多态时,由于对面向对象编程的理解不够深入,导致多态行为没有按预期工作,确保 Element 抽象类中的 display() 方法被正确实现在所有子类中。同时,确保在主程序中使用 Element 类型的引用来调用实际子对象的 display() 方法。正确实现多态的关键在于理解并实现接口或抽象类中定义的方法。
4、测试覆盖不足
最初的测试覆盖率不足,导致一些边界情况和异常情况没有得到充分的测试。

四、改进建议
在开发航空货运管理系统的过程中,我们识别了一些关键的改进领域,这些改进将有助于提高系统的效率、可维护性和用户体验。以下是具体的改进建议:
引入接口
改进点:
通过定义接口封装特定行为,如支付处理或货物计算,可以提高代码的灵活性和可测试性。
接口使得替换或修改特定功能的实现变得更加容易,而不影响系统的其他部分。
实施策略:
定义一个 ICalculateFee 接口,包含一个 calculateFee() 方法,用于计算费用。
创建 NormalFeeCalculator 和 ExpediteFeeCalculator 类实现此接口,分别用于不同类型的货物。
在 Order 类中,使用 ICalculateFee 接口类型的引用来调用具体的计费逻辑。
统一处理不同类型的对象
建议:
使用多态性是面向对象编程的强大特性之一。通过使用 Element 类型的引用来统一处理不同类型的对象,我们可以在不修改现有代码的情况下,轻松地添加或修改对象的处理方式。
实施:
确保 Element 抽象类中的 display() 方法在所有子类(如 Point、Line 和 Plane)中得到正确实现。
在显示方法中,使用 Element 类型的引用来调用实际子对象的 display() 方法,从而实现多态。
增加注释
建议:
代码注释是提高代码可读性和可维护性的关键。良好的注释可以帮助其他开发者(或未来的你)快速理解代码的意图和逻辑。
实施:
在每个类和方法前添加详细的注释,说明其目的和行为。
对于复杂的逻辑或算法,添加内联注释,解释每个步骤的作用。
建议:
代码注释是提高代码可读性和可维护性的关键。良好的注释可以帮助其他开发者(或未来的你)快速理解代码的意图和逻辑。
实施:
在每个类和方法前添加详细的注释,说明其目的和行为。
对于复杂的逻辑或算法,添加内联注释,解释每个步骤的作用。

五、总结
经过这两次题目集的学习和实践,我对面向对象编程有了更深刻的理解,学到了很多宝贵的知识和技能,对面向对象编程的理解更加深入了。我学会了如何定义类,创建对象,并且掌握了如何利用继承和多态来构建一个灵活且可扩展的系统。尤其是在继承、多态和抽象类的应用上。我学会了如何设计类,如何让它们之间相互协作,还学会了如何让代码更加模块化,易于管理和扩展。我也意识到了代码注释和文档的重要性,它们对于长期维护和团队协作来说,是非常关键的。
我学会了如何设计一个合理的类结构,这包括如何使用抽象类来定义通用的行为,以及如何通过继承来扩展这些行为。我也学会了如何使用接口来定义一组行为,然后让不同的类来实现这些接口,这让我对多态有了更实际的理解。此外,我还学到了代码的组织和重构的重要性。我认识到了如何编写清晰、模块化的代码,这对于长期的项目维护和团队协作至关重要。在实践中,我也意识到了注释和文档的重要性。我学会了如何编写有用的注释来解释代码的意图和逻辑。
在实践过程中,我遇到了许多技术难题,例如在“点与线”问题中对多态的实现,以及在“魔方问题”中对三棱锥体积计算公式的不熟悉。
然而,我意识到我需要进一步学习和研究的领域还有很多例如,对于接口的使用,我还并不熟练,尤其是在复杂的系统设计中,如何合理地定义和使用接口仍然是一个需要深入学习的课题。此外,我还希望提高我的代码调优和测试技能。在实际开发中,代码的性能和稳定性是至关重要的。通过学习代码调优技巧,我希望能够编写出更加高效、可靠的代码。
这次学习经历不仅让我在技术上有了很大的提升,面向对象编程是一个不断学习和实践的过程。通过不断地实践和总结,我相信我能够不断提高自己的编程水平,设计出更加优秀的软件系统。
通过这两次题目集的学习和实践,我在面向对象编程的理论与应用方面取得了显著的进步。我不仅学会了如何定义类、创建对象和实现继承与多态,还学会了如何设计合理的类结构,让代码更加模块化、易于管理和扩展。同时,我也意识到了代码注释和文档的重要性,然而,我也意识到自己需要进一步学习和研究的领域还有很多。我相信,通过不断的学习和实践,我的能力会得到提高。

posted @ 2025-05-25 15:15  张仪嘉  阅读(19)  评论(0)    收藏  举报