首页
课程中心
专家团队
新闻中心
精彩活动
关于我们

课程中心

软件重构与软件设计模式

  • 课程时间:6月21日-6月22日
  • 主讲老师:范老师
  • 公开课费用:线下:5900;线上:4700
  • 课程地点:全国

软件重构是指在不改变软件功能和外部可见性的情况下,为了改善软件的结构,提高清晰性、可扩展性和可重用性而对软件进行的改造。简而言之,重构就是改进已经写好的软件的设计。在敏捷开发方法学中,重构常常是软件开发循环的一部分,开发者通过增加新的测试和功能,或者重构代码来改善内部的一致性和清晰性。重构也是代码维护中的一部分,既不修正错误,又不增加新的功能性,而是用于提高代码的可读性或者改变代码的结构和设计,使其在将来更容易被维护。特别是,在现有的程序的结构下,给一个程序增加一个新的行为会非常困难,因此开发人员可能先重构这部分代码,使加入新的行为变得容易。

 

培训要点

软件重构面临的背景都是相似的,程序员们为了快速完成需求和上线而写出了最基本的代码。然后在功能的不断扩充过程中,以打补丁的方式对代码进行扩充,中间还会面临着开发人员的变更和离职。逐渐地,代码就会变得越来越臃肿,渐渐地变得难以维护。

糟糕的软件代码会带来开发效率的降低,在糟糕架构下加入新功能,会大大影响新功能的代码质量,开发和调试时间都会成倍增加;其次是故障率的提升,在质量低下的代码中,总是容易隐藏着很多不易发现的坑,这些都会成为故障的隐患;同时,架构也会使得需求的完成大打折扣,使得设计好的目标,因为架构限制或者性能等原因,只能完成80%甚至更低。

随着不同产品的推出,不同客户、不同版本的发布,需要维护的遗留代码越来越多,重构也就在所难免。不仅如此,所有的软件系统,经过一段时间的维护,都会逐渐变成遗留系统,并且都遭遇了缓慢而不可抗拒的腐化。因此,软件开发人员不得不面对既有系统的混乱代码。

本课程首先深入剖析软件质量下降的根源,提出重构是软件变更中保持高质量的必然,讲解如何运用“两顶帽子”的方式应对变更,拒绝腐化。站在实战的角度讲解高质量软件设计的“小步快跑”过程。接着,用真实案例讲解已经代码腐化的遗留系统是如何通过“软件重构七步曲”,由简入深、循序渐进地重构一个大系统。最后,以重构的角度进行实战,讲解软件如何在不断变更的过程中,运用设计模式来降低耦合,保持软件设计质量不退化。

 

培训特色

本课程注重实战,采用案例贯穿方式完成实践,针对项目过程中技术人员常遇到的误区进行汇总、研讨,以程序员的编程思维为前提,通过大量的真实案例,详细地介绍了重构需要注意的要点以及难点,这些全部都是讲师十几年经验的沉淀及总结。

本课程内容理论性与实践性都较强,采取讲课、讨论、实践三者结合的方式,1/3时间讲解核心思想,1/3时间动手重构实践,1/3点评分析总结,形成一整套解决问题的方法。

 

本课程有企业内训形式,授课老师、课程内容、教学方式均依据企业的培训需求灵活设置。

 

本网站内容包括并不限于课程介绍、课程大纲、上课照片、老师介绍等等资料及信息,未经允许不得抄袭和转载。

培训对象

注重实效的各类软件研发中心的负责人、设计师、架构师、项目经理、技术总监、质量部门经理、开发工程师等。

 

 

代码重构

设计重构

软件腐烂监控

重构管理

开发工程师

精通

了解

了解

了解

设计师

精通

精通

了解

了解

架构师

精通

精通

精通

精通

数据库工程师

了解

了解

/

/

质量管理

/

/

精通

精通

管理者

/

/

监控

了解

 

 

学员基础

具有项目设计、开发工作经验

l. 目前正在面临复杂遗留系统,需要维护和重构

2. 具有面向对象的基本概念,熟悉基本设计模式

 

 

授课内容

第一部分 为什么软件需要及时重构

第一单元

剖析软件质量不断下降的根源

质量不断下降的表现:

  • 程序代码越来越乱
  • 软件维护成本越来越高
  • 软件变更越来越困难
  • 无法进行新技术的改造

以往采取的措施:

  • 头痛医头,脚痛医脚
  • 抛弃掉重新编写
  • 因担心未来变化而做的过度设计

