题目集8-9总结性Blog:航空货运管理系统的面向对象设计与实现

题目集8-9总结性Blog:航空货运管理系统的面向对象设计与实现

前言

题目集8和题目集9是面向对象程序设计课程中的重要实践环节,主要围绕航空货运管理系统展开,深入考查了面向对象设计的核心原则和实现技巧。

知识点覆盖

两次题目集涵盖了以下核心知识点:

题目集8主要知识点:

  • 类的基本设计与封装
  • 继承机制的初步应用
  • 方法重写与多态的基础概念
  • 集合框架的使用(ArrayList等)
  • 日期处理与格式化
  • 异常处理机制

题目集9主要知识点:

  • 抽象类与接口的设计
  • 多态机制的深度应用
  • 面向对象五大设计原则(SOLID原则)
  • 工厂模式的应用
  • 组合与聚合关系的实现
  • 系统架构的可扩展性设计

题量与难度分析

题目集8:

  • 题目数量:3题
  • 难度等级:中等
  • 主要挑战:类之间关系的建立和数据流转

题目集9:

  • 题目数量:3题
  • 难度等级:较高
  • 主要挑战:面向对象设计原则的综合应用和系统架构的重构

从题目集8到题目集9,可以明显感受到难度的递进。题目集8更注重基础语法和简单的面向对象概念,而题目集9则要求学生具备更深层次的设计思维和架构能力。

设计与分析

题目集8航空货运管理系统分析

系统架构概述

题目集8的航空货运管理系统采用了相对简单的类设计结构,主要包含以下核心类:

  • Customer:客户信息管理
  • Cargo:货物信息及费用计算
  • Flight:航班信息管理
  • Order:订单信息整合
  • CargoDetail:货物明细处理

代码复杂度分析

通过SourceMonitor工具分析题目集8航空货运管理系统的代码质量:

主要指标分析:

  • 代码行数:约300行
  • 圈复杂度:平均1.67
  • 类的耦合度:中等
  • 方法长度:大部分在10-20行之间

设计特点与问题

优点:

  1. 类职责相对明确
  2. 基本的封装性得到保证
  3. 数据流转逻辑清晰

存在的问题:

  1. 缺乏抽象层次,扩展性不足
  2. 硬编码较多,如费率计算逻辑
  3. 违反开闭原则,新增货物类型需要修改现有代码

题目集9航空货运管理系统分析

重构后的系统架构

题目集9对系统进行了全面重构,引入了面向对象设计的五大原则:

核心设计改进

1. 单一职责原则的应用

每个类都有明确的单一职责:

  • Customer抽象类:专注于客户信息管理
  • Cargo抽象类:专注于货物属性和费用计算
  • Payment接口:专注于支付方式处理

2. 里氏替换原则的实现

通过继承体系确保了子类可以完全替换父类。

3. 开闭原则的体现

系统对扩展开放,对修改关闭。新增货物类型或支付方式无需修改现有代码。

4. 依赖倒置原则的应用

高层模块依赖于抽象,而非具体实现。Order类依赖于CustomerCargoPayment的抽象。

代码质量提升

对比分析:

  • 代码行数:约500行
  • 圈复杂度:0.00(SM测试出来的Average complexity项确实降为0.00)
  • 类的耦合度:低(通过接口和抽象类降低耦合)
  • 可维护性指数:显著提升

性能与扩展性分析

性能方面:

  • 通过多态机制避免了大量的if-else判断
  • 工厂模式提高了对象创建的效率
  • 合理的继承层次减少了代码重复

扩展性方面:

  • 新增客户类型:只需继承Customer抽象类
  • 新增货物类型:只需继承Cargo抽象类
  • 新增支付方式:只需实现Payment接口

采坑心得

题目集8遇到的主要问题

问题1:费率计算逻辑混乱

问题描述:
初始实现时,将所有费率计算逻辑都写在了Cargo类的一个方法中,导致代码冗长且难以维护。

解决过程:

  1. 第一次提交:所有逻辑写在一个方法中,代码行数超过50行
  2. 第二次提交:尝试拆分方法,但仍然在同一个类中
  3. 最终解决:将不同类型的费率计算分别封装

心得体会:
单一职责原则不仅适用于类,也适用于方法。一个方法应该只做一件事情。

问题2:日期格式处理异常

问题描述:
在处理日期输入时,经常出现ParseException,导致程序崩溃。

数据分析:

  • 主要原因:日期格式不统一
  • 解决方案:统一使用SimpleDateFormat并添加异常处理


题目集9遇到的主要问题

问题1:抽象类设计不当

问题描述:
初始设计时,将Customer设计为普通类而非抽象类,导致无法强制子类实现折扣率方法。

