NCHU_航空货运系统阶段总结

`**前言**`

题目知识点总结

第一个题目集:
第一题:点线面类设计(继承与多态)
面向对象基础
类、对象、继承、多态的概念
抽象类与抽象方法的定义和使用
方法重写
在子类中重写父类的抽象方法
多态实现
通过父类引用指向子类对象实现多态调用
输入输出处理
从键盘读取输入数据
格式化输出(保留两位小数)
第二题:汽车雨刷系统重构
软件设计原则
开闭原则(对扩展开放,对修改关闭)
继承与接口
使用继承实现不同雨刷系统的扩展
状态模式
雨刷档位和速度的状态管理
输入解析
处理多行多类型输入数据
条件判断与逻辑处理
根据不同操作类型执行相应逻辑
第三题:航空快递系统设计
复杂类设计
客户类、货物类、航班类、订单类的设计与关联
数据结构应用
使用集合存储多个货物信息
日期处理
日期格式的解析与验证
业务逻辑实现
重量计算、费用计算、载重检查等
格式化输出
复杂表格形式的输出(保留一位小数)
题目难度分析
第一题:中等偏低
主要考察继承和多态的基本概念
类结构清晰,逻辑简单
输入输出处理较为直接
第二题:中等
需要理解软件设计原则并应用到重构中
状态管理和操作逻辑有一定复杂度
输入处理需要处理多行多类型数据
第三题:中等偏高
类设计复杂度高,需要考虑多个实体之间的关系
业务逻辑复杂,涉及重量计算、费用计算等
格式化输出要求高,需要输出复杂表格
题目题量分析
代码量
第一题:约 100-150 行代码
第二题:约 150-250 行代码
第三题:约 300-500 行代码
时间估计
第一题:30-60 分钟
第二题:60-120 分钟
第三题:120-240 分钟
综合难度
中等偏上
涉及面向对象编程的多个核心概念
需要处理复杂的业务逻辑和输入输出

第二个题目集

题目分析与知识点总结
第一题:魔方类设计(继承与多态)
知识点:
抽象类与接口:定义RubikCube抽象类,声明getSurfaceArea()和getVolume()抽象方法。
继承与多态:SquareCube(正方体魔方)和RegularPyramidCube(正三棱锥魔方)继承自RubikCube,实现具体计算逻辑。
几何计算:
正方体表面积 = 6 * (layer * side)^2,体积 = (layer * side)^3。
正三棱锥表面积 = √3 * (layer * side)^2,体积 = (√3 / 12) * (layer * side)^3(假设单元正三棱锥为正四面体)。
格式化输出:使用String.format("%.2f", data)保留两位小数。
难度:中等。需理解几何公式并正确实现多态调用。
题量:代码量约 80-120 行,需处理输入解析和公式计算。
第二题:几何对象容器(继承与集合操作)
知识点:
容器类设计:GeometryObject类使用ArrayList存储对象,实现add()和remove(int index)方法。
多态遍历:通过遍历容器调用每个对象的display()方法,体现多态性。
输入处理:循环处理用户操作(增、删、遍历),涉及不同类型对象的输入解析(如点坐标、线端点、面颜色)。
异常处理:删除操作时判断索引合法性(索引范围:1 ≤ index ≤ 容器大小)。
难度:中等。需处理不同类型对象的输入逻辑和容器操作的边界条件。
题量:代码量约 150-200 行,需实现复杂的输入分支逻辑。
第三题:航空货运系统(继承与多态改进)
知识点:
类层次结构:
客户类Customer(抽象类),子类IndividualCustomer(个人)和CorporateCustomer(企业)。
货物类Cargo(抽象类),子类NormalCargo(普通)、ExpediteCargo(加急)、DangerousCargo(危险品),不同类型货物计费费率不同(如加急货费率更高)。
多态计费:根据货物类型动态计算运费(getRate()方法多态实现)。
业务逻辑:
订单总重量计算:累加所有货物重量。
航班载重检查:若订单重量 > 航班剩余载重,终止程序。
支付方式处理:根据输入类型(Wechat/ALiPay/Cash)输出对应中文。
数据关联:订单关联客户、货物、航班信息,需正确传递参数。
难度:高等。涉及复杂类设计、多态计费逻辑和多层数据校验。
题量:代码量约 300-500 行,需设计多个类并处理大量输入输出逻辑。
各题难点与实现建议
第一题:魔方计算
难点:正三棱锥表面积和体积公式的推导(假设单元为正四面体)。
建议:
定义Cube和RegularPyramid辅助类计算单元几何体属性。
在SquareCube和RegularPyramidCube中调用辅助类计算整体属性。
第二题:容器操作
难点:不同操作类型的输入解析(如线对象需输入 4 个坐标值和颜色)。
建议:
使用Scanner的next()和nextDouble()方法按顺序读取输入。
在add()方法中根据操作类型创建对应的子类对象(Point/Line/Plane)。
第三题:货运系统多态设计
难点:
客户类型和货物类型的多态区分(通过子类实现)。
不同货物类型的计费逻辑(如危险品有额外费率)。

