第一次bloge作业
本阶段三次作业围绕“航班配载系统”逐步深入,从单一货舱的简单装载,到多货舱协同、货物按重量排序分配,最后引入旅客重量与重心平衡计算。整体知识点覆盖:面向对象基础(类、封装、集合)、排序算法(选择排序/冒泡排序)、输入校验、重量与力矩计算。
1.三次作业代码量递增。作业1约150行,作业2约250行,作业3约400行,但核心逻辑清晰,逐步迭代。
2.作业1入门级,作业2增加货舱管理和重量排序,作业3引入物理计算(重心、力矩)和复杂输出格式,难度适中。
3.三次作业均要求自行设计类结构,并处理边界情况(超载、负数输入、货舱容量不足等),培养了模块化编程思维。
3次类图如图所示
作业1奠定了基本类结构,但Flight.sort()直接修改原列表,破坏封装;且无输入校验,负数重量会导致错误结果。
作业2 addCargo仅在未超载时添加,但失败后没有重试机制(其他货舱),不符合实际配载需求
作业3力臂值直接写在方法内,若货舱数量或位置变化,需修改源码,可读性差。应作
作业2:货物找不到目标货舱
问题:flight.findCompartmentById返回null时,后续调用comp.addCargo会引发NullPointerException。题目样例中保证所有targetCompId都存在,但防御性编程缺失。
作业3:重量与力矩的单位一致性
问题:旅客体重常量BODY_WEIGHT = 75.0(kg),行李重量由输入给出,但未考虑行李力臂?实际上行李跟随旅客,力臂同旅客(18m),正确。但初期我误将行李单独计算力矩,导致重心偏差。
作业3中,若前舱或后舱超载,直接System.exit(0)。这在实际系统中不可接受,应该提示用户重新输入。但鉴于题目要求“若超过最大载重则输出警告并退出”,符合规范。
当前addCargo返回boolean,但装载失败后无后续处理。建议增加自动寻找最佳货舱的功能:
读取所有货舱列表,按剩余容量或重心影响排序,依次尝试装入。
实现一个loadOptimized方法,模拟真实配载系统。
作业1选择排序、作业3冒泡排序都是硬编码。可以设计SortStrategy接口,允许运行时切换排序算法(按重量、按ID、按优先级等),符合开闭原则。
作业3中的力臂、MAC长度等常量应存储在配置文件(如balance.properties)或数据库,而不是写在代码中。这样当机型改变时,无需修改源码。
重量和力矩计算涉及多次累加,使用double可能产生微小误差。在航空领域,建议使用BigDecimal并指定舍入模式,确保合规。
总结
1.通过这三次作业,我深入理解了:
面向对象封装:将数据与行为绑定到类中,避免外部直接操作内部字段。
集合框架:ArrayList的增删改查及排序。
排序算法实践:选择排序、冒泡排序的手写实现,以及Comparator的Lambda简化写法。
输入健壮性:使用独立Validator类统一检查负数、范围等。
物理计算编程:力矩平衡公式、重心百分比计算,并输出格式化报表。
2.需要进一步学习的地方
设计模式:当前代码耦合度较高,可学习工厂模式创建货舱、策略模式处理排序。
异常处理:目前使用System.exit(0)直接终止,应改为抛出自定义异常并捕获。
文件IO:实际配载系统需要从文件读取航班、货物信息,输出舱单到文件,后续可扩展。
图形界面:可尝试用JavaFX或Swing制作简单的配载可视化工具。
3 .对课程的建议
作业层次感强:从简单到复杂,非常适合初学者逐步提升。建议后续增加迭代式需求变更,锻炼重构能力。
测试用例公开:每次作业若能提供几组隐藏测试数据,可帮助自测边界情况。
Code Review环节:建议组织同学互相审查代码,发现不同设计思路,促进交流。
总之,这三次作业让我体验了一个小型航空配载系统的开发流程,既有编码技巧的提升,也加深了对物理概念在软件中落地的理解。感谢老师的精心设计!
浙公网安备 33010602011771号