面向对象课程第二阶段作业总结

面向对象课程第二阶段作业总结
目录
1.前言
2.设计与分析
3.踩坑心得
4.改进建议
5.总结
正文
1.前言
多态和继承是面向对象最重要的表现方式,甚至可以说没有之一,他彻底的将封装的意义具象化,将抽象的思想实例化,继承的对框架以大众的抽象程度进行设计,及保证了其抽象的专业性又大大降低了上手难度,是十分智慧的结构,同时他的出现也相应的带来了结构继续发展,大大的提高了面向对象编程的扩展性,再说多态其实不然就是继承结构的继续发展进化而来,将其抽象性进一步加强让使用者可以更加便利的进行复用。
2.1设计与分析
一.pta8:
7-1:本题要求用继承和多态的架构对点线面问题重构,相对简单,是对继承的第一次例题使用按照规范进行书写即可。同时也学会了强转String.format("%.2f", data)方法的使用。

7-2:本题目在练习继承与多态的同时,也是对关联关系的复习,同时要求考虑的情况变多,所以题目难度提升,记下来我们大体分析一边当作复习。

第一:在原代码的基础下我们要加入第二套系统,所以我们将第二代码当作第一套代码的继承来进行修改。
第二:输入端大量输入了单数字,所以需要用list来存储,同时用list.hasNextInt()做结尾判定。输入后在对象内部进行排序,再用foreach打印即可。
第三:内部排序的关系十分复杂,相互关联所以这里我们运用到聚合关系,不同的数值类聚合在一个专门的排序类当中,随后再在排序类里面进行创建对象。随后便可以直接使用对象里面的set和get函数实现对数值有调理的改查,并且十分清晰。

7-3:航空管理系统,该题目难度再次大幅度上升,他的难点在于老师并没有将类图关系图告知在题目,需要同学们自行组织架构,同时他的类与类的关系又及其多且杂,没有长连续性,当然这点十分符合现实工作中我们会遇到的工程问题。所以我将详细分析这道题。
第一:理清关系,构思好类图,在不清楚的情况下,我们优先按日常习惯将信息分为各个最小的模块。再观察其中关系.
第二:首先保证单一职责原则的实现,单一职责的要求就是每一个类只负责一个特定的职责。所以将上一步的步骤再调整可得到Date 类:只负责日期的存储和格式化输出。Customer 类:只负责存储和管理客户信息。Goods类:只负责存储货物信息并计算计费重量、费率和运费。Plane 类:只负责存储航班信息。 Order 类:只负责存储订单信息。 Shipment 类:只负责管理航班和货物列表,以及计算总重量和总运费。ReportGenerator 类:只负责生成订单信息报表和货物明细报表。
示例:

第三:实现开闭原则,开闭原则的基础是对扩展开放,对修改封闭。看似拗口,其实不难理解,就是设计一个开口,当你需要开口时直接做个开口而不是完全弄清内部结构,这样大大方便了使用的方便,就像屏幕坏了。直接换屏幕即可,不需要把整个手机研究明白,也不需要把屏幕研究明白,只需要把新屏幕的电线给接上即可。就像如果需要增加新的计费规则,可以修改 Goods 类中的 getRate 方法,而无需修改其他类。同时也将数据进行了开闭,只能通过get数据名得到,外部也要通过set来设置,所以这样不仅解决了类与类之间传输的麻烦,也避免了因为命名复杂,命名多而造成程序冗杂无章,十分那穿越理解,不利于后续修改。
下面既是开闭的示例:

第四:实现合成复用原则,合成复用原则要求尽量使用组合而不是继承来复用代码。在代码中, Shipment 类通过组合 Plane 类和 Goods 列表来实现其功能,而不是通过继承。体现:• Shipment 类包含一个 Plane 对象和一个 Goods 列表,通过组合这些对象来实现运输功能。• 如果未来需要增加新的功能(如支持多航班运输),可以通过修改 Shipment 类的组合方式来实现,而无需修改 Plane 或 Goods 类。本质即为组合思想的强调,组合思想是再继承思想层次之上的。

第五:Main类的书写,在类与类完成书写后,我们需要按关系的在main函数中创建对象,这步是最后一部,其实也是最难的一部,首先分析输入案例的次序,首先我们要书写custom类,按照输入的类型在custom类中设计变量名,同时按照输入的变量类型进行开闭设计,设置set也设置get。随后我们需要设置多个goods类型,这里就需要我们将list类使用起来,list组装goods类型本质上也是一种组合的使用。List类的功能十分丰富,通过不断的for循环创建的对象不需要单独各个命名,只需要用list.size再用for循环一个一个输出即可,简洁了命名的麻烦。随后又是正则表达式的复习,从用户输入中读取航班日期(格式为 YYYY-MM-DD ),并使用正则表达式验证日期格式是否正确。如果格式正确,将日期拆分为年、月、日,并设置到 Date1 对象中,然后将该日期对象设置到航班对象中。其中Pattern.matches的使用是经常漏写的一点。最后打印出答案即可。
示例:用main来填写设计class