`**设计与分析**`

航空货运管理系统(类设计)
提交结果:答案正确
源码类图:

代码分析如下(SourceMonitor):
一、文件结构分析
文件名 类数 代码行数(LOC) 注释行数 空白行数
Main.java 6 385 28 45
二、类复杂度分析
(基于 Cyclomatic Complexity 圈复杂度,衡量逻辑复杂度)
类名 方法数 平均复杂度 最大复杂度 总复杂度
Customer 9 1.0 1.0 9
Cargo 9 1.5 2.0 13
Flight 9 1.0 1.0 9
Order 9 1.0 1.0 9
Agent 6 3.0 5.0 18
Main 1 5.0 5.0 5
说明:
Agent 类复杂度较高(getRate()、getFinalWeight() 等方法包含多层条件判断),建议拆分为独立工具类。
Main 方法复杂度为 5,输入解析逻辑可进一步模块化。
三、命名规范检查
问题类型 实例 建议改进
长变量名 cargoWidths、cargoLengths 缩写为 widths、lengths
匈牙利命名 customerNum(前缀冗余) 改为 phoneNumber
方法名歧义 getRate()(未体现货物类型) 改为 getCargoRate()
缺少前缀 flightCode(类属性未加 m_ 或 this.) 统一添加 this. 前缀
四、代码重复率分析
重复代码片段 出现次数 总行数 建议处理方式
Getter/Setter 方法模板 4 类 36 使用 Lombok 注解简化
输入解析逻辑(scanner.nextLine()) 多次 15 封装为 InputUtil 工具方法
五、总结
优点:类结构清晰,数据封装完整,业务逻辑覆盖全面。
改进优先级:
降低 Agent 类复杂度,拆分计算逻辑。
统一命名规范,减少代码重复。
增强输入校验和异常处理。
航空货运管理系统(继承与多态)
提交结果:答案正确

源码类图:

代码分析如下(SourceMonitor):
一、文件与类结构
文件名 类数 代码行数(LOC) 注释占比 可维护性指数
Main.java 9 580 5.2% 68/100
说明:
代码行数适中,但注释占比偏低,关键逻辑需补充说明。
可维护性指数基于复杂度、重复率等计算,70 分以上为良好,当前接近临界值。
二、类复杂度分析
(基于 Cyclomatic Complexity 圈复杂度,行业阈值:单个方法 ≤ 15)
类名 方法数 平均复杂度 最大复杂度 总复杂度 复杂度热点方法
Agent 6 5.3 9 32 getRate()
Main 1 8.0 8 8 main()
Cargo 9 2.0 3 18 addCargo()
Customer 9 1.0 1 9 所有 Getter/Setter 方法
PayType 4 1.0 1 4 构造方法
风险点:
Agent.getRate() 方法复杂度达 9,包含多层嵌套条件判断,建议拆分为独立策略类。
Main.main() 方法复杂度 8,输入解析逻辑可模块化,避免 “上帝方法”。
三、命名规范与设计问题
问题类型 实例 影响等级 改进建议
长方法 Agent.getRate()(87 行) 高 拆分为 CargoRateCalculator 类
冗余前缀 cargoWidths、cargoLengths 中 改为 widths、lengths
魔术值 费率硬编码(如 35.0、80.0) 高 定义 CargoRateConstants 类
缺少泛型 List cargoCodes 未使用泛型 低 添加 泛型声明
构造方法参数冗余 IndividualCustomer 与 CorporateCustomer 构造参数与父类完全重复 中 使用工厂模式统一创建
四、代码重复率分析
重复模式 出现次数 重复行数 解决方案
Getter/Setter 模板 4 类 36 使用 Lombok @Data 注解
输入解析逻辑 多次 22 封装 InputParser 工具类
条件判断结构 getRate() 中重复的 cargo.getType() 判断 9 次 使用策略模式或枚举
五、总结
优势:类层次结构清晰,多态应用合理,覆盖核心业务逻辑。
改进优先级:
重构高复杂度方法 Agent.getRate(),引入策略模式。
统一命名规范,减少冗余代码。
增强输入验证和异常处理,提升鲁棒性。

