题目集8-9总结 bolg
1 前言
这两次题目集中学习并应用了继承与多态,了解了父类与子类的关系与协作方式,在多次尝试中也体会到继承的方便。列如在第八次题目集中的点线面问题重构中,通过继承令Line类,Point类,PLane类为子类,Element类为父类,在展示自己数据时就可以直接用父类Element的display函数统一展示。此外第九次题目集中的魔方问题,先令solid类组合RubikCube类,再令Cube类和RegularPyramid类继承solid类,我深深地体会到了继承与其他类的关系之间相互灵活协作所带来的方便与高效。题目集中前面的小题目,难度简单,题量较少,基本给出了设计类图,可以更好的学习并使用所学的新知识(继承与多态)。而后面多次迭代的大作业相比与前次简单不少,没有太多的算法考虑,只是简单的存储数据,输出数据。但该题目中也使用到了继承,通过该题目,我不仅知道了继承的具体用法,也知道了继承在编译中的好处,更体会到了java语言的优势。在题目的迭代中题目的大致难度没有太大提升,只是在支付方式上有了多种选择。
2.设计与分析
2.1. 系统概述
该程序模拟一个航空货运管理系统,能够处理用户输入的信息。航空货运管理系统根据输入信息计算金额,并检验是否会超重。
2.2 代码介绍
2.2.1 类结构 类名 功能
第八次题目集 :
Main 程序入口,接收输入并初始化系统
human 表示人类 作为父类存储客户,寄件人,收件人的共同信息。
customer 表示客户 存储客户信息并通过客户类型反馈客户折扣。
flight 表示航班 存储航班信息
goods 表示货物 存储货物信息并根据货物重量反馈货物费率,计算金额。
Isvalid 表示是否超重 读取航班的最大容量与订单的货物重量之和,并比较判断是否超重。
order 表示订单 存储订单信息(包括货物的总重量)。
recipient 表示收件人 存储收件人信息 sender 表示寄件人 存储寄件人信息
第九次题目集 :
Main 程序入口,接收输入并初始化系统
human 表示人类 作为父类存储客户,寄件人,收件人的共同信息。
customer 表示客户 存储客户信息并通过客户类型反馈客户折扣。
flight 表示航班 存储航班信息
goods 表示货物 存储货物信息并根据货物重量和货物类型反馈货物费率,计算金额。
Isvalid 表示是否超重 读取航班的最大容量与订单的货物重量之和,并比较判断是否超重。
order 表示订单 存储订单信息(包括货物的总重量)。
payment 表示支付 在不超重的情况下展示支付金额。
recipient 表示收件人 存储收件人信息 sender 表示寄件人 存储寄件人信息
2.2.2 核心逻辑
本次题目集中大多为简单的输入信息,存储信息,根据题目要求的格式输出信息。除此之外在存储货物信息时,通过比较货物重量与体积重量(体积重量(kg) = 货物体积(长×宽×高,单位:厘米)÷ 6000)选取较高者为计费重量。和根据货物类型与货物重量来决定费率。
3. 代码分析
第八次




