第二次Blog作业

一、项目背景与设计初衷
在完成面向对象程序设计课程的理论学习后,我深刻认识到将抽象概念转化为实际应用的重要性。航空货运管理系统项目为我提供了一个绝佳的实践平台,让我能够将封装、继承、多态等核心概念融入到一个真实的业务场景中。

这个项目不仅仅是一个简单的编程练习,而是一个模拟真实航空货运业务流程的完整系统。从客户下单到运费计算,再到航班运力评估,每个环节都需要精心设计。我的核心设计目标包括:

构建一个层次分明的业务对象体系,准确反映航空货运领域的实体关系

实现智能化的运费计算引擎,支持多种计费规则

开发可靠的运力评估机制,防止航班超载

设计清晰的数据报表系统,便于业务分析和追踪

二、系统架构的演进与优化
2.1 类图设计的迭代过程
最初的类图设计较为简单,仅包含基本的Customer、Cargo和Flight类。随着对业务理解的深入,我进行了三次重要重构:

第一次重构:引入Order类作为核心协调者,聚合客户、货物和航班信息

第二次重构:将运费计算逻辑从主程序迁移到Cargo类中

第三次重构:添加异常处理机制,增强系统健壮性

2.2 核心类的职责划分
Customer类不仅仅存储基本信息,还负责验证联系方式格式和地址有效性。我为其添加了正则表达式验证,确保数据质量。

Cargo类成为系统的"智能"核心,它不仅记录物理属性,还封装了复杂的业务逻辑:

体积重量计算算法

计费重量决策逻辑

阶梯式运费计算引擎

Order类作为业务流程的"指挥者",协调各个对象的协作:

维护客户-货物-航班的关联关系

汇总运费和重量数据

执行最终的运力检查

Flight类除了基本信息外,还实现了载重预警机制,当货物总重接近最大载重时会产生警告提示。

三、业务逻辑的深度实现
3.1 输入系统的智能化设计
输入处理采用了分阶段验证模式:

java
public class InputValidator {
public static boolean validateCustomerInfo(String phone, String address) {
// 手机号正则验证
String phoneRegex = "^1[3-9]\d{9}$";
// 地址非空验证
return phone.matches(phoneRegex) && !address.trim().isEmpty();
}

public static boolean validateCargoDimensions(double length, double width, double height) {
    // 尺寸必须为正数
    return length > 0 && width > 0 && height > 0;
}

}
3.2 运费计算引擎的实现
运费计算采用了策略模式的思想,便于未来扩展:

java
public class Cargo {
private static final double VOLUME_FACTOR = 6000;
private static final double[] WEIGHT_BRACKETS = {0, 10, 50, Double.MAX_VALUE};
private static final double[] PRICE_RATES = {8, 7.5, 7};

public double calculateCharge() {
    double volumetricWeight = calculateVolumetricWeight();
    double chargeableWeight = Math.max(volumetricWeight, actualWeight);
    
    for (int i = 0; i < WEIGHT_BRACKETS.length - 1; i++) {
        if (chargeableWeight > WEIGHT_BRACKETS[i] && 
            chargeableWeight <= WEIGHT_BRACKETS[i+1]) {
            return chargeableWeight * PRICE_RATES[i];
        }
    }
    return 0;
}

private double calculateVolumetricWeight() {
    return (length * width * height) / VOLUME_FACTOR;
}

}
3.3 运力评估的优化处理
运力检查不仅判断是否超载,还提供超载百分比分析:

java
public class Flight {
public void checkCapacity(double totalWeight) throws OverCapacityException {
double overloadPercentage = (totalWeight - maxLoad) / maxLoad * 100;
if (overloadPercentage > 0) {
throw new OverCapacityException(
String.format("超载%.2f%%,请调整货物配置", overloadPercentage));
}
}
}
四、报表系统的创新设计
报表生成采用了Builder模式,支持灵活扩展:

java
public class ReportBuilder {
private StringBuilder report = new StringBuilder();

public ReportBuilder addHeader(String orderId, Customer customer) {
    report.append("订单编号:").append(orderId).append("\n")
          .append("客户姓名:").append(customer.getName())
          .append("(").append(customer.getId()).append(")\n");
    return this;
}

public ReportBuilder addCargoDetail(List<Cargo> cargos) {
    report.append("\n货物明细:\n");
    for (int i = 0; i < cargos.size(); i++) {
        Cargo cargo = cargos.get(i);
        report.append(i+1).append(". ")
              .append(cargo.getName()).append("(")
              .append(cargo.getId()).append("):")
              .append(String.format("计费重量=%.2fkg,单价=%.1f元,费用=%.1f元",
                  cargo.getChargeableWeight(),
                  cargo.getUnitPrice(),
                  cargo.getShippingFee()))
              .append("\n");
    }
    return this;
}

public String build() {
    return report.toString();
}

}
五、技术挑战与创新解决方案
5.1 对象协作的优化
最初的对象协作存在"上帝对象"问题,主程序承担了过多职责。通过引入"领域驱动设计"思想,我重新划分了职责边界:

Customer类:专注于客户身份验证和信息管理

Cargo类:成为智能业务实体,封装所有货物相关逻辑

Order类:作为领域服务,协调业务流程

Flight类:管理航班资源和容量控制

5.2 计算逻辑的重构
运费计算经历了三次迭代:

初级版:简单if-else结构

中级版:策略模式雏形

高级版:完全的策略模式实现,支持动态规则加载

5.3 数据完整性的保障
开发了多层验证机制:

前端验证:输入格式检查

业务验证:逻辑合理性检查

持久层验证:数据一致性检查

六、测试策略与质量保证
采用了分层测试方法:

单元测试:覆盖所有核心算法

集成测试:验证对象协作

系统测试:完整业务流程验证

特别设计的边界测试案例:

极轻但体积巨大的货物(如充气玩具)

极重但体积小的货物(如金属零件)

刚好处于重量分界点的货物

多件货物组合刚好达到航班载重极限的情况

七、设计原则的实践心得
单一职责原则:每个类只做一件事,如Cargo类只关注货物相关逻辑

开闭原则:运费计算策略可扩展而不修改原有代码

里氏替换原则:未来可扩展特殊货物类型而不影响系统稳定性

接口隔离原则:定义细粒度的接口,如ICargoCalculator

依赖倒置原则:高层模块不依赖低层细节,通过抽象交互

八、未来演进路线图
架构升级:从单体向微服务架构演进

智能定价:引入机器学习算法动态调整运费

可视化分析:集成大数据可视化工具

物联网集成:支持货物追踪传感器数据接入

区块链应用:探索运单的分布式存证

九、项目总结与职业思考
通过航空货运管理系统的开发,我不仅掌握了面向对象的设计技巧,更培养了对复杂业务系统进行分析和建模的能力。这个项目让我认识到,优秀的软件设计应当:

准确反映业务领域的本质

具备良好的适应性和扩展性

在复杂性和简洁性之间取得平衡

为未来的演进预留空间

这次实践经历让我对软件工程师的角色有了更深的理解——我们不仅是代码的编写者,更是业务问题的解决者和价值创造者。在未来的学习和职业发展中,我将继续深化对软件设计原则的理解,努力打造更加优雅、健壮和可维护的系统。

posted on 2025-05-25 21:07  高涵子林  阅读(12)  评论(0)    收藏  举报

导航