课程特色: 本课程注重实战,采用案例贯穿方式完成实践,收集了大量的真实案例,针对项目过程中技术人员常犯的错误进行了汇总,研讨,并最终形成培训教程。本次培训从程序员的编程思维开始讲解,通过大量的真实案例,详细地介绍了重构需要注意的要点以及难点,这些知识都是讲师十几年经验的总结。
|
课程大纲:
下大纲内容较多,实际授课时根据学员课前调查进行调整,并且实际授课不一定按此顺序。
授课内容 | |
第一部分 软件腐烂与可维护性 | |
第一单元 软件腐烂与软件的可维护性 | 内容一:软件业者的反思: 软件腐烂 1. 软件腐烂(Software rot),也叫做代码腐烂(code rot)或软件腐朽(software decay)。它描述了随着时间的逝去感知到软件的缓慢衰退,其将最终导致它变得不完善、不可使用或难以维护。 2. 软件腐烂(Software rot)有两种形式: 3. 1)隐匿的腐烂:软件逐渐不再(仍)被使用随着剩余的应用程序的改变变得不能用。它已经被观察到不再被使用的软件有可能一年的半衰期; 4. 2) 活动的腐烂:软件随着不断地被修改趋向于失去它的完整性。 5. 破窗效应与技术债务 6. 案例演示1-通过演示大型项目,随着客户需求的变化,导致软件结构混乱,大家反思,为什么? 你认为软件腐烂的原因? 反思你们公司的软件系统也面临这样的问题吗? 内容二:软件维护性定律—软件从业者必须知道的定律 1. 软件变化定律:软件存在的时间越久,它的某个部分需要变化的可能性越大 2. 软件缺陷定律:在软件中新增缺陷的可能性与代码修改量成正比 3. 软件简洁定律:软件任何一部分的维护难度,反比于该部门的简洁程度 4. 软件可维护方程式 D=V/E D代表变化的合意程度,V代表价值,E维护成本,也就是说明,相对减低实现成本,降低维护成本更重要。 5. 软件设计定律:相比降低开发成本,降低维护成本更加重要。维护成本正比于系统的复杂程度。 7. 案例演示-通过大型项目,介绍这些基本的软件维护定律?也许大家都明白,但是我是否真的关注这些了吗? |
第二部分 减少维护成本之道---重构 | |
第二单元 重构实践 | 内容一:重构 1. 重构概述 2. 何时重构 3. 重构的误区 4. 重构是持续进行的,不要先编写烂代码,再抽出重构 5. 如何发现哪些地方需要重构 6. 如何保证重构的正确 7. 如何测试重构 8. 通过一个小案例演示重构的基本思想(什么时间重构,如何发现重构点,如何保证重构的正确性,最后如何验收) 内容二:案例—通过实际项目演示重构 1. 介绍项目需求情况,进行设计 2. 阅读代码指出代码坏症状 3. 通过重构逐步改善代码质量 4. 通过该案例演示重构的过程,我们遇到的难处,如何解决? 内容三:重构关键—代码的坏味道 1. 代码坏味道概述 2. 代码坏味道的分类 3. 识别代码坏味道,是重构的最重要一步 4. 所谓重构,无非就是嗅到坏味道,然后,一小步一小步的改了它。问题是,很多人对坏味道的容忍度让他们嗅不到坏味道, 5. 案例分析—通过真实项目的代码,分析代码坏味道 内容四:重构手法 1. 重构手法概述 2. 简要演示重构的主要手法 3. 使用IDE重构工具进行重构 4. 通过案例演示如何通过重构工具完成重构 |
第三部分 重构实战1一函数相关重构 | |
第三单元 函数重构
| 内容一:函数的重构 1. 函数的重构 2. 巨型函数的种类 a) 项目列表式巨型方法 b) 锯齿状巨型方法 3. 分解函数 4. 助手方法提取 5. 利用自动重构对付巨型方法 6. 利用手工重构对付巨型方法 7. 引入感知变量 8. 函数依赖收集 9. 分解助手方法和方法对象 10. 通过案例介绍长函数的重构最佳实践 |
第四部分 重构实战2一类重构 | |
第四单元 类重构
| 内容一:重构案例—该案例重点 巨大类的重构 1. 重构大类 1. 对象的职责重构 2. 职责的识别 a) 方法分组 b) 观察隐藏方法 c) 寻找可以更改的原因 d) 寻找内部关系 e) 寻找主要职责 f) 接口分离—接口隔离原则 3. 提取类和接口 4. 通过案例介绍如何重构巨大的类 |
第五部分 重构实战3一重构与模式 | |
第五单元 重构与模式
| 内容一:案例---重构设计方案引入设计模式 1. 通过项目分析重构到模式的手段 2. 构造Template Method 3. 以Composite取代一/多之分 4. 引入Null Object 5. 用Adapter统一接口 6. 用Fatory Method引入多态创建 5. 通过案例介绍如何重构原始设计方案,演示如何通过重构导入设计模式 |
第六部分 重构实战4一模块/组件重构 | |
第六单元 模块重构
| 内容一:模块重构 1. 优良的系统设计意味着我们把系统分割成了一个个可单独部署的组件,单独部署意味着如果更改了一个组件,我们也不需要重新部署其他组件。 2. 组件和包 坏味道 3. 模块之间解耦 4. 组件的内聚性实践 5. 组件的依赖性实践 6. 企业应用系统组件设计最佳实践 7. 分析某项目,演示模块重构,如何在大型应用系统进行模块重构 |
第七部分 重构实战5一数据库重构 | |
第七单元 架构重构
| 内容一: 数据重构过程 1. 验证数据库重构是否合适 2. 选择最合适的数据库重构 3. 让原来的数据库schema过时 4. 前测试、中测试和后测试 5. 修改数据库schema 6. 迁移源数据 7. 重构外部访问程序 8. 运行回归测试 9. 对工作进行版本控制 10. 结束此次重构 11. 分析多年遗留的复杂项目,演示如何重构数据库, 数据库重构的一般步骤,和普通的应用程序代码的重构的不同点。 内容二: 数据库重构策略 1. 小的变更更容易进行 2. 唯一地标识每一次重构 3. 通过许多小变更实现一次大变更 4. 建立数据库配置表 5. 触发器优于视图或批量同步 6. 选择一个足够长的转换期 7. 简化数据库变更控制委员会策略 8. 简化与其他团队的协商 9. 封装对数据库的访问 10. 能够容易地建立数据库环境 11. 不要复制sql 12. 将数据库资产置于变更控制之下 12. 通过多个大型项目的数据库重构策略, 分析在不同的数据库坏味道下,使用不同的重构策略 |
第八部分 重构实战6一架构重构 | |
第七单元 架构重构
| 内容一: 架构重构 1. 软件架构概述 2. 遗留系统的软件架构恢复 3. 软件架构的重构时机 4. 软件架构的重构步骤 5. 架构坏味道 6. 架构重构策略 |
第九部分 安全重构--构筑重构测试体系 | |
第八单元 单元测试-构筑测试体系 | 内容一:理解单元测试 1. 理解单元测试 第一个单元测试 2. 单元测试框架提供了什么功能 3. 好的测试是什么样子的 4. 为什么要写单元测试,为什么不写单元测试 5. 为什么要写"好"的单元测试 6. 分析真实项目,如何做单元测试, 已经相关问题 内容二:构筑测试体系 1. 单元测试中的坏味道 2. 让测试容易被看懂的模式 3. 让测试容易维护的模式 4. 让测试被信得过的模式 5. 重构单元测试,改进代码设计 6. 如何在集成与单元、黑盒或白盒、Mock和非Mock之间做选择? 7. 结合多个案例项目进行分析,分析什么是好的单元测试 |
第九单元 重构管理
| 内容一:安全重构 1. 重构的恐惧心里 2. 重构勇气 3. 安全重构和祈祷式重构 4. 安全重构保证 a) 依赖编辑器 b) 签名保持 c) 单一目标 d) 依赖编译器 e) 个人的能力 f) 代码审查 g) 单元测试 h) 验收测试 i) 人工测试 5. 通过案例如何保证重构的正确性 |