面向对象程序设计作业集1~3的总结性Blog
面向对象程序设计三次作业总结报告
(1)前言
总结三次作业集的知识点、题量、难度等情况
第一次作业是做一个简单的航班配载系统,主要就是往航班里装货物。
主要的知识点是:类的定义,类与类之间的关系,单一职责原则,学会分析类图
难度是4颗星,因为是第一次写,有点懵,写了很久。
第二次作业是加了货舱的概念,货物要先装到货舱里。
主要的知识点是:类的定义,类与类之间的关系,单一职责原则,多个类协作和ArrayList,封装
难度是5颗星,比前一次难一点,开始出现了一些隐藏测试点。
第三次作业加了旅客和重心计算,要判断飞机安不安全。
主要的知识点是:类的定义,类与类之间的关系,单一职责原则,多个类协作和ArrayList,封装,冒泡排序,计算,方法等
难度是满颗星,在本来就复杂的基础上添加了很多隐藏测试点,使得呆瓜的我苦不堪言,到最后都没搞好所有的隐藏测试点。
(2)设计与分析:
第一次作业:在航空业中,航班起飞前需要进行严格的“配载”,即计算飞机的旅客、货物、行李的重量分布,计算出飞机的重心位置,以确保飞行安全。本系列作业将围绕这一真实场景展开。设计一个基础的航班货运配载模块。系统需要记录航班的基本信息(航班号、最大起飞重量、最大业载重量)。地勤人员可以按照货物重量从高到低向该航班添加货物(货物名称、重量)。系统需要实时计算当前已装载的总重量,并判断是否超载。
下图是第一作业的SourceMonitor生成的指标报表截图(first)

从报表中我关注了这几个数据:代码写了142行,设计了5个类,每个类平均方法数是3个,最复杂的方法CargoSorter里的weightsort(),这个方法复杂度是,最大嵌套深度是5层,代码里if和for套了5层。分析之后我觉得大部分代码不是很复杂,逻辑还算清楚,排序那一块采用的选择排序,有点复杂。
下图是作业一题目自身提供的类图

分析可得Flight(航班类):与 LoadManifest 是聚合关系;LoadManifest(配载清单类):与 Cargo 是组合关系;
LoadManifest 还依赖 CargoSorter(虚线箭头)。有由于是第一次作业,几个类的关系还是比较明朗的,而且是由题目提供的,基本就是告诉题目是怎么写的了。
第二次作业:
航班货运配载模块(迭代二)—— 多货舱管理与重量排序装载。设计一个扩展的航班货运配载模块,实现以下功能:航班信息管理,货舱管理,货物装载。等
下图是第二作业的SourceMonitor生成的指标报表截图(second):

数据表现:一共是7个类,最大圈复杂度是4,比第一次小,但最大嵌套深层是5层,最复杂的方法LoadDispatcher.sortCargos()还是用作排序,不过这一次是用冒泡排序。添加了很多的功能,代码数多于上一次。
下图是是根据第二次作业题目条件以及所写代码所得的类图

一共是7个类,它们之间的关系主要有两种
- 组合关系
Flight 包含多个 CargoCompartment
CargoCompartment 包含多个 Cargo
CargoCompartment 包含多个 Position - 依赖关系
Main 依赖 Flight、LoadDispatcher、InputValidator
LoadDispatcher 依赖 Cargo 和 CargoCompartment。
与第一次的相比,稍微复杂了一点,主要是添加了一些功能,同时由于LoadManifest 的删除和一些类的添加使得类类之间的关系发生了变化。
第三次作业:
航空器配载与货运管理系统——配平计算。在航空器配载中,所有装载项(旅客、前舱货物、后舱货物)都有其对应的力臂。重量乘以力臂等于力矩。所有力矩之和除以总重量,即为飞机的实际重心。为了统一标准,实际重心需要换算为占平均空气动力弦(MAC)的百分比。(并没有得到满分,下面根据我的代码分析)
下面是SourceMonitor生成的指标报表截图

第三次作业代码,包含10个类。每个类平均有4.3个方法。代码中最复杂的方法是 Main.main(),圈复杂度为6。由于第三次作业涉及旅客、货物、货舱、重心计算等多个模块,主类需要协调这些模块的工作,所以复杂度比前两次的都要高很多,且由于部分测试点我不清楚使得还有些功能未实现或是实现的有问题。
下面是类图

