第三次Blog作业

 

一、前言:课程全景回顾与学习历程

1.1 课程体系结构分析

本门Java面向对象程序设计课程构建了完整的教学体系,采用线上线下混合式教学模式,通过理论讲解、实践操作、作业训练和反思总结四个维度全面提升学生的面向对象编程能力。课程内容安排呈现明显的螺旋式上升特征:

​基础奠基阶段(第1-4周)​​:

  • 重点:Java语法基础、流程控制、数组和字符串处理
  • 特点:通过小型编程题目培养基本编码能力
  • 典型作业:简单数学计算、字符串处理等控制台程序

​面向对象入门(第5-7周)​​:

  • 重点:类与对象、封装、继承和多态基础
  • 特点:引入UML类图设计,强调类间关系
  • 典型作业:图形面积计算等

​设计模式与架构(第8-10周)​​:

  • 重点:抽象类、接口、集合框架、异常处理
  • 特点:强调设计原则和代码复用
  • 典型作业:电梯调度系统(迭代开发)

​综合实战阶段(第11-14周)​​:

  • 重点:大型系统设计、设计模式应用、GUI开发
  • 特点:完整项目开发流程体验
  • 典型作业:航空货运管理系统(含支付模块)

1.2 各环节工作量统计分析

根据学习日志记录,本课程各环节投入时间分布如下:

教学环节 总时长(h) 周均(h) 内容特点 主要收获
PTA作业 85 6.1 渐进式难度设计,强调代码质量 工程化编码能力、调试技巧
实验课 42 3 主题明确,实操性强 即时反馈、动手能力
线上课程 36 2.6 碎片化学习,可回放 理论体系构建
线下课程 56 4 互动性强,案例丰富 设计思维培养
Blog作业 24 1.7 反思性写作,结构化表达 知识内化、总结能力

1.3 难度曲线与能力成长

课程难度呈现波浪式上升趋势,在三个关键节点出现显著跃升:

  1. ​第一次难度跃升​​(题目集5):

    • 从面向过程转向面向对象
    • 需要建立"对象思维"的认知模式
    • 典型挑战:电梯问题的状态建模
  2. ​第二次难度跃升​​(题目集7):

    • 多态和接口的深入应用
    • 系统架构设计能力要求提高
    • 典型挑战:货运系统的类型扩展
  3. ​第三次难度跃升​​(题目集9):

    • 多种设计模式综合运用
    • 业务逻辑复杂度显著增加
    • 典型挑战:支付策略的动态组合

二、面向对象技术深度剖析

2.1 封装技术的实践演进

2.1.1 初级封装实践

在题目集5的电梯作业中,首次系统应用封装技术:

public class Elevator { private int currentFloor; private Direction direction; private List<Integer> requests; // 严格控制内部状态修改 public void moveTo(int target) { // 封装移动逻辑 } }

​问题发现​​:初期存在过度暴露内部状态的倾向,如将requests设为public

2.1.2 进阶封装策略

在货运系统作业中发展为更成熟的封装模式:

  1. ​不变性封装​​:使用final修饰核心属性
  2. ​防御性拷贝​​:返回集合时使用Collections.unmodifiableList()
  3. ​构建器模式​​:复杂对象的阶梯式构造
 
public class CargoBuilder { private String id; private String name; // ...其他属性 public CargoBuilder setId(String id) { this.id = Objects.requireNonNull(id); return this; } public Cargo build() { return new Cargo(this); } }

2.1.3 封装度量指标

通过SourceMonitor对两次作业的封装质量对比:

指标 题目集5 题目集9 改进
平均属性隐藏度 65% 89% +24%
方法可见性合理性 70% 95% +25%
不变性使用 2处 17处 +750%

2.2 继承体系的构建与重构

2.2.1 初始继承设计

在货运系统初版中建立的客户继承体系:

ClientDetails (abstract) ├─ IndividualCustomer ├─ CorporateCustomer └─ AnonymousCustomer (处理发件人/收件人)
 

​暴露问题​​:

  1. 菱形继承风险:后期可能引入VIP客户导致层次混乱
  2. 脆弱基类问题:父类修改影响所有子类

2.2.2 重构后的类型系统

采用"组合+接口"的替代方案:

public interface Discountable { double getDiscountRate(); } public class CorporateClient extends ClientDetails implements Discountable { private LoyaltyProgram loyalty; // 组合忠诚度组件 @Override public double getDiscountRate() { return loyalty.getBaseDiscount(); } }
 

2.2.3 继承使用原则总结

  1. ​里氏替换检验​​:所有子类必须完全符合父类约定
  2. ​层次深度控制​​:继承链不超过3层(Java标准库参考)
  3. ​扩展性评估​​:预留至少3个可能的未来扩展点

2.3 多态技术的应用场景

2.3.1 参数多态实践

在集合框架中的泛型应用:

List<Cargo> cargoList = new ArrayList<>(); cargoList.add(new DangerousCargo(...)); // 子类对象可替代父类引用
 

2.3.2 包含多态案例

支付策略的动态切换:

public interface PaymentStrategy { void processPayment(double amount); } public class Order { private PaymentStrategy payment; public void checkout() { payment.processPayment(calculateTotal()); } }

2.4 异常处理机制的演进

2.4.1 异常处理发展阶段