第六:回头分析
首先:本次题目在最开始类与类之间的链接错误,导致输入的数老是非零返回,此外按照输入先写输入请求在创建类内部的具体变量名是本次实验最大的收获。这样不仅大大减少了因为输入与类变量不匹配而产生的大量问题,同时也解决了因为类中大量无用代码的冗杂而浪费的时间和浪费的精力。
其次:类内部的的传递只需直接使用变量名即可,不需要再通过复杂的转化,同时类中的方法名可以直接调用也不需要单独说明,使用思想上和C语言类似。此外这次题目几大难错误的主要原因即使没有将rate的分界点清晰的划分出来,导致运算出现错。

类图如下:

数据结构图如下:

二:pta9:
7-1:魔方问题:
该题目已经将类图画出,但实际上具有一定挑战性,首先观察类图:

不难看出改题目本质上是一个双继承。由soild统一抽象所有的图形再由魔法抽象继承为魔方抽象类,最后将不同的魔方继承不同的类,具体作用如下:
Solid(抽象类)
定义所有立体图形的基础属性 side(边长)。
提供构造方法、getSide()、setSide() 方法操作边长。
声明抽象方法 getArea() 和 getVolume(),强制子类实现具体立体图形的表面积和体积计算。
Cube
继承自 Solid,表示正方体。
实现 getArea() 和 getVolume(),计算正方体的表面积和体积。
RegularPyramid
继承自 Solid,表示正四面体(或类似正棱锥)。
实现 getArea() 和 getVolume(),计算其表面积和体积。
RubikCube(抽象类)
定义魔方的通用属性:color(颜色)、layer(层数)、solid(关联的立体图形)。
提供构造方法、属性的 getter/setter。
声明 getArea() 和 getVolume(),由具体魔方子类实现计算逻辑。
SquareCube
继承自 RubikCube,表示方形魔方(如三阶魔方)。
重写 getArea() 和 getVolume(),基于关联的 Cube 及层数计算方形魔方的表面积和体积。
RegularPyramidCube
继承自 RubikCube,表示金字塔形魔方。
重写 getArea() 和 getVolume(),基于关联的 RegularPyramid 及层数计算表面积和体积。
Main
main 方法:通过 Scanner 输入数据,创建 SquareCube 和 RegularPyramidCube 对象。
display 方法:接收 RubikCube 对象,调用其方法获取颜色、表面积、体积并打印,体现多态性。
其实最终调用时只需要调用左右下角的两个函数即可,但老师的类图实际上更清晰的向我们展示了在工程设计中如何保持代码的长久复用性,如何保证了类结构的延申和扩展。

7-2:点线面问题再重构(容器类)
该题实际上也具有一定难度,主要在于理解容器类 GeometryObject 如何通过泛型或非泛型方式存储不同类型的元素,相对于基础的做法,直接将list放在主函数里直接存储,这样的存储步骤进一步加深了我们对类构造与链接的能力。

所以接下来,我们就重点分析他的容器类

核心功能如下:
使用ArrayList存储几何元素。
元素操作:add(Element element):向列表添加元素。
remove(int index):根据索引删除元素(索引从 1 开始,自动处理越界)。
遍历功能:getlist():遍历所有元素并调用其display()方法(多态实现)。


由上述错误可知的设计注意点:
1.边界检查
remove()方法中对索引合法性进行检查:空列表直接返回。
索引范围[1, list.size()],超出范围自动忽略(符合题目要求)。不然数据会非零返回。
2.排版的规范,不多赘述。

7-3: NCHU_航空货运管理系统(继承与多态)
相比于上一次作业,这一次作业其实相对简单很多。只需要按照计费的不同的要求对goods和customer的类型进行重构即可。
一.分析题目

由题目可知我们主要要对goods类型和custermer进行重构以及加上一个payway类。所以首先我们按照要求将子类全部写出框架

然后我们会发现该题现在最大的难点是在于算法的升级。
分析题目

依据经验我们知道可以直接在goods类型中改掉rate的数据然后再main函数了进行调用。
同时修改main函数保证新类payway的使用以及注意对customer中顾客折扣的调用。
修改后的main函数如下:
调用custmer中的顾客类型:

调用修改后的计费方法:

如此该题完成

类图:

数据结构图:

3.踩坑心得
这次实验的确踩了很多坑,大部分的坑已经写在了前面测试用例的分析当中,但我觉得总结下来,最大的两个问题,一个是读题时思路的细节的把握,还有一个就是提前对不同方法框架的设定的重要性,这是相当重要的,不然就像会像我一样写很多遍,所以当下次遇到问题时,首先想到的应该是,努力的先挂好框架,然后再进行代码写写取。正如老师说的,写代码是最基础的框架设计,才是学习面向对象编程的核心。

4.改进与建议

5.总结
写到这里的时候,虽然只写了3747个字了,但感觉该说的话都已经讲清楚了,我觉得整个pta第二次阶段的过程,应该是对面向对象的设计方法越来越明白,所以才写起来更为顺手了,正如老师说的,普通人和大师之间的距离不是天赋,是不断的练习以及时间,正所谓唯所属耳,只有沉下心来,更多的思考,更多的练习,不断的思考,不断的记忆复盘,才会有更深刻的理解,希望我能坚持下来,在面向对象这门可以在未来大有作为的科目上取得良好成绩,并且为未来的工作打下良好的基础,毕竟软件工程最重要的思维就是汇总和框架思维而而不是只会简单的雷代码,好了,这就是我的第二次总结,谢谢。

posted @ 2025-05-20 10:48  尉普  阅读(22)  评论(0)    收藏  举报