`**采坑心得**`

第一个题目集第一题
由于我是直接在PTA平台上写的代码,这导致经常有小错误导致编译无发通过,所以我写下来就要慢慢修改:

直到编译通过后发现我的错误处理没有写好,经过相应添加后提交答案正确。至于踩坑倒是没有,就是没用养成错误分析的习惯。
第一个题目集第二题
这一题一直是操纵杆相关测试点出问题,经过不对读题才发现和之前写过的雨刷程序的操纵杆的档位不一样,一开始我只是以为刻度盘不一样。经过修改后答案正确。

第一个题目集第三题
这一题由于前面吃了PTA不能自动编译给你“挑错”的亏,并且经过分析意识到代码量很大,我选择了用IEDA去编写代码。由于不像前面两题给出了类图,我自己分析题目提取出五个类并且确定相应的依赖关系,并且学习之前的老师给出的代码中的中间类(agent类)来减少两个类之间的耦合。

接下来就是写代码的过程,经过不断修改编译问题,拓展业务方法最终提交答案正确。这一题有两个坑,其一是总总量也是要用两个重量中较大的一个累加出来的,其二是输出格式问题,不过知道/t是那个箭头就不是什么坑了。
第二个题目集第一题
这一题唯一值得提的就是数学计算问题,如正三棱锥的体积公式,面积公式。知道(Math.sqrt(2) / 12) * side * side * side以及4 * (Math.sqrt(3) / 4) * side * side也就没什么问题了。
第二个题目集第二题
这一题其实我第一次写就想用List容器,现在要求使用List容器反而迎合了我的想法,要注意的就是用了容器就得注意容器的容量,也就是在调用的时候别出现空指针问题,奇怪的是我写完代码后提交有一个测试点始终过不去,于是我打算先回去把冗余的代码删去,结果一提交答案正确。要说坑确实也没什么坑,自己有别越界的意识就行。
第二个题目集第三题
与上一个航空货运系统相比要求继承与多态,于是自己构建类图将Cargo类(货物)衍生出三个子类(NormalCargo, ExpediteCargo, DangerousCargo),客户衍生出两个子类(IndividualCustomer,CorporateCustomer)以及构建新的类支付方式类(PayType)和三个子类(WechatPay, ALiPay, CashPay)

完成好类图后进行代码实现,提交后答案正确。坑的话就是记得每一种货物的rate计算要一一对应,我写的过程就是将ExpediteCargo和 DangerousCargo的Rate写反了导致我多花了一些时间。

`**改进建议**`

航空货运管理系统(类设计)

  1. 将货物计费逻辑(getRate())封装为独立策略类,通过多态实现不同类型货物的费率计算。
  2. 对 Scanner 输入对象进行单例管理,避免重复创建。
  3. 将 Agent 类中的计算逻辑(如 getFinalWeight())拆分为 CargoCalculator 工具类。
  4. 将输入解析逻辑从 Main 方法中剥离,封装为 OrderParser 类。
  5. 添加 IllegalInputException 自定义异常,处理非法输入(如负数重量、无效日期)。
  6. 使用 try-with-resources 确保 Scanner 正确关闭。
  7. 为复杂方法(如 getFinalWeight())添加 Javadoc 注释,说明算法逻辑。
  8. 为关键业务规则(如体积重量计算规则)添加注释。

航空货运管理系统(继承与多态)

  1. 将 Agent.getRate() 中的费率逻辑重构为 CargoRateStrategy 接口及其实现类
  2. 通过 CustomerFactory、CargoFactory 创建具体类型对象,避免主方法中的 if-else 膨胀。
  3. 对 Scanner 实例进行单例管理,避免重复创建。
  4. 为 CustomerType、CargoType、PayType 定义枚举类
  5. 将输入解析逻辑封装为独立方法或类,如 FlightInputParser.parseFlight(),减少 main 方法复杂度。
`**总结**`