Flight 与 CargoCompartment、Passenger 是组合关系。
CargoCompartment 与 Cargo、Position 是组合关系。
Passenger 与 Luggage 是组合关系。
Main 依赖其他所有类。
WeightBalanceCalculator 依赖 Flight。
由于老师十分的善良在题目的条件中告诉了很多类的关系,使得分析起来并没有想象中那么复杂,基本上是在第二次作业关系中添加修改的。
(3)采坑心得:
第一次作业:
由于看到了,“提示:在使用Scanner输入的时候,nextLine()方法会接受上一次输入的回车符号,因此,建议大家在nextLine()之前再加一个nextLine()”
在没有思考的情况直接就是使用了,使得非零返回,而后是冒泡排序的编写存在一定问题,最终修改成了选择排序,和调整了一些中文和英文的字符的一些细节最后得到了满分。
第二次作业:
则是过分自信的判断这一次不需要使用nextLine()使得最后的结果非零返回也是和上次相反了起来,修改之后问题就少了很多主要是对题目输出的格式理解存在问题“装载失败:货物[名称 重量:重量值kg] → 装入货舱[货舱ID] 失败 (超载)”最后的原因是不需要输出出来的,这个的发现还是同学告诉的,这也说明我的分析能力不强,有个坑踩一个。
第三次作业:
这一次问题就很大了。写了很久才出来第一版的粗糙代码,但第一版的代码出了很大的问题,比如货物ID,货物重量,行李重量,货舱重量都没有验证,而且验证的部分最输出结果如:System.out.printf("!!! 警告:[%s]剩余容量不足(当前载重%.1f/%.1fkg),请重新分配或减轻重量\n",comp.getId(), comp.getCurrentWeight(), comp.getMaxWeight());等需要程序立刻停止运行的地方没有处理好,最后采取System.exit(0)进行处理这个问题。然后也在格式输出"安全(GREEN)"的那一语句修改正确。关于验证重量这一块也是在每一个量输入的时候就进行调用验证,在调试了很久的时间最终得到了一些分数,但是分数还是很低(40,50得分)。后面就开始重新对所有的类进行分析,对比了上一次作业代码和这一次的增加类,思索了很久觉得position的初始化还是需要(当作一个完善)为了验证一下是否有隐藏的测试点,之后在同学的告诉中得知“System.out.println("输入必须在 1 到 " + m + " 之间!");”这个输入的下限是确定的就是1,但由于我对飞机飞行载物这一块常识了解是十分不足的,根本就是没有想到这一点,感觉老师也是想通过这一点告诉我们写项目还是要去了解一些隐含的需求。不过最终还是没有发掘所有的隐含测试点,这一点还是需要提高的。
(4)改进建议:
1.写第一次代码的时候由于对list使用不熟,且由于第一次的货物数量较为固定,还是可以用数组解决的。不过通过第二次作业的使用list,加深了动态,可自动扩展。所以可以用"List
2.对于这几次的代码都存在部分的类中间的方法过多,显得就很复杂,部分类之间存在耦合较强的问题,对单一职责原则(SRP)还是遵守的不是很好(一些类职责过中),在一些小类中表现还算可以,但是在大类却不行,所以完全可以将大类拆分多写一些合理的类。
3.有些方法还有一些量的名称的时候区分度大一点,而且尽量贴合它的全部作用,反正读的时候呆住,也在调用的时候更方便。并且以后在编译器上面代码的时候,多写一些注释,这样同时增加了代码的可读性,也防止自己检查的时候发生忘记自己当时是怎么想的。这是一个好习惯。
4.一些需要计算的部分要像当时学c语言函数的时候一样,把计算写函数里。就比如再写力臂计算那些的时候,我应该一开始就使用方法,调用方便。同时在第三次代码中我写的Main类确实是十分复杂的,也是可以进行方法拆分,去增加可读性,可测试性,可复用性。是最后我好检查,好发现问题。
当然还是存在一些我目前不是很清楚或者说不知道的改进,不过由于目前能力有限,就先把能做的地方指出来。
(5)总结
一开始还是像当时学c语言一样,只是简单用Java写一写如“helloword”哪一类代码,对什么是面向对象这一块还只是在课上迷迷糊糊地知道类什么,用一个个类去组成最后的代码。再写第一次作业的时候其实也是硬着头皮去我硬着头皮建了好几个类—。但说实话,我只是在模仿,完全不知道为什么要把代码拆成这样,但是通过不断看书和理解课上的例子的时候,也逐渐地明白什么是面向对象,懂得了拆分不是为了麻烦,是为了好找问题。知道为什么要写类,如何写类,最终类类之间的关系。结果也是在一遍遍调试和理解中完成了第一次代码的作业是拿下100分(回头看其实第一次不算很难基本就是清楚类类之间的关系就行了),为之后写第二次和第三次作业的时候心里能有一个大致的框架去写。当然我仍然存在很多的问题,有很多的原则如单一职责原则(SRP),解耦合等其实完成度不高,而且语法上也是存在一些问题。还有一点就是面向对象“行业真相:真实用户的输入不可预知,没有‘公开数据’供你适配。”我也确实是看数据改代码,这使得我有很多的隐藏测试点没有发掘,这确实是我所缺少的。不过我还是希望老师能在作业结束后把隐藏测试点公开一下,还有稍微讲解一下,目前学习面向对象的道路上任重道远。

浙公网安备 33010602011771号