带来的问题

  • 团队成员越来越多但效率却越来越低
  • 测试变得越来越困难而任务繁重
  • 软件系统越来越笨重而不适应未来变化

分析与反思

 

案例分析:一个遗留系统的演化过程

  • 起初的设计
  • 随后的变更
  • 质量不断下降的过程

软件质量下降的根源:

  • 软件总是因变更而变得越来越复杂
  • 软件结构已经不再适应复杂的软件需求
  • 必须要调整软件结构以适应新的软件需求

 

软件是因需求变更而质量下降吗?

案例分析:推演软件变更的设计过程

应对软件变更的最佳方式:两顶帽子

  • 重构原有代码以适应新的需求
  • 实现新的需求

案例:演示两顶帽子的设计过程

 

第二单元

高质量的软件设计过程

以往软件设计的过程:

  • 演示以往软件设计的过程
  • 剖析以往软件设计的问题与风险

 

小步快跑模式的开发过程:

  • 用最快的速度开发一个最核心的功能
  • 让第一个版本运行起来并可以验证
  • 在第一个版本的基础上不断添加功能:
  • 每次只添加一个很简单、很单一的功能
  • 每次以两顶帽子的方式添加新功能
  • 运行、调试与验证
  • 重复这个过程添加下一个功能
  • 复杂的系统就是由一次次正确开发的不断积累而成

 

案例:演示小步快跑的开发过程

小步快跑解决的问题:

  • 复杂功能有效地解耦
  • 代码编写总是可测试与验证
  • 简化设计与思考的复杂度
  • 适时重构以避免软件退化

案例:数据推送程序的设计过程

 

第二部分 如何进行软件重构

第三单元

何为重构

软件重构的概念

  • 重构是一系列代码的等量变换

案例:一个Hello World重构过程

  • 重构的保险索:自动化测试

案例:Hello World的自动化测试过程

  • 软件修改的四种动机——重构的价值
  • 一个真实的谎言——重构的误区
  • 重构的主要方法与技巧

案例分析:重构一个大型遗留系统

  • 重构第一步:分解大函数

超级大函数及其危害

案例:演示大函数产生的过程

案例:演示抽取方法操作步骤

实践抽取方法会遇到的问题和解决方案

  • 重构第二步:拆分大对象

超级大对象及其危害

案例:演示超级大对象的产生过程

案例:演示抽取类的操作步骤

讲解单一职责设计原则

案例:演示“分久必合,合久必分”的重构过程

  • 重构第三步:提高复用率

讲解顺序编程及其危害

“不要重复代码”原则

案例:提高代码复用的6个方法

案例:演示新增代码时的代码复用过程

用静态检查工具检查重复代码

  • 重构第四步:可扩展设计

过度设计 vs. 恰如其分的设计

讲解“开放-封闭”的设计原则

案例:讲解可扩展设计的4个方法

案例:讲解新增代码的可扩展设计过程

  • 重构第五步:降低耦合度

案例:讲解接口、实现与工厂模式

案例:讲解外部接口解耦与适配器模式

案例:讲解继承泛滥问题与桥接模式

案例:讲解方法解耦与策略模式

案例:讲解过程解耦与命令模式

案例:讲解透明扩展与组合模式、装饰者模式

  • 重构第六步:系统分层

反思软件架构需要怎样的分层结构

遗留系统如何拥抱需求变化

遗留系统如何应对技术变革

  • 重构第七步:领域驱动设计

领域驱动设计的概念

讲解领域模型分析方法

讲解原文分析法与领域驱动设计

讨论:如何制定重构项目计划

练习:重构一个小程序并编写测试脚本

第四单元

关于重构的讨论

什么时候重构

  • 重构是一种习惯
  • 重构让程序可读
  • 重构,才好复用
  • 先重构,再扩展
  • 紧急任务时的重构

 

测试的困境

  • 重构初期的困局
  • 解耦与自动化测试
  • 建立自动化测试体系

 

重构的评价

  • 评价软件质量的指标
  • 评价软件质量的工具

 

第三部分 运用设计模式实战软件重构

第五单元

适配器模式

适配器模式的应用

  • 适配器模式解决第三方框架带来的难题

案例:Hibernate适配器的设计

  • 适配器模式解决外部接口的设计难题

 

案例:第三方支付接口的设计

案例:财务数据接口的设计

 

第六单元

策略模式

