重构和领域驱动开发课程
课程天数:2天
课程介绍
目前流行的过程式、无状态的J2EE/.Net/C++架构风格有设计简单、可快速上手的优势,但往往随着系统的复杂度越来越高,过程式的设计在系统的可扩展性、局部理解性方面遇到很大障碍,易于滑向“庞大而复杂的Service类”是其典型的特征。在这个背景下,如何理解并更好地使用面向对象技术变得越来越重要,模式、领域驱动设计和测试驱动开发可赋予架构师和开发人员解决这个问题的能力,使他们能够创建功能强大、健壮且可维护的系统。但是,如何在实际项目中充分发挥这些利器的潜力呢?本课程将领域驱动设计的思想精髓以及重构等技术融会贯通,并通过大量实例加以阐释,跨越了领域模型、数据库与UI层之间的障碍,展示了创建高质量的企业级应用架构的过程。
此外,软件开发往往大部分时候面对的是既有系统的二次开发,维护遗留系统。随着系统的不断升级,需要维护的遗留系统的代码也越来越多。在这个过程中,二次开发的工程师,往往会非常痛苦,会遇到添加新功能困难、修改bug困难,甚至不的不面对推翻之前的遗留系统,重新来过。导致开发效率极其低下,并且成本很高,系统很不稳定。所以重构也就在所难免。所有的软件系统将来都会变成遗留系统,并且都可能会遭遇性能越来越低下、稳定行越来越差等情况,因此软件开发人员不得不面对既有系统的各种问题,本课程正是告诉你如何重构既有的遗留系统, 如何重构代码,重构设计,重构架构。
课程收益
本课程注重实战,采用案例贯穿方式完成实践,收集了大量的真实案例,针对项目过程中技术人员常犯的错误进行了汇总,研讨,并最终形成培训教程。本次培训从程序员的编程思维开始讲解,通过大量的真实案例,涵盖了代码重构,设计重构,架构重构3个层次,详细地介绍了重构需要注意的要点以及难点,这些知识都是讲师十几年编程经验的总结。
培训对象
各类软件研发中心的软件设计师、架构师, 项目经理,技术总监,质量部门经理,开发人员,对领域驱动和重构技术怀有疑问和困惑,需要梳理解答的团队和个人,效果最佳。
课程大纲
第一单元:认识优秀的系统及劣质系统,建立重构意识
内容一:重构的优势与局限
• 重构的优势与局限
• 预先设计与重构
• 代码重构与系统重构的异同
• 逐渐演化的系统及其特点
内容二:什么是好的设计以及如何预先设计实现
• 什么是好的设计和衡量的手段
• 可伸缩性(Scalable)在用户的使用率、用户的数目增加很快的情况下保持合理的性能。
• 可扩展性(Extensibility)允许导入新技术/功能而不引起原有系统大的变化。
• 灵活性(Flexibility)修改或改进已投入运行的软件所需工作量的大小。
• 可维护性(maintainability):为满足用户新的要求,或当环境发生了变化或运行中发现了新的错误时,对一个已投入运行的软件进行相应诊断和修改所需工作量的大小。
• 可复用性(Reusability)
• 软件的变化分析---发现变化/封装变化/隔离变化
• 分析项目,如何预先设计,给我们哪些启示,我们可以学习到什么
第二单元:领域驱动设计方法
内容一:领域驱动设计概述
• 认识领域驱动设计的意义
• 面向对象的分析设计
• 技术框架的分层规划
• 类的策略和类型划分
• 领域模型和事务脚本
内容二:领域模型/对象(Domain Model/Object)
• 实用原则 —— 根据具体的需求选择相应的设计模式
• 领域驱动设计元素
• 实体、值对象、服务
• 模块、聚合、工厂、资源库
• 领域模型的生命周期
• 领域对象与持久层解耦
• 聚合及IOC的使用
内容三:领域模型驱动设计
• 使用规约与断言
• 明确的定义模型所应用的上下文
• 上下文映射及模块的边界管理
• 客户-供应商模式
• 防崩溃层设计
• 高内聚与独立方法模式
• 开放主机服务
内容四:一些设计原则
• 表意接口
• 无副作用函数
• 使用分解内聚单元来解耦
• 使用ESB/微服务解耦
• 命令与查询责任分离模式
• 抽象(Abstraction)、封装(Encapsulation)和信息隐藏(Information Hiding)
• 分而治之(Divide-And-Conquer)和模块化(modularization)
• 策略和实现的分离(Separation of Policy and Implementation)
• 接口和实现的分离(Separation of Interface and Implementation)
• 单一引用点(Single Point of Reference)
第三单元:领域驱动设计实战及案例分析
内容一:领域驱动设计实践(案例分析,订餐系统)
• 过程式设计的缺点
• 使用面向对象与POJO/PONO方法设计
• 以领域模型组织业务逻辑
• 用POLO实现领域模型
• 使用测试驱动开发方法
• 使用façade模式封装业务逻辑
内容二:领域驱动设计实践(案例分析,薪酬管理系统)
• 需求介绍及用例分析
• 如何避免过程式设计
• 策略模式(Strategy Pattern)介绍
• 抽象工厂模式(Abstract Factory Pattern)介绍
内容三:领域驱动设计实践(案例分析,便利店系统)
• 需求介绍及用例分析
• 如何发掘出领域对象
• 对象-属性建模的辨析
• 对象-对象关系建模的辨析
内容四:领域驱动设计实践(案例分析,某设备建模)
• 需求介绍及用例分析
• 从领域的角度分析出对象
• 如何设计出高可扩展的框架
内容五:领域驱动设计实践(案例分析,网上书店)
• 需求介绍及用例分析
• 快速理解领域驱动设计
第四单元:代码的坏味道以及应对的重构之道
内容一:重构关键—发现代码的坏味道
• 函数中的坏味道(平均长度、标识参数)
• 圈复杂度在项目中的实用价值
• “每个函数只做一件事”与“每个函数一个抽象层级”(程序员往往很难学会遵循这条规则,写出只停留于一个抽象层级上的函数)
• Switch-case语句——程序设计的万恶之源?
• 重复的代码/模块
• 可以根据客户现在的项目作为案例进行现场分析,找出相应的代码坏味道
内容二:某项目分析----重点了解现实项目代码的充斥大量坏味道
• 介绍项目需求情况,阅读现有代码指出代码坏症状
• 不看不知道,代码到底有多烂—触目惊心的代码
• 通过重构逐步改善代码质量
• 本案例学习多种重构方式
第五单元:重构实践
内容一:重构实践:面向对象
• 将过程化设计转化为对象设计,并讨论过程化设计与对象化设计的特点及历史博弈;并给出过程式设计及及对象设计的模式——合适的就是好的!
• 信息专家原则在重构的运用
• 封装值域/自封装值域的重构
• 以数据类取代记录的策略
• 以对象取代数组的策略
• 封装群集
• Data Class——纯粹的数据类
• 以State/Strategy取代型别码
• 通过案例介绍函数的重构
内容二:重构实践—复杂条件表达式重构
• 常见问题的求助
• 复杂条件表达式重构
• IF/Else语句的危害
• Switch语句的危害
• 分解/合并条件式
• 移除控制标记
• 高级技巧——IOC思想在简化复杂表达式方面的运用。
• 通过案例介绍如何重构面向过程代码到面向对象
内容三:重构实践—去除“大泥球”式的设计
• 过大的函数、模块、子系统
• 从系统设计的角度分析混乱产生的原因
• 很重要,但是总被忽略的基本功
• Feature Envy——依恋情结
• Data Clumps——数据泥团
• Message Chains——过度耦合的消息链
• 介绍实用,但经常被忽略的高级技巧!
• 通过案例介绍如何分解系统
内容四:重构实践—职责单一
• 一个模块完成一个职责——子模块位于同一个抽象层次
• 功能函数与逻辑函数的分离
• Divergent Change——发散的变化
• Shotgun Surgery——散弹枪式的修改
• 通过案例介绍如何重构面向过程代码到面向对象
内容五:重构实践—接口设计
• 技术接口与业务接口的设计与区别
• 接口的本质——抽象
• ISP——接口分离原则
• 内接口与外接口
• 普通接口与智能接口
• 通过案例介绍如何抽取及重构出合理的模块接口
内容六:重构实践—继承体系
• 以多态取代条件式——Replace Conditional with Polymorphism
• 提炼继承体系——Extract Hierarchy
• 李斯卡替换原则及其实践
• 在多态体系中,如何处理子条件不一致的情况——继承体系中的高级技巧。
• 通过案例介绍如何重构出合理的继承体系。
内容七:重构实践—继承 VS 组合
• 塑造模板函数——Form Template Method
• 以委托取代继承——Replace Inheritance with Delegation
• 以继承取代委托——Replace Delegation with Inheritance
• 组合 AND 继承辨析
• 父子关系与兄弟关系——类多态设计的高级技巧。
• 通过案例介绍如何在组合与继承间重构。
内容八:重构实践—多种情况的复杂组合
• 梳理并分解继承体系——Tease Apart Inheritance
• 如何处理让人疯狂的复杂分类?
• 用Strategy替换条件逻辑
• 用Bridge组合动态变化
• 用State替换状态改变条件语句
• 用Composite替换隐含树
• 用Command替换条件调度程序
• 重点学习案例的重构到模式的过程
• 如何处理动态变化的组合?——复杂组合设计的高级技巧
• “我的货物来源、构成、库房分配、条码特点、供应商都不一样,在系统中还有可能动态变化!如何处理”——通过案例介绍如何处理多种情况的复杂组合。
内容九:重构实践—建模的选择
• 以类取代型别码——Replace Type Code with Class
• 以子类取代型别码——Replace Type Code with Subclasses
• 以值域取代子类——Replace Subclass with Fields
• 建模为属性与建模为对象——系统建模中的微妙变化
• 案例分析:某超市系统中的建模实践。
内容十:重构实践—隔离关注面
• 替换算法——Substitute Algorithm
• 数据驱动法的运用及扩展讨论。
• 将领域和表述/显示分离——Separate Domain from Presentation
• 系统分层中的博弈——4种模型的辨析
• 案例分析:某金融系统的设计实践
第六单元:大型系统的演化及重构实践
内容一:大型系统的演化及核心技术
• 应用服务和数据服务分离
• 使用缓存改善数据库瓶颈
• 使用应用服务器集群和负载均衡避免运用服务器瓶颈
• 数据库读写分离
• 用CDN及分布式文件系统加速系统响应
• 分布式数据库系统及NoSQL运用
• 进行横向的业务拆分
• 分布式服务,打造自己的软件生态环境
内容二:案例分析—某互联网项目1架构重构及演化
• 项目背景以及相关需求
• 初始上线:当前的最佳策略
• 物理部署分离
• 数据库瓶颈的解决1:引入读写分离
• 系统开发框架的更迭
• 数据库瓶颈的解决2:引入搜索引擎
• 引入分布式文件系统
• 引入分布式缓存
• 引入分布式服务框架,服务拆分
• 引入分布式消息中间件
内容三:案例分析—某互联网项目2架构重构
• 项目背景以及相关需求
• 架构设计及重构中的多因素综合考虑及其影响
• 原有系统的不足分析
• 基础服务与运用服务的抽取与分离
• 通用平台设计及重构
• 系统中的集群及HA考虑
• 化繁为简、返璞归真