深入实践DDD:以DSL驱动复杂软件开发
新华书店全新正版书籍图书 保证_可开发票_极速发货支持7天无理由
¥
74.5
7.5折
¥
99
全新
库存2件
作者杨捷锋
出版社机械工业出版社
ISBN9787111677710
出版时间2021-04
装帧平装
开本16开
定价99元
货号31125570
上书时间2024-10-19
商品详情
- 品相描述:全新
- 商品描述
-
作者简介
杨捷锋,曾就职于南开戈德集团、普天集团、通路快建等公司。曾作为独立技术顾问为海尔集团、沈阳飞机工业集团、上广电NEC、天马微电子等企业提供软件开发与技术咨询服务。目前在一家电商创业公司担任技术负责人。有多个大型企业应用软件的分析建模经验,以及大型开发框架(ORM、IoC等)的架构经验。多年来一直未脱离软件开发一线工作,近年来自认为对软件系统分析、数据建模、领域驱动设计、项目管理略有心得。
目录
前 言<br/>第一部分 概念<br/>第1章 DDD 的关键概念 2<br/>1.1 自顶而下、逐步求精 3<br/>1.1.1 DDD开创全新分析流派 3<br/>1.1.2 什么是软件的核心复杂性 4<br/>1.2 什么是领域模型 4<br/>1.3 战术层面的关键概念 6<br/>1.3.1 实体 6<br/>1.3.2 值对象 6<br/>1.3.3 聚合与聚合根、聚合内部实体 7<br/>1.3.4 聚合的整体与局部 9<br/>1.3.5 聚合是数据修改的单元 9<br/>1.3.6 聚合分析是“拆分”的基础 10<br/>1.3.7 服务 12<br/>1.4 战略层面的关键概念 13<br/>1.4.1 限界上下文 13<br/>1.4.2 限界上下文与微服务 14<br/>1.4.3 防腐层 15<br/>1.4.4 统一语言 18<br/>1.5 ER 模型、OO模型和关系模型 19<br/>1.6 概念建模与模型范式 21<br/>第2章 其他DDD相关概念 22<br/>2.1 领域 ID 22<br/>2.1.1 自然键与代理键 23<br/>2.1.2 DDD 实体的 ID 需要被最终用户看到 23<br/>2.1.3 什么时候使用代理键 24<br/>2.2 ID、Local ID 与 Global ID 26<br/>2.3 命令、事件与状态 27<br/>第3章 CQRS 与 Event Sourcing 29<br/>3.1 命令查询职责分离 29<br/>3.2 事件溯源 32<br/>3.3 From-Thru 模式 33<br/>3.3.1 示例:ProductPrice 33<br/>3.3.2 示例:PartyRelationship 35<br/>3.4 CQRS、ES 与流处理 36<br/>第二部分 设计<br/>第4章 DDD 的 DSL是什么 40<br/>4.1 为什么 DDD 需要 DSL 41<br/>4.1.1 为什么实现 DDD 那么难 41<br/>4.1.2 搞定 DDD 的“锤子”在哪里 42<br/>4.2 需要什么样的 DSL 43<br/>4.2.1 在“信仰”上保持中立 44<br/>4.2.2 DDD 原生 45<br/>4.2.3 在复杂和简单中平衡 46<br/>4.2.4 通过 DSL 重塑软件开发过程 48<br/>4.3 DDDML——DDD 的 DSL 48<br/>4.3.1 DDDML 的词汇表 49<br/>4.3.2 DDDML 的 Schema 51<br/>4.4 DDDML 示例:Car 52<br/>4.4.1 “对象”的名称在哪里 55<br/>4.4.2 使用两种命名风格:camelCase 与 PascalCase 55<br/>4.4.3 为何引入关键字 itemType 56<br/>第5章 限界上下文 57<br/>5.1 DDDML 文档的根结点下有什么 57<br/>5.2 限界上下文的配置 59<br/>5.3 名称空间 62<br/>5.3.1 再谈 PascalCase 命名风格 62<br/>5.3.2 注意两个字母的首字母缩写词 63<br/>5.4 关于模块 64<br/>第6章 值对象 67<br/>6.1 领域基础类型 68<br/>6.1.1 例子:从 OFBiz 借鉴过来的类型系统 70<br/>6.1.2 例子:任务的触发器 73<br/>6.2 数据值对象 75<br/>6.3 枚举对象 76<br/>第7章 聚合与实体 79<br/>7.1 用同一个结点描述聚合及聚合根 79<br/>7.2 实体之间只有一种基本关系 82<br/>7.3 关于实体的 ID 85<br/>7.4 不变的实体 89<br/>7.5 动态对象 90<br/>7.6 继承与多态 92<br/>7.6.1 使用关键字 inheritedFrom 94<br/>7.6.2 超对象 95<br/>7.7 引用 97<br/>7.7.1 定义实体的引用 97<br/>7.7.2 属性的类型与引用类型 101<br/>7.8 基本属性与派生属性 102<br/>7.8.1 类型为实体集合的派生属性 103<br/>7.8.2 类型为值对象的派生属性 106<br/>7.9 约束 107<br/>7.9.1 在实体层面的约束 107<br/>7.9.2 在属性层面的约束 109<br/>7.10 提供扩展点 110<br/>第8章 超越数据模型 112<br/>8.1 实体的方法 112<br/>8.1.1 聚合根的方法 115<br/>8.1.2 非聚合根实体的方法 116<br/>8.1.3 属性的命令 117<br/>8.1.4 命令 ID 与请求者 ID 119<br/>8.2 记录业务逻辑 119<br/>8.2.1 关于 accountingQuantityTypes 120<br/>8.2.2 关于 derivationLogic 120<br/>8.2.3 关于 filter 121<br/>8.2.4 使用关键字referenceFilter 121<br/>8.2.5 业务逻辑代码中的变量 122<br/>8.2.6 说说区块链 123<br/>8.3 领域服务 123<br/>8.4 在方法定义中使用关键字 inheritedFrom 125<br/>8.5 方法的安全性 126<br/>第9章 模式 128<br/>9.1 账务模式 128<br/>9.2 状态机模式 132<br/>9.3 树结构模式 137<br/>9.3.1 简单的树 137<br/>9.3.2 使用关键字structureType 138<br/>9.3.3 使用关键字structureTypeFilter 139<br/>第三部分 实践<br/>第10章 处理限界上下文与值对象 142<br/>10.1 项目文件 143<br/>10.2 处理值对象 144<br/>10.2.1 一个需要处理的数据值对象示例 145<br/>10.2.2 使用 Hibernate 存储数据值对象 146<br/>10.2.3 处理值对象的集合 149<br/>10.2.4 在 URL 中使用数据值对象 151<br/>10.2.5 处理领域基础类型 153<br/>第11章 处理聚合与实体 161<br/>11.1 生成聚合的代码 162<br/>11.1.1 接口 163<br/>11.1.2 代码中的命名问题 178<br/>11.1.3 接口的实现 179<br/>11.1.4 事件存储与持久化 207<br/>11.1.5 使用 Validation 框架 218<br/>11.1.6 保证静态方法与模型同步更新 220<br/>11.1.7 不使用事件溯源 222<br/>11.2 Override 聚合对象的方法 223<br/>11.3 处理继承 225<br/>11.3.1 TPCH 226<br/>11.3.2 TPCC 227<br/>11.3.3 TPS 228<br/>11.4 处理模式 229<br/>11.4.1 处理账务模式 229<br/>11.4.2 处理状态机模式 234<br/>第12章 处理领域服务 238<br/>12.1 处理数据的一致性 239<br/>12.1.1 使用数据库事务实现一致性 240<br/>12.1.2 使用 Saga 实现最终一致性 241<br/>12.2 发布与处理领域事件 243<br/>12.2.1 编写 DDDML 文档 243<br/>12.2.2 生成的事件发布代码 245<br/>12.2.3 编写生产端聚合的业务逻辑 253<br/>12.2.4 实现消费端领域事件的处理 254<br/>12.3 支持基于编制的 Saga 255<br/>12.3.1 编写 DDDML 文档 255<br/>12.3.2 生成的 Saga 命令处理代码 261<br/>12.3.3 需要我们编写的 Saga 代码 268<br/>12.3.4 需要我们实现的实体方法 273<br/>第13章 RESTful API 276<br/>13.1 RESTful API 的最佳实践 276<br/>13.1.1 没有必要绞尽脑汁地寻找名词 277<br/>13.1.2 尽可能使用 HTTP作为封包 277<br/>13.1.3 异常处理 279<br/>13.2 聚合的 RESTful API 280<br/>13.2.1 GET 280<br/>13.2.2 PUT 291<br/>13.2.3 PATCH 293<br/>13.2.4 DELETE 295<br/>13.2.5 POST 295<br/>13.2.6 事件溯源 API 296<br/>13.2.7 树的查询接口 297<br/>13.3 服务的 RESTful API 297<br/>13.4 身份与访问管理 299<br/>13.4.1 获取 OAuth 2.0 Bearer Token 299<br/>13.4.2 在资源服务器上处理授权 301<br/>13.5 生成 Client SDK 302<br/>13.5.1 创建聚合实例 303<br/>13.5.2 更新聚合实例 304<br/>13.5.3 使用 Retrofit2 306<br/>第14章 直达 UI 308<br/>14.1 两条路线的斗争 309<br/>14.1.1 前端“知道”领域模型 309<br/>14.1.2 前端“只知道”RESTful API 312<br/>14.2 生成 Admin UI 312<br/>14.2.1 使用 referenceFilter 313<br/>14.2.2 展示派生的实体集合属性 315<br/>14.2.3 使用属性层面的约束 316<br/>14.2.4 使用 UI 层元数据 317<br/>14.2.5 构建更实时的应用 318<br/>第四部分 建模漫谈与 DDD 随想<br/>第15章 找回敏捷的软件设计 322<br/>15.1 重构不是万能灵药 323<br/>15.2 数据建模示例:订单的装运与支付 324<br/>15.2.1 订单与订单行项 325<br/>15.2.2 订单与订单装运组 327<br/>15.2.3 订单与装运单 328<br/>15.2.4 订单的项目发货 329<br/>15.2.5 订单的支付 330<br/>15.3 中台是一个轮回 332<br/>15.4 实例化需求与行为驱动测试 334<br/>15.4.1 什么是实例化需求 334<br/>15.4.2 BDD 工具 335<br/>15.4.3 BDD 工具应与 DDD 相得益彰 336<br/>15.4.4 不要在验收测试中使用固件数据 336<br/>15.4.5 制造“制造数据”的工具 337<br/>15.5 要领域模型驱动,不要 UI 驱动 345<br/>15.6 不要用“我”的视角设计核心模型 346<br/>15.6.1 让 User 消失 347<br/>15.6.2 认识一下 Party 348<br/>15.7 我们想要的敏捷设计 350<br/>第16章 说说 SaaS 351<br/>16.1 何为 SaaS 351<br/>16.2 多租户技术 352<br/>16.3 构建成功的 SaaS 有何难 353<br/>16.3.1 多租户系统的构建成本 353<br/>16.3.2 难以满足的定制化需求 353<br/>16.3.3 负重前行的传统软件公司 355<br/>16.4 SaaS 需要 DDD 355<br/>第17章 更好的“锤子” 356<br/>17.1 我们制作的一个 DDDML GUI 工具 357<br/>17.1.1 给领域建模提供起点 357<br/>17.1.2 创建新的限界上下文 358<br/>17.1.3 从 OFBiz 中“借鉴”数据模型 359<br/>17.1.4 构建项目并运行应用 361<br/>17.1.5 使用 HTTP PUT 方法创建实体 362<br/>17.1.6 给聚合增加方法 363<br/>17.1.7 生成限界上下文的Demo Admin UI 368<br/>17.1.8 让不同层级的开发人员各尽其能 369<br/>17.2 以统一语言建模 370<br/>附录 DDDML 示例与缩写表 373
内容摘要
本书是拥有二十年商业软件开发经验及十年技术管理经验的资深技术专家呕心沥血之作,也是目前市场上少有的阐述如何通过使用领域专用语言(DSL)实现领域驱动设计(DDD)的图书。<br>书中首先带领读者重温DDD在战术设计层面及战略设计层面上的部分重要概念,并简要介绍了自DDD社区兴起的一些软件架构模式。然后阐述如何设计一门DDD原生的DSL,包括这个DSL的规范支持哪些特性、如何帮助团队描述领域模型的方方面面、这些特性的选择基于何种考量等。然后在此基础上详细讲解了如何使用技术工具将描述领域模型的DSL文档直接转化为可以工作的软件代码,在这个过程中结合诸多来自商业软件开发工作中的真实案例,展示并分析了大量的关键代码,让读者可以深入地了解制造那些基于DSL的DDD技术工具的秘密。之后讲述了一些建模案例,并探讨了一些与DDD相关的其他话题,对读者开拓技术思维、更深刻地理解DDD有所助益。
— 没有更多了 —
以下为对购买帮助不大的评价