第二次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
依赖倒置原则:高层模块不依赖低层细节,通过抽象交互
八、未来演进路线图
架构升级:从单体向微服务架构演进
智能定价:引入机器学习算法动态调整运费
可视化分析:集成大数据可视化工具
物联网集成:支持货物追踪传感器数据接入
区块链应用:探索运单的分布式存证
九、项目总结与职业思考
通过航空货运管理系统的开发,我不仅掌握了面向对象的设计技巧,更培养了对复杂业务系统进行分析和建模的能力。这个项目让我认识到,优秀的软件设计应当:
准确反映业务领域的本质
具备良好的适应性和扩展性
在复杂性和简洁性之间取得平衡
为未来的演进预留空间
这次实践经历让我对软件工程师的角色有了更深的理解——我们不仅是代码的编写者,更是业务问题的解决者和价值创造者。在未来的学习和职业发展中,我将继续深化对软件设计原则的理解,努力打造更加优雅、健壮和可维护的系统。
浙公网安备 33010602011771号