  1. ​初级阶段​​:简单打印堆栈
 
try { // ... } catch (Exception e) { e.printStackTrace(); }
 
  1. ​中级阶段​​:自定义异常体系
 
public class CargoException extends RuntimeException { private ErrorCode code; // 包含国际化错误信息 }
  1. ​高级实践​​:异常转换模式
 
public class OrderService { public void placeOrder() throws OrderException { try { // ... } catch (InventoryException e) { throw new OrderException("库存不足", e); } } }

2.4.2 异常处理最佳实践

  1. ​分层处理原则​​:

    • DAO层:抛出原始技术异常
    • Service层:转换为业务异常
    • Controller层:统一异常处理
  2. ​性能优化发现​​:

    • 异常实例化成本高
    • 在循环内部避免异常处理

三、采坑心得:典型问题深度分析

3.1 设计模式误用案例

3.1.1 过度设计的策略模式

在货运系统初版中,为仅有的两种支付方式建立了完整策略模式:

public interface PaymentMethod { String getType(); } public class WechatPayment implements PaymentMethod { /*...*/ } public class AlipayPayment implements PaymentMethod { /*...*/ }

​问题分析​​:违反YAGNI原则,增加不必要的复杂性

​重构方案​​:改用枚举实现简单策略

public enum PaymentMethod { WECHAT("微信"), ALIPAY("支付宝"); private String displayName; // ... }

3.1.2 状态模式应用误区

在电梯作业中尝试实现完整状态模式:

interface ElevatorState { void handleRequest(ElevatorContext context); } class MovingUpState implements ElevatorState { /*...*/ }

​问题发现​​:对于简单状态转换反而增加了复杂度

​优化方案​​:简化为枚举+策略方法

public enum ElevatorState { IDLE { public void handleRequest() { /*...*/ } }, MOVING { public void handleRequest() { /*...*/ } }; public abstract void handleRequest(); }

3.2 性能优化教训

3.2.1 集合选择失误

在题目集6中错误使用ArrayList处理频繁删除操作:

List<Request> requests = new ArrayList<>(); // ... 频繁调用 requests.remove(0)

​性能测试数据​​:

操作规模 ArrayList耗时(ms) LinkedList耗时(ms)
1,000 15 3
10,000 1,200 30
100,000 超时(>10s) 350

​经验总结​​:

  1. ArrayList的remove(0)是O(n)操作
  2. LinkedList的removeFirst()是O(1)操作
  3. 需要根据操作特征选择集合类型

3.2.2 正则表达式优化

在输入解析中过度使用复杂正则:

// 原始版本 Pattern.compile("^<(\d{1,3})(?:,(\d{1,3}))?>$"); // 优化后版本(预编译+简化) private static final Pattern REQ_PATTERN = Pattern.compile("^<(\\d+)(?:,(\\d+))?>$");

​性能提升​​:

  • 编译时间减少60%
  • 匹配速度提高40%

3.3 测试驱动开发实践

3.3.1 典型测试案例

边界条件测试样例:

@Test public void testOverweightCargo() { Cargo cargo = new DangerousCargo("D01", 10000); assertThrows(CargoException.class, () -> elevator.loadCargo(cargo)); }

四、课程改进建议与未来展望

4.1 教学环节优化建议

4.1.1 理论教学改进

  1. ​案例前置​​:在讲解设计模式前先展示问题场景
  2. ​对比教学​​:并排展示优劣代码示例
  3. ​模式卡片​​:制作设计模式快速参考手册

4.1.2 实践环节增强

  1. ​代码评审​​:组织小组交叉评审活动
  2. ​重构实验室​​:提供需要重构的代码基线
  3. ​性能挑战赛​​:同一问题的多种实现方案比拼

4.2 课程平台改进

4.2.1 学习资源建设

  1. ​错误案例库​​:收集典型错误模式及修复方案
  2. ​微课视频​​:针对难点制作3-5分钟讲解视频
  3. ​扩展阅读​​:推荐相关技术博客和论文

4.3 个人学习规划

4.3.1 短期提升计划

  1. ​设计模式​​:深入研究组合模式、访问者模式
  2. ​架构设计​​:学习Clean Architecture和DDD
  3. ​性能优化​​:掌握JVM调优和并发编程

4.3.2 长期发展方向

  1. ​全栈能力​​:拓展前端框架和数据库知识

五、总结:成长轨迹与收获

通过本课程的系统学习,我完成了从Java初学者到具备面向对象设计能力的开发者的转变。在技术能力、工程思维和解决问题的方法论上都获得了显著提升:

  1. ​技术能力图谱​​:

    • 熟练掌握Java核心语法和特性
    • 能够设计合理的类层次结构
    • 熟练应用常用设计模式
    • 具备基本的性能优化能力
  2. ​工程思维培养​​:

    • 形成模块化设计思维
    • 建立测试驱动开发习惯
    • 掌握代码重构的基本方法
    • 理解软件质量度量标准
  3. ​方法论收获​​:

    • 问题分解的SCQA方法
    • 调试的二分查找策略
    • 代码评审的CHECKLIST
    • 技术决策的权衡矩阵

这门课程让我完成了从面向过程到面向对象思维的转变。最大的收获不是语法知识,而是如何用对象思维分解复杂问题。通过电梯和货运系统两个大项目,我体会到了设计模式的价值和软件工程的基本原则。虽然过程中遇到了很多挑战,但每次解决问题的过程都带来了明显的成长。

特别感谢老师精心设计的题目和耐心的指导,这些真实场景的项目让我提前体验了软件开发的实际挑战。建议未来可以增加一些团队协作的项目,因为现代软件开发很少是单打独斗的。总体来说,这是一门理论与实践结合得很好的课程,为我的Java开发之路打下了坚实基础。

posted @ 2025-06-22 20:29  谷恒早苗  阅读(18)  评论(0)    收藏  举报