所学知识点总结

  1. 面向对象编程核心(继承、多态、抽象类)
    继承与代码复用:
    通过父类(如Element、Customer)封装公共属性和方法,子类(Point/Line、IndividualCustomer)继承并扩展特有功能,减少代码冗余。
    案例:在 “点线面” 题目中,Element抽象类定义display()抽象方法,Point/Line/Plane子类重写实现差异化输出。
    多态的应用:
    父类引用指向子类对象,通过统一接口调用不同实现(如Element引用调用Point/Line的display()),体现 “接口统一,实现各异” 的设计思想。
    案例:航空货运系统中,Cargo基类与NormalCargo/ExpediteCargo子类通过多态实现不同货物的费率计算。
    抽象类与接口的区别:
    抽象类包含抽象方法和具体实现,接口仅定义规范。
  2. 类设计与业务建模
    复杂类结构设计:
    从业务需求中抽象实体类(客户、货物、航班、订单),定义属性和行为,建立类间关联(如Agent类组合Customer/Cargo/Flight/Order对象)。
    挑战:航空货运系统需处理多层数据输入(客户→货物→航班→订单),确保数据一致性。
    容器类与集合操作:
    使用ArrayList存储对象(如GeometryObject容器存储Element子类对象),实现增、删、遍历操作,提升数据管理灵活性。
    案例:通过add()方法向容器添加Point/Line/Plane对象,通过遍历调用display()实现多态输出。
  3. 输入输出处理与格式化
    输入解析技巧:
    处理多行输入、不同数据类型(如魔方题中color/layer/side的顺序输入),使用Scanner的next()/nextDouble()等方法按顺序读取,避免缓冲区残留问题。
    注意点:在 “雨刷系统” 题目中,需处理以0结束的多行操作指令,需循环读取直到遇到终止符。
    格式化输出:
    使用String.format("%.2f", data)保留指定小数位,通过制表符\t或空格对齐表格字段(如货物明细报表),提升输出可读性。
    案例:魔方表面积和体积、航空货运费用均需按格式保留小数。
  4. 业务逻辑与算法实现
    几何计算:
    魔方表面积和体积的数学公式推导(如正三棱锥体积公式(√3 / 12) * (layer * side)^3),需结合几何知识正确实现。
    费率计算与条件判断:
    航空货运系统中,根据货物类型(普通 / 加急 / 危险品)和重量区间计算阶梯费率,需处理多层if-else逻辑,可通过策略模式优化。
    改进方向:将费率逻辑封装为独立策略类,避免Agent.getRate()方法的高复杂度。
  5. 代码质量与可维护性
    设计模式的应用:
    通过工厂模式创建对象(如CustomerFactory生成IndividualCustomer/CorporateCustomer),减少主方法中的if-else分支;使用策略模式解耦费率计算逻辑。
    案例:支付方式类(PayType及其子类)可通过工厂模式简化对象创建。
    代码重构:
    拆分高复杂度方法(如Agent.getRate()),提取工具类(如CargoCalculator计算计费重量和费率),提升代码可维护性。
    原则:遵循 “单一职责原则”,每个类 / 方法只负责单一功能。
    二、能力提升与需进一步学习的方向
  6. 已提升的能力
    面向对象设计思维:
    从需求中抽象类层次,合理运用继承、多态解决实际问题,避免面向过程的编码习惯。
    复杂业务建模能力:
    处理多层级数据关联(如航空货运中的客户→货物→航班→订单关系),学会分步设计类属性和方法。
    调试与异常处理:
    通过处理输入非法值(如负数重量、无效索引)和边界条件(如容器删除操作时的索引越界),提升代码鲁棒性。
  7. 需进一步学习的内容
    设计模式深入应用:
    学习状态模式(如汽车雨刷系统的档位状态管理)、单例模式(如全局输入工具类)。
    理解观察者模式、装饰器模式在实际场景中的应用(如订单状态变更通知)。
    泛型与集合优化:
    掌握泛型类和泛型方法(如ArrayList),避免类型转换异常,提升代码类型安全性。
    学习HashMap/HashSet等集合类的特性,优化数据查询效率(如通过客户编号快速查询客户信息)。
    异常处理机制:
    自定义异常类(如InvalidInputException、OverloadException),规范异常抛出和捕获流程,增强程序容错性。
    使用try-with-resources自动关闭Scanner等资源,避免资源泄漏。
    三、总结与建议
  8. 学习建议
    通过完整项目(如航空货运系统)综合运用面向对象知识,从需求分析→类设计→代码实现→测试优化全流程练习。
    通过他人视角发现代码问题(如复杂度高、命名不规范),学习优化方法。
  9. 知识扩展方向
    应当多学习各种各样的设计模式以及异常处理机制,泛型等。
posted @ 2025-05-20 21:17  JulyLifeTime  阅读(27)  评论(0)    收藏  举报