重构过程:

  1. 识别问题:发现getDiscountRate()方法在父类中返回固定值
  2. 分析需求:不同客户类型应有不同的折扣率
  3. 重构方案:将Customer改为抽象类,getDiscountRate()改为抽象方法

问题2:工厂模式实现复杂

问题描述:
Main类中实现工厂方法时,出现了大量的if-else判断。

优化前后对比:

优化前:

  • 代码行数:每个工厂方法15-20行
  • 圈复杂度:6-8
  • 可读性:较差

优化后:

  • 代码行数:每个工厂方法8-12行
  • 圈复杂度:3-4
  • 可读性:良好

改进建议

代码层面的改进

1. 引入设计模式

建议引入的模式:

  • 策略模式:用于费率计算策略的选择
  • 观察者模式:用于订单状态变化的通知
  • 建造者模式:用于复杂订单对象的构建

2. 异常处理机制优化

当前问题:

  • 异常类型单一
  • 错误信息不够详细
  • 缺乏异常恢复机制

改进方案:

  • 自定义异常类型
  • 实现异常链传递
  • 添加日志记录功能

3. 性能优化建议

内存使用优化:

  • 使用对象池管理频繁创建的对象
  • 实现延迟加载机制
  • 优化集合类的使用

计算性能优化:

  • 缓存费率计算结果
  • 使用更高效的算法
  • 减少不必要的对象创建

架构层面的改进

1. 分层架构设计

建议采用三层架构:

  • 表示层:用户界面和输入输出处理
  • 业务逻辑层:核心业务规则和计算
  • 数据访问层:数据持久化和检索

2. 配置管理

建议实现:

  • 费率配置外部化
  • 支付方式配置化
  • 系统参数动态调整

3. 扩展性设计

插件化架构:

  • 货物类型插件化
  • 支付方式插件化
  • 费率计算插件化

测试策略改进

1. 自动化测试

建议实现:

  • 单元测试自动化
  • 集成测试自动化
  • 性能测试自动化

2. 测试覆盖率提升

目标指标:

  • 代码覆盖率:>90%
  • 分支覆盖率:>85%
  • 功能覆盖率:100%

总结

学习收获

通过题目集8-9的学习和实践,我深刻理解了面向对象程序设计的精髓:

1. 设计原则的重要性

SOLID原则的实际应用:

  • 单一职责原则:让每个类都有明确的职责边界
  • 开闭原则:通过抽象和多态实现系统的可扩展性
  • 里氏替换原则:确保继承关系的正确性
  • 接口隔离原则:设计精简而专注的接口
  • 依赖倒置原则:依赖抽象而非具体实现

2. 架构思维的培养

从题目集8的简单类设计到题目集9的复杂系统架构,我学会了:

  • 如何进行系统分析和设计
  • 如何平衡复杂性和可维护性
  • 如何设计可扩展的系统架构

3. 编程技能的提升

技术能力:

  • 熟练掌握Java面向对象特性
  • 理解并应用设计模式
  • 具备代码重构能力

工程能力:

  • 代码质量意识的提升
  • 测试驱动开发的理念
  • 文档编写和维护能力

需要进一步学习的领域

1. 高级设计模式

虽然在项目中应用了一些基础的设计模式,但对于更复杂的模式(如命令模式、状态模式等)还需要深入学习。

2. 系统架构设计

需要学习更多关于大型系统架构设计的知识,包括:

  • 微服务架构
  • 分布式系统设计
  • 高并发处理

3. 性能优化技术

在性能优化方面还有很大的提升空间:

  • JVM调优
  • 算法优化
  • 数据库优化

对课程的建议和意见

1. 教学内容方面

优点:

  • 理论与实践结合紧密
  • 题目设计循序渐进
  • 注重实际应用能力培养

建议改进:

  • 增加更多实际项目案例
  • 加强代码审查和重构训练
  • 引入更多现代开发工具和方法

2. 作业设计方面

优点:

  • 题目具有很好的连贯性
  • 难度梯度设置合理
  • 注重设计原则的应用

建议改进:

  • 提供更详细的评分标准
  • 增加代码质量评估维度
  • 加强同学间的代码交流

3. 实验组织方面

建议:

  • 增加小组协作项目
  • 加强版本控制方面的教学

4. 课堂教学方面

建议:

  • 增加更多互动式教学
  • 加强案例分析和讨论
  • 引入业界最佳实践分享

结语

题目集8-9的学习过程是一个从简单到复杂、从理论到实践的渐进过程。通过这两次作业,我不仅掌握了面向对象程序设计的核心概念和技术,更重要的是培养了系统性的设计思维和工程实践能力。

posted @ 2025-05-25 22:23  Guardinary  阅读(20)  评论(0)    收藏  举报