(两次代码中只是进行轻微修改,且代码区别不大,下列分析以第九次为实例)
一、代码度量指标
1. 代码行数(Lines):350 行。代码行数是衡量代码规模的一个基本指标,350 行说明该文件具有一定规模,相比一些小型程序来说,功能可能相对丰富,但也意味着在阅读、理解和维护时需要投入更多精力。
2. 语句数量(Statements):262 条。并非所有代码行都包含语句(例如空行、注释行等),语句是执行具体操作的指令单元,其数量反映了代码实际执行操作的多少。这里语句数小于行数,说明代码中存在不少非执行语句的行。
3. 分支语句占比(Percent Branch Statements):11.1% 。分支语句(如 if - else 、 switch 等)用于根据不同条件执行不同逻辑路径。占比11.1% 说明代码中条件判断逻辑相对适中,既不是特别简单(分支语句极少),也没有复杂到难以理清逻辑的程度,但仍需检查这些分支逻辑是否合理、全面。
4. 方法调用语句(Method Call Statements):45 条。方法调用是代码模块化的重要体现,通过调用不同方法实现功能的拆分和复用。45 条方法调用语句表明代码在一定程度上实现了功能模块化,但也需要关注方法之间的调用关系是否清晰,是否存在过度复杂的调用链。
5. 带注释代码行占比(Percent Lines with Comments):0.0% 。在代码开发中,注释用于解释代码的功能、逻辑、参数含义等,帮助开发人员(包括自己在后续回顾代码时)快速理解代码意图。缺乏注释会使代码可读性和可维护性大大降低,后续人员理解和修改代码时会面临较大困难。
6. 类和接口数量(Classes and Interfaces):10 个。这表明代码在结构上进行了一定程度的封装和抽象,通过类和接口来组织不同功能,有助于实现面向对象编程的特性,如封装、继承和多态。但同时也需要关注类与类之间、类与接口之间的关系是否合理,是否存在职责不清晰等问题。
7. 平均每个类的方法数(Methods per Class):4.90 。说明每个类平均承载的功能方法数量相对较多,虽然体现了类的功能丰富性,但也可能存在类的职责不够单一的情况,需要进一步查看每个类的具体实现,判断是否符合单一职责原则(即一个类应该只负责一项职责)。
8. 平均每个方法的语句数(Average Statements per Method):3.65 。意味着方法内部的逻辑相对简洁,短小的方法更易于测试、理解和维护。不过,如果方法过于碎片化,也可能导致代码整体的逻辑连贯性在宏观上变差,需要平衡方法粒度。
9. 最复杂方法的行号(Line Number of Most Complex Method):200 ,方法名(Name of Most Complex Method): goods.getvl() 。该方法所在行号为200 ,说明它在代码文件中处于相对靠后的位置。作为最复杂方法,可能包含大量的条件判断、循环嵌套、复杂算法实现等逻辑,需要重点审查其实现,看是否可以通过重构等方式提高代码可读性和性能。
三、图表分析
1. 雷达图(Kiviat Graph)
- 平均复杂度(Avg Complexity):反映代码整体的复杂程度,结合其他指标可以判断代码是否在可维护和可理解的范围内。如果平均复杂度较高,说明代码整体理解和维护难度较大。
- 平均深度(Avg Depth):可能指代码中方法调用、控制结构嵌套等的平均层次深度。深度越大,意味着代码内部逻辑层次越多,越难理清执行顺序和逻辑关系。
- 最大深度(Max Depth):表示代码中最深的嵌套层次。若最大深度值过大,说明存在深层嵌套结构,例如多层的循环嵌套或者条件语句嵌套,这会使代码可读性和可维护性变差,需要考虑优化。
- 最大复杂度(Max Complexity):标识代码中最复杂部分的复杂度情况,与最复杂方法相关联,可以进一步确定复杂度高的原因,例如是由于大量的条件判断、复杂的数据处理等。
- 注释占比(% Comments):当前为0 ,如前文所述,这对代码的长期维护极为不利,应尽快补充必要的注释。
- 每个类的方法数(Methods/Class) 和 平均每个方法的语句数(Avg Stmts/Method):与前面的指标相互印证,从不同角度帮助了解代码结构和方法特性,评估代码是否符合良好的设计原则。
2. 柱状图(Block Histogram)
横坐标表示深度(depth),纵坐标表示语句数量(statements)。从图中可以看出,深度为1 时语句数量最多,深度为2、3 时也有较多语句。这表明代码中存在一定程度的嵌套结构,尤其是在深度为1 的层次上集中了大量语句。过多的嵌套结构会使代码逻辑难以跟踪和理解,后续可以考虑通过提取方法、调整逻辑结构等方式,减少不必要的嵌套,使代码结构更加清晰明了。
4.踩坑心得
4.1 错误源码
class Goods {
private String goodsname;
private String Id;
private double length;
private double width;
private double height;
private double weight;
public Goods(String goodsname, String Id, double width2, double length2, double height2, double weight2) {
this.goodsname = goodsname;
this.Id = Id;
this.length = width2;
this.width = length2;
this.height = height2;
this.weight = weight2;
}
}
4.2 错误提示
4.3错误原因:
在传入重量数据是只是传入了货物的实际重量,并没有与计算体积重量与实际重量比较以传入真正的费率重量。
4.4心得体会:
在编译程序前一定要做好需求分析,以在后期代码编写时不会出现这种低级错误。
5.改进建议:
代码中的goods类的平均深度太深,可以以goods为父类分出Normalgoods,Expeditegoods,Dangerousgoods子类,
6.总结:
6.1自我总结与感悟:
这两次题目集中我清晰的了解了父类与子类的关联与协作,也通过继承明白了java的优势,在日后的学习中也要根据注重的面向对象编程中的面向对象,以纠正自己的思维逻辑。
6.2题目建议:
这两次题目中的大作业相对简单,可以略微增加一点点的算法要求,以可以在一步步的思考中提升自我。
浙公网安备 33010602011771号