第二次作业总结
前言:这两次的“航空货运管理系统”作业,相比于上一次的电梯作业更好入手,也更好理解。第一次的航空货运管理系统需要掌握的知识点主要就是类设计以及对“单一职责”,“里氏代换”,“合成复用”,“开闭原则”这四个原则的理解,如果理解到位了并且会很好的运用的话,这个题就是很简单的,因为没有很多的逻辑理解在里面,有的需要计算的地方都是很直接就可以计算出来的,所以唯一的难点就是能否合理运用这四个原则去设计出各个类完成这道题。第二次的航空货运管理系统与第一次相比的话,难度增大了,不仅需要考虑的原则加了“依赖倒转”,还要用到继承与多态,不能只是纯暴力去解题,此外,在支付方式,用户,货物这三个方面进行了扩展,考虑的因素变多了,所以他的题量和难度都是增加了。
设计与分析:针对于第一次的航空货运管理系统,根据题目意思,有客户信息,航班信息,货物信息,订单信息,所以设计出最基本的四个类,客户类,航班类,货物类,订单类。
对于客户类,有姓名,电话,编号,地址四个属性,然后相应的有构造方法和get,set方法。如类图所示:

对于航班类,有航班号,起飞机场,降落机场,最大载重量,航班日期,然后相应的构造方法和get,set方法。如类图所示:

相同的还有货物类,订单类,都是具有基本的属性,然后加上相应的构造方法和get,set方法,这里就不放这两个类图了。
在这道题中,需要计算的是货物的重量(是根据实际重量还是体积重量),货物的总重量,费率,运费,总金额。所以额外设计了一个中间类用于进行过渡的计算。中间类包含了计算货物的重量的方法,计算费率和运费的方法,因为题目中描述费率会根据市场详情而发生变化,所以对费率设计了一个接口,再设计了一个费率类去具体实现这个接口。因为中间类要得到货物的具体的信息,还有根据费率进行计算运费,所以这里的中间类和货物类和费率类存在一个组合关系。这里要注意的是货物的数量不止一个,所以需要一个容器类去存储货物对象,以便在计算总重量和总运费的时候可以根据容器里面的对象进行计算。例如:

最后设计一个类,里面包含展示订单的方法。然后在主方法中输入通过调用这个方法生成报表。
对于第二次的航空货运管理系统在第一次的基础上加上了继承和多态。对于基本类:客户类,航班类,订单类,货物类这四个类,没有发生变化,还和原来保持一致就可以。这里的客户分为了个人用户和集团用户,当客户类型不同时,对应不同的折扣率,所以设计了折扣率的接口,接着设计两个类实现这个接口,分别返回对应的折扣率。货物类分为了加急货物,普通货物,危险货物三种,货物的种类不同对应的费率也不同,所以相应的设计了一个货物的接口,接着设计三个类对应三个不同的货物实现这个接口返回对应的费率。支付方式也分为了三种,所以设计了支付方式的接口,对应的有三个类实现接口。例如其中的一个接口举例:

相应的实现接口的方法:

对于的其他的类都是大差不差的,还需要注意的就是对于中间类在计算重量,运费等的时候要面向接口,而不是单一地进行计算。最后再进行相应的输入和输出报表即可。
踩坑心得:首先是输入这一块,其中有客户的电话号码,一开始是设计为int型,但是在测试的时候发现每次输完电话号码就结束进程了:
如图所示,当时纠结了好久,连输入都还没有结束,怎么就给我停止了。后来发现是11位的电话号码超出了int型的范围了。然后把int型改为String型就解决了这个问题。还有一个就是在输入整型和字符串中间,一开始没有消耗换行符,就会出现下面这种情况:
那这种就更是莫名奇妙了,当时看着一愣一愣的,还没输完又给我停止运行了,后来在整型和字符串之间都加上消耗换行符才得以解决。这两个坑说大不大,说小不小,没注意到就挺要命的。然后终于解决完输入的问题了,可以输入全部的信息了,点击运行,又是报错:
看到这个报错,天塌了,感觉这三个报错都长得差不多,一大串英文挑了几个认识的:Null..什么空的,猜它的意思可能哪里没有值,然后根据它的报错行数一个一个检查,发现在计算总重量的时候根据容器里面的计算全部的值,但是在这个类里面没有写构造方法,就是说ArrayList没有得到具体的值。这下是真理解了“类都要自己写构造方法”这句话了。关于这个就是还有一个类似的,在获取每个货物的具体信息时,没有在循环里面创建新的对象,只在循环外面创建了对象,这就导致了有输出,但是货物信息都是一样的:
最起码这里可以看到明确的结果,尽管是错误的,比较好纠正。因为没有在循环里面创建新的对象,导致只是修改了一个对象的属性,然后多次添加到list里面,但是最终都是指向同一个,所以解决方法就是在循环里面添加创建对象的语句。第二次题有一个需要自己注意的就是在货物报表里面,它的应交运费是没有包含折扣率的,但是如果是这里出问题的话,比较好看出来,算一下就可以知道的。还有一个需要注意的是,在输入单词的时候,不要输错了,万一都是差一个字母,检查起来的话会耗时间,还可能会怀疑人生。最后一个,也是花费了最长时间,它的输出语句里面的冒号通过自己英文符号打上去是错的。关键我提交之后还对了一个测试样例,还有另外两个测试样例一直通过不了,然后自己也测试了很多数据,数据是对的,但就是不通过,Pta有提示行数报错,但是我没有反应过来,看到数据是一样的就没有多想,结果就是无论怎么测试都是对的结果,有了这次经历,以后的题中的输出语句能复制就复制吧,尽量不要自己去输入了,也能省时间。。。
改进建议:对于航空货物管理系统的第一次作业,对代码进行分析,如图所示:

可以看到,第一次的代码几乎没有注释,所以在以后的编写代码过程中,需要适当地添加注释,这样也方便自己在日后的理解。其次,类平均方法数较高,说明可能存在类设计不恰当的地方,例如,没有完全地遵循单一职责。可以改进的地方就是在编写代码的时候可以提取重复逻辑到公共方法,减少代码冗余,此外可以使用继承、接口或组合提高代码复用性。最大代码块深度为3,有些高,可能会影响可读性,可以减少多层嵌套。最后就是代码行数比较大,可能存在多余的代码,可以考虑简化代码。
针对于第二次航空货物管理系统,对代码进行分析,如图所示:

同样存在的问题是代码的注释很少,可以适当地增加类注释,方法注释和相应的逻辑注释。平均每个类包含5.74个方法,可能存在职责面模糊的问题,可以通过接口解耦,使用依赖注入降低类间耦合以及通过职责进行相应的类划分。最大的代码块深度为3,可能存在复杂的逻辑,可以考虑将其单独设计为一个类,也方便理解。方法的平均语句数比较少,逻辑连贯性可以加以改进。
还有额外的需要改进的是命名,命名存在比较大的问题,比如说类名首字母没有大写,标识符也比较难以理解,在以后应该使用规范,易理解的方式进行命名。
总结:通过这两次作业,对多态和继承有了比较深的理解,对ArrayList类中的方法也有了进一步的掌握,尤其是踩过的坑真是刻骨铭心。在做题过程中也去尽量遵循单一,开闭,里氏代换等六大职责,但是真正运用好还是一个很大的问题。在以后的做题过程中,可以时不时地提醒自己是否遵循这几个原则,多加练习,希望以后对这几个原则的掌握是手到擒来。对于实验的建议就是,我感觉在学习通里面的实验指导书里面的内容存在含糊的地方,就是它的具体输出的结果没有一个实际的参考,比如说这次实验的开关门方法,不知道要不要在动物进电器的时候调用这两个方法。然后就是电器有一个秀内部动物的方法,也没有明确地指明要展示。所以我觉得对实验给出一个输出参考会好很多。
浙公网安备 33010602011771号