第三次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 难度曲线与能力成长
课程难度呈现波浪式上升趋势,在三个关键节点出现显著跃升:
-
第一次难度跃升(题目集5):
- 从面向过程转向面向对象
- 需要建立"对象思维"的认知模式
- 典型挑战:电梯问题的状态建模
-
第二次难度跃升(题目集7):
- 多态和接口的深入应用
- 系统架构设计能力要求提高
- 典型挑战:货运系统的类型扩展
-
第三次难度跃升(题目集9):
- 多种设计模式综合运用
- 业务逻辑复杂度显著增加
- 典型挑战:支付策略的动态组合
二、面向对象技术深度剖析
2.1 封装技术的实践演进
2.1.1 初级封装实践
在题目集5的电梯作业中,首次系统应用封装技术:
问题发现:初期存在过度暴露内部状态的倾向,如将requests设为public
2.1.2 进阶封装策略
在货运系统作业中发展为更成熟的封装模式:
- 不变性封装:使用final修饰核心属性
- 防御性拷贝:返回集合时使用Collections.unmodifiableList()
- 构建器模式:复杂对象的阶梯式构造
2.1.3 封装度量指标
通过SourceMonitor对两次作业的封装质量对比:
| 指标 | 题目集5 | 题目集9 | 改进 |
|---|---|---|---|
| 平均属性隐藏度 | 65% | 89% | +24% |
| 方法可见性合理性 | 70% | 95% | +25% |
| 不变性使用 | 2处 | 17处 | +750% |
2.2 继承体系的构建与重构
2.2.1 初始继承设计
在货运系统初版中建立的客户继承体系:
暴露问题:
- 菱形继承风险:后期可能引入VIP客户导致层次混乱
- 脆弱基类问题:父类修改影响所有子类
2.2.2 重构后的类型系统
采用"组合+接口"的替代方案:
2.2.3 继承使用原则总结
- 里氏替换检验:所有子类必须完全符合父类约定
- 层次深度控制:继承链不超过3层(Java标准库参考)
- 扩展性评估:预留至少3个可能的未来扩展点
2.3 多态技术的应用场景
2.3.1 参数多态实践
在集合框架中的泛型应用:
2.3.2 包含多态案例
支付策略的动态切换:
2.4 异常处理机制的演进
2.4.1 异常处理发展阶段
- 初级阶段:简单打印堆栈
- 中级阶段:自定义异常体系
- 高级实践:异常转换模式
2.4.2 异常处理最佳实践
-
分层处理原则:
- DAO层:抛出原始技术异常
- Service层:转换为业务异常
- Controller层:统一异常处理
-
性能优化发现:
- 异常实例化成本高
- 在循环内部避免异常处理
三、采坑心得:典型问题深度分析
3.1 设计模式误用案例
3.1.1 过度设计的策略模式
在货运系统初版中,为仅有的两种支付方式建立了完整策略模式:
问题分析:违反YAGNI原则,增加不必要的复杂性
重构方案:改用枚举实现简单策略
3.1.2 状态模式应用误区
在电梯作业中尝试实现完整状态模式:
问题发现:对于简单状态转换反而增加了复杂度
优化方案:简化为枚举+策略方法
3.2 性能优化教训
3.2.1 集合选择失误
在题目集6中错误使用ArrayList处理频繁删除操作:
性能测试数据:
| 操作规模 | ArrayList耗时(ms) | LinkedList耗时(ms) |
|---|---|---|
| 1,000 | 15 | 3 |
| 10,000 | 1,200 | 30 |
| 100,000 | 超时(>10s) | 350 |
经验总结:
- ArrayList的remove(0)是O(n)操作
- LinkedList的removeFirst()是O(1)操作
- 需要根据操作特征选择集合类型
3.2.2 正则表达式优化
在输入解析中过度使用复杂正则:
性能提升:
- 编译时间减少60%
- 匹配速度提高40%
3.3 测试驱动开发实践
3.3.1 典型测试案例
边界条件测试样例:
四、课程改进建议与未来展望
4.1 教学环节优化建议
4.1.1 理论教学改进
- 案例前置:在讲解设计模式前先展示问题场景
- 对比教学:并排展示优劣代码示例
- 模式卡片:制作设计模式快速参考手册
4.1.2 实践环节增强
- 代码评审:组织小组交叉评审活动
- 重构实验室:提供需要重构的代码基线
- 性能挑战赛:同一问题的多种实现方案比拼
4.2 课程平台改进
4.2.1 学习资源建设
- 错误案例库:收集典型错误模式及修复方案
- 微课视频:针对难点制作3-5分钟讲解视频
- 扩展阅读:推荐相关技术博客和论文
4.3 个人学习规划
4.3.1 短期提升计划
- 设计模式:深入研究组合模式、访问者模式
- 架构设计:学习Clean Architecture和DDD
- 性能优化:掌握JVM调优和并发编程
4.3.2 长期发展方向
- 全栈能力:拓展前端框架和数据库知识
五、总结:成长轨迹与收获
通过本课程的系统学习,我完成了从Java初学者到具备面向对象设计能力的开发者的转变。在技术能力、工程思维和解决问题的方法论上都获得了显著提升:
-
技术能力图谱:
- 熟练掌握Java核心语法和特性
- 能够设计合理的类层次结构
- 熟练应用常用设计模式
- 具备基本的性能优化能力
-
工程思维培养:
- 形成模块化设计思维
- 建立测试驱动开发习惯
- 掌握代码重构的基本方法
- 理解软件质量度量标准
-
方法论收获:
- 问题分解的SCQA方法
- 调试的二分查找策略
- 代码评审的CHECKLIST
- 技术决策的权衡矩阵
这门课程让我完成了从面向过程到面向对象思维的转变。最大的收获不是语法知识,而是如何用对象思维分解复杂问题。通过电梯和货运系统两个大项目,我体会到了设计模式的价值和软件工程的基本原则。虽然过程中遇到了很多挑战,但每次解决问题的过程都带来了明显的成长。
特别感谢老师精心设计的题目和耐心的指导,这些真实场景的项目让我提前体验了软件开发的实际挑战。建议未来可以增加一些团队协作的项目,因为现代软件开发很少是单打独斗的。总体来说,这是一门理论与实践结合得很好的课程,为我的Java开发之路打下了坚实基础。

浙公网安备 33010602011771号