手把手教你落地 DDD
钟敬
Thoughtworks 首席咨询师、数字化转型与运营团队 DDD 负责人
19697 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
AIGC特别策划 (2讲)
结束语&结课测试 (2讲)
手把手教你落地 DDD
15
15
1.0x
00:00/00:00
登录|注册

22|泛化建模(上):领域知识更抽象怎么办?

你好,我是钟敬。
上节课,我们学习了“限定”技术。利用这个技术可以丰富模型的语义并简化关联。今天,我们要挑战领域建模中的另一个话题——泛化。
泛化是领域建模技能由初级水平迈向中、高级水平的门槛。也就是说,如果不懂泛化,那么你的领域建模水平就始终停留在中级以下。初步掌握了泛化,那么你的水平可能就能达到中级。把泛化玩得出神入化,那么大概就能达到高级水平了。
领域建模层面的泛化,大体上相当于面向对象设计中的继承和多态。如果你学习过“设计模式”的话,还记得刚开始的“痛苦”吗?其实,整本《设计模式》,无非是教你怎么灵活运用多态罢了。而在领域建模层面,与《设计模式》对应的就是《分析模式》。整本《分析模式》也无非是教你怎么成为使用泛化的高手。
我们现在要讲的内容,尽管达不到“分析模式”的高度,但是可以为你将来的学习打下基础,帮你在实际工作中解决一些相对复杂的问题了。
我安排了 5 节课的时间,带你分别由泛化的建模、泛化的数据库设计以及泛化的代码实现由浅入深地认识和理解泛化。
这节课会围绕着“在子项目上报工时”这个需求来展开讨论,演示泛化的建模方法。还是老办法,我作项目经理,你作架构师。

项目和子项目的“泛化”

我先来回顾一下需求:我们把业务由“零零后公司”扩展到了“九零后公司”,而“九零后公司”会把项目进一步分为子项目,然后在子项目上报工时。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

领域建模中的泛化技术是本文的核心内容。通过讲解项目和子项目的“泛化”需求,展示了如何利用泛化进行建模。作者强调了泛化的重要性,并提供了对泛化关系的多种解释和理解方式。文章还涉及了隐式概念的显式化,以及领域建模中常见的现象。读者可以通过本文初步了解泛化技术在领域建模中的应用,为进一步学习和实际工作中的问题解决打下基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手教你落地 DDD》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • 阿昕
    思考题,学习时间和管理时间虽然也可以进行分类,但是两者已经是原子属性了,没有必要进行抽象,所以不构成泛化关系

    作者回复: 是的

    2023-02-08归属地:浙江
    9
  • 子衿
    1. 因为学习时间和管理时间,只有共性没有个性部分,所以不必泛化

    作者回复: 这个理由也说得通

    2023-01-31归属地:浙江
    9
  • Geek_66158e
    问题一:因为从报工时的角度来看,已经不再关心普通工时项下的“个性”了,普通工时项这种“共性”对于报工时来说已经有意义的最小的粒度了。

    作者回复: 这个角度很棒

    2023-02-23归属地:浙江
    7
  • 6点无痛早起学习的和尚
    思考题 2:想到一个实际上的场景,但是拿捏不定是不是泛化 父类:账户项 子类:现金账户、备付金账户、待清算账户等等 每个账户项都有余额属性:可用余额、冻结余额

    作者回复: 您列出了共性,但没有列出个性。如果有个性(不同的属性,不同的算法等),可以考虑用泛化,否则就不要用泛化了。

    2023-02-15归属地:北京
    3
  • 赵晏龙
    老师你的总结是想引发粽子战争吗? 1. 粽子……不是,学习时间和管理时间在业务需求上没有需要泛化的必要,泛化则变成了过度设计。 2. 我现在满脑子粽子,等我缓缓

    作者回复: 幸亏没引起豆腐脑战争

    2023-02-14归属地:湖南
    2
    1
  • aoe
    思考题 1. 「学习时间」和「管理时间」所有属性都相同,添加一个新属性「类型」就可以进行区分 2. 封装第三方登录(微信、手机号、QQ);封装第三方支付(支付宝、微信、银联);封装不同等级用户提现时的手续费计算逻辑 其他想法 1.「工时记录」中需要新加一个属性「类别」,这样方便以后按类别查找记录(由泛化引发的一个坑) 2. 今天刚好读到《DDD》第 9 章,趁热打铁,又多理解了一点 3. 感觉「泛化」就像代码中的「接口」。写代码时「面向抽象编程」,建模时「面向抽象建模」。当一个程序员,不会「抽象」还真吃力啊! 4. 「直接“借用”系统中已经存在的机制,在短期内虽然达到了目的,但长期来看会导致概念混乱,这种做法是很多开发团队常见的错误」这是我们项目中的常态,开发一时爽,后来很多人走了…… 5. 明白了 Predicate(谓词/谓语) 在编程中的意思:谓词是指计算结果为「真」或「假」的函数,并且可以使用操作符(如 AND 和 OR)把它们连接起来以表达更复杂的规则。 —— 《领域驱动设计 软件核心复杂性应对之道》9.2.3 模式: SPECIFICATION 钟老师还提到了一本书:《离散数学》,里面的一阶谓词理论,就是说这个

    作者回复: 没毛病,继续努力!

    2023-02-01归属地:浙江
    1
  • Michael
    期待老师讲泛化的数据库设计和代码实现,有些时候我在做项目的时候也觉得应该有泛化,但是只体现在模型设计上,但是不懂怎么体现在数据库设计和代码实现上,导致很多想法就此打住。

    编辑回复: 泛化实现已经更新了,可以去看啦!

    2023-01-31归属地:陕西
    2
    1
  • 小5
    回答问题1:因为两者有共性但是没有业务上关注的差异性

    作者回复: 是这么个意思

    2023-01-31归属地:广东
    1
  • 刘毅
    钟老师您好,结合您前面讲的第5节中组织与组织类别的抽象过程以及java面向对象思想,我的理解如下,不知道是否正确。 值对象(个性)->实体(共性)与子实体(个性)->父实体(共性)两种机制都能够同时表现出不同实体间的共性和个性,两者主要的区别是个性部分在当前业务领域内是否复杂。 若个性部分在当前业务领域内比较复杂(具有自己的标识、属性或方法等),则可用子实体实现;若个性部分在当前业务领域中比较简单(如只是简单划分几个枚举值),则可用值对象实现。

    作者回复: 是的

    2023-12-21归属地:上海
    2
  • Geek1560
    工时项作为项目和子项目的泛化有点怪怪的,仅仅因为它们有个很小的相同点是工时就做这种抽象是不是不太合适?项目和子项目的大部分信息应该都是相同的,而不仅仅是工时

    作者回复: 项目和子项目作为工时项的共性,对于登记工时而言,是重要的。是否“很小”取决于主观的权衡。项目和子项目抽出更多的共性也是可以的,关键看用在哪里。有用就抽,否则没必要仅仅因为相似而抽。

    2023-10-26归属地:上海
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部