策略模式的应用

  • 案例:工资发放功能设计改进的过程
  • 工资发放功能的Java实现
  • 工资发放功能的C++实现
  • 案例:数据导出功能的设计实现
  • 深入理解开放-封闭原则
  • 数据导出功能的变更与改进过程
  • 案例:财务凭证生成功能的设计过程
  • 财务凭证生成功能的初始需求与设计
  • 财务凭证生成功能的扩展与分析过程
  • 财务凭证生成功能的最终设计
  • 深入理解单一职责原则
  • 学习“两顶帽子”的设计方式

练习:财务凭证生成功能的设计与实现

 

第七单元

工厂模式

探讨软件设计中遇到的难题

  • 依赖反转原则的设计难题
  • 开放-封闭原则的设计难题
  • 探讨工厂模式的本质

 

简单工厂模式

  • 简单工厂模式的C++实现
  • 基于配置的简单工厂模式
  • 剖析简单工厂如何实现依赖反转原则

案例:剖析Spring的beanFactory

  • 解读工厂模式对设计的重大意义
  • 讲解如何创建一个工厂
  • 创建工厂的步骤与关键点
  • 利用Spring框架简化工厂类的设计

案例:数据导出功能的工厂实现

 

工厂方法模式

  • 工厂方法模式的概念
  • 工厂方法模式的应用

案例:SAX框架的工厂类设计

 

抽象工厂模式

  • 抽象工厂模式的概念

抽象工厂模式的实现

案例:标签库的设计改进过程

  • 最初的标签库设计
  • 运用简单工厂的标签库设计
  • 运用工厂方法的标签库设计
  • 运用抽象工厂的标签库设计
  • 最终基于配置的标签库设计

第八单元

单例模式和原型模式

单例模式的应用

  • 单例模式带来的设计变革
  • 充血模型vs.贫血模型
  • 探讨单例模式与性能问题
  • 单例模式改变了很多软件的设计

 

原型模式的应用

  • 工厂类在提供产品时遇到的设计问题
  • 原型模式及其概念

原型模式的设计实现

案例:函数调用的无副作用问题

案例:JavsScript中的原型模式

 

第九单元

模板方法模式

模板方法模式的作用与技巧

案例:一个工厂模板的设计与实现

深入理解不要重复自己原则

  • 重复代码带来的严重后果
  • 散弹式修改及其解决思路
  • 探讨实现代码复用的难题
  • 代码复用在不同场合采用的方法
  • 模板方法模式在代码复用中的作用

 

第十单元

装饰者模式及桥接模式

装饰者模式的应用

案例:多数据源的设计实现

  • 多数据源问题的分析设计过程
  • 多数据源的设计与实现

案例:商城收银系统的设计变更过程

  • 商城收银系统期初的设计
  • 混合策略的设计与实现
  • 多层装饰者的设计与实现

重新理解里氏替换原则

  • 透明的功能扩展
  • 里氏替换原则

练习:商场收银系统的2种设计与实现

 

桥接模式的应用

案例:员工管理与工资发放的设计

  • 员工管理与工资发放带来的继承泛滥问题
  • 采用桥接模式的设计与实现

案例:查询支持类的设计

  • 查询支持类遭遇的继承泛滥问题
  • 查询支持类的解决方案
  • 单例模式下查询支持类的设计

深入体会单一职责原则

 

 

汇款、微信转帐

 

汇款信息:

单位名称:北京市海淀区中科院计算所职业技能培训学校

开户行:工行海淀西区支行

账号:0200 0045 1920 0043 667

开户银行代码:1021 0000 0458

 

微信转账:

    步骤一:打开微信,扫描二微码付款时,点击打开微信右下角里的“发现”,在列表界面有一个“扫一扫”选项,点击打开“扫一扫”(如下图):

    步骤二:点击打开“扫一扫”后,会出现一个扫描框,将中科院计算所培训中心二维码/条码放入框内,即可自动扫描,并显示支付信息,输入付款金额。

                                                                                                        

    (中科院计算所培训中心二维码)

 

    步骤三:点击 “添加付款备注”,填写付款人姓名和单位全称,所有信息核对无误后,点击“确认付款”,完成支付。

 

                

 

  • 注意:步骤三是为了尽快确认您的培训费用是否到帐,方便为您查帐,所以一定要把付款人姓名和单位名称填写完整,如果姓名和单位名称超过20个汉字,单位名称可以填写简称。

京公网安备 11010802025851号

 京ICP备14030124号-1  

QQ咨询

免费电话

010-82661221

微信咨询

微信客服

在线报名

返回顶部