结盟众多企业“教练”, 共同设计、开发及提供人才培养解决方案,通过新颖多样的学习方式,针对性的定制化内容,助力企业全面提升竞争优势。
Bruce Zhang
2天
5200元
课程亮点:
1、全真案例,借助案例与设计模式知识的原理,借助最佳实践,帮助您提高设计能力,从而提高开发效率和设计质量
2、以新视角,揭示模式的本质、思想方法,剖析出模式之“道”,跳出“为模式而模式”的“陷阱”
3、提升设计能力,使开发人员由“编程小工”到设计专家
4、提出场景驱动设计,利用领域建模、职责驱动、扩展式设计以及重构,提高软件设计质量,实现卓越软件设计
5、关注业界内设计模式,以实战训练驱动对面向对象设计的理解与运用
在课程中要逐一解决的问题:
1、员工无法接手遗留系统,原因是代码杂乱,可读性差
2、团队成员没有设计模式知识与经验,无法实施敏捷开发
3、系统难以重构,不利于产品的重用与二次开发
4、开发效率得不到保障,因为详细设计人员不能理解架构文档与详细设计方案
5、设计方案难于应对需求变更
6、设计的系统架构缺乏可扩展性、可维护性和可测试性,不能合理地重用
7、架构、设计、开发三个环节中各个角色不能理解设计意图,很难沟通
课程大纲:
主题 | 内容 |
---|---|
卓越软件设计的特征 |
1、体现简单之美的设计方案 2、可重用的对象与组件 3、支持良好的可扩展性 4、充分的测试覆盖率 5、可读性高的代码; 6、案例:分析邮件服务器代码暴露的问题,在可重用性、代码可维护性、可扩展性等诸多方面着手,剖析代码坏味道。 |
面向对象的设计要素 |
1、合理封装的要点 分析EISaaS项目中参数元数据处理的代码,体现合理封装的重要性,并通过示范重构手法改善代码的质量; 2、继承与委派的区别 分析继承与委派各自的优缺点,说明在何种场景下选择继承和委派。通过分析JDBC DBDriver的设计,进一步了解继承与委派的区别。 3、多态与抽象 解释抽象与多态的本质,分析在何种情况下应该使用多态; 分析TrainRoute代码,了解代码在需求扩展方面的不足,并通过示范重构的手法改进设计; |
UML简述 |
1、UML在面向对象设计中的作用 2、常用的UML图,包括用例图、类图、时序图、状态图、活动图与组件图 3、案例分析:休假跟踪系统的设计,介绍如何运用UML对系统进行设计 |
面向对象设计核心的SOLID原则 |
1、单一职责原则(SRP):该原则是合理封装对象,分配职责的重要原则; 2、开放封闭原则(OCP):该原则体现了扩展式开发的核心思想; 3、Liskov替换原则(LSP):可以将该原则视为是对是否正确运用继承的检验标准; 4、接口隔离原则(ISP):对于接口的粒度进行规划,以便于设计出更好的接口; 5、依赖倒置原则(DCP):对于依赖和解耦的分析,利用抽象保证设计的可扩展性; 案例分析:数据引擎的设计 |
JUnit框架分析 |
通过全面剖析JUnit测试框架,了解大师的设计艺术,展现JUnit是如何保证框架的简单、可扩展、可重用。内容包括: 1、JUnit的组件结构 2、JUnit的Test Case设计 3、如何支持Test Result显示的扩展 4、JUnit中如何通过复杂的设计来简化用户的使用 |
职责驱动设计 |
1、职责的层次 包括职责层次的识别、职责层次与软件架构层次之间的关系、职责与概念、规约与实现 2、案例分析: 再次对邮件服务器进行分析,通过分辨职责层次,来改善设计。并提出需求变更,从而引入对观察者模式、策略模式、简单工厂模式、调停者模式与职责链模式的对比与分析; 3、实战演练:设计一个作业调度框架,它能够根据指定的时间触发作业,执行自定义任务。 4、对象的角色 角色、职责与协作是三位一体的关系,角色是发起职责的对象,职责则应该是对象之间的协作。不同角色的对象,履行的职责是不同的。对象的角色包括:信息持有者、构造者、服务提供者、协调者、控制者。 案例分析: 处理HTTP请求与应答,体现信息持有者角色; JMS对Queue的创建体现构造者角色; 税务报告的生成体现服务提供者角色; 服务定位器体现协调者角色; 内容验证器体现控制者角色; 5、模块级的职责分配 如何根据职责对模块进行分解,了解高内聚、松耦合原则。通过实际案例分析错误的职责分配,解决循环依赖问题,遵循包的复用原则; 案例分析:分析eBay的架构;根据对某大型系统架构的演进,提出模块重用的方式; |
职责分配遵循的原则与模式 |
1、再次分析单一职责原则:分析该原则的核心思想,关注对象的变化点; 案例分析:功能引擎中对功能对象的加载,如何体现职责分离带来的好处;通过对案例分析引入Proxy模式; 2、专家模式:专家模式的核心思想是信息的持有者是操作该信息的专家; 案例分析:对JBehave编写的系统进行分析,运用专家模式识别代码存在的问题,利用前面提到的重构手法改进设计; 3、自治对象:分析了自治对象的特征,分别包括:最小完备,稳定空间,自我履行与独立进化。 案例分析:用户状态机,给出了报税系统中复杂的用户状态迁移,体现的复杂授权、登录等业务逻辑,并由此引入State模式来简化设计,体现自治对象的特征。 |
软件的可重用性 |
1、分析出现重复代码的原因 2、设计应遵循DRY原则,以避免重复 3、保证对象乃至组件的合理粒度,并关注对象之间的解耦 4、从方法级避免代码的重复 5、通过提取共性特征从类级避免代码重复 6、利用用例来识别可能重复的功能 7、模块或组件级别的重用 8、利用微服务实现服务级别的重用 9、案例分析:权限管理系统的设计、日志系统的设计、大型金融系统的模块分解与重用、使用Dropwizard设计微服务 |
应用框架设计 |
1、应用框架概述 2、确定应用框架的目标 3、应用框架API的设计 4、对框架整体架构的思考与设计 5、案例分析:自行设计的轻量级IoC容器Melt |
如何应对需求的变化 |
1、抽象的关键在于寻找多个对象(或行为)具有的共同特征,并对特性进行泛化。 案例分析:项目管理模型的抽象,通过对多种项目管理过程进行分析,对各种模型概念进行分类,并抽象出模型的共同特征,从而简化模型; 2、识别变化点,对变化进行封装。常见的变化点包括业务规则、算法策略、外部服务、硬件支持、命令请求、协议标准、数据格式、业务流程、系统配置、界面表现; 案例分析:电子商务系统的票据业务规则,引入规格模式;CIMS系统的机器加载策略,引入策略模式;短信服务,引入外观模式与适配器模式;人力资源系统考勤模块,介绍入口模式; 3、解耦具体依赖 介绍常见的解除具体依赖的方法,包括表驱动法、配置与反射、IoC容器、惯例优于配置。 |
扩展式设计 |
1、扩展式设计的过程 扩展式设计分为三个步骤,分别为:分离职责各司其职,利用抽象统一接口,引用接口预留空白。扩展式设计可以有效地保证整个系统的可扩展性。 2、实战演练:订单处理,通过三次迭代逐步改进原有设计,并分别遵循专家模式、分离原则与扩展式设计,保证设计在修改最小的前提下满足需求变化。在设计演进中,讨论对设计模式的合理运用,并引入规格模式; 3、案例分析:配置管理框架的设计,该框架能够支持配置信息的多种存储形态,包括文件、数据库、LDAP等;支持多种获取配置的方式,如Web服务,REST服务。配置管理框架的接口需要保证其统一性和一致性,同时在满足可扩展要求下,提供接口的易用性。 4、案例分析:消息队列规范的设计。通过分析JMS、MSMQ、RabbitMQ和NServiceBus的设计,理解抽象的含义,例如理解面向接口设计、接口隔离原则、按意图设计、外观模式与企业集成模式。 5、实战演练:CIMS基于消息的分布式架构。通过对服务的统一抽象,以及对消息处理的职责分配,建立一个协作合理的分布式架构。设计过程中会引入命令模式、发布者-订阅者模式、消息总线模式、消息转换器模式、查询模式。 |
场景驱动设计概述 |
1、场景的目标层次 (1)概要目标:系统层次的场景划分,每个概要目标可对应子系统的需求目标。通过概要目标引入领域驱动设计的Unbounded Context。 (2)用户目标:业务层次的场景划分,每个用户目标对应各个子系统所提供的业务价值,并以服务的形式暴露给调用者。 (3)子功能:功能层次的场景划分,每个子功能都对应于业务功能,并以领域对象或横切关注点的方式,由服务调用。 (4)案例分析:电子商务系统的场景目标划分,以层次模型的方式表现场景。 2、场景的6W模型 (1)6W的内容:分别为who(对应于角色)、why(对应于业务价值)、when(对应于对象的协作)、what(对应于业务功能)、where(对应于场景边界)和hoW(对应于业务实现); (2)6W模型的设计驱动力:6W模型的关键是在场景边界内,通过场景识别出角色,再以角色为设计入口,运用职责的层次模型识别出业务价值、业务功能和业务实现,从而根据职责模型获得领域模型,再通过时序图,处理对象之间的协作关系,进一步精炼出更为准确的领域模型。 |
场景驱动设计过程与实战 |
1、场景驱动设计与风险识别的关系 2、场景驱动设计对职责分配与扩展设计的要求 3、场景驱动设计的过程 4、场景驱动设计演练: 民航通信码识别系统:运用场景驱动设计的过程对该系统进行设计,其中会用到领域驱动设计中的建模方法,并通过识别坏味道,运用之前讲到的重构手法对设计进行改善。 |