<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>读书笔记 on 追风笔记</title><link>https://88ok.github.io/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/</link><description>Recent content in 读书笔记 on 追风笔记</description><generator>Hugo</generator><language>zh</language><lastBuildDate>Tue, 14 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://88ok.github.io/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml"/><item><title>《领域驱动设计》读书笔记</title><link>https://88ok.github.io/blog/reading-notes-ddd/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><guid>https://88ok.github.io/blog/reading-notes-ddd/</guid><description>&lt;p&gt;这本书我读过三遍。第一遍在工作两年时，只记住了实体、值对象、聚合这几个名词；第二遍在做核心重构时，才发现前面几章才是重点；第三遍是带团队时读的，读出来的东西又不一样。&lt;/p&gt;&#10;&lt;h2 id="这本书真正的价值"&gt;这本书真正的价值&#10;&lt;/h2&gt;&#10;&lt;p&gt;大部分人把它当模式手册用，翻到&amp;quot;聚合&amp;quot;那一节抄个定义就开始设计。但 Evans 花了整本书篇幅想说的其实是一件事：&lt;strong&gt;软件设计的瓶颈是知识，不是技术&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;模型不是画出来的，是在和业务专家反复对话中&amp;quot;长&amp;quot;出来的。书里那些模式只是长出来之后用于表达的工具。工具本身不产生知识。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;一个团队如果没有和业务专家持续对话的机制，那么它用不用 DDD 的模式都无所谓——反正模型里没有真正的领域知识。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="我划重点的三处"&gt;我划重点的三处&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;第一是统一语言。&lt;/strong&gt; 这是全书性价比最高的概念，也最容易被跳过。如果业务方说&amp;quot;客户&amp;quot;指的是签约主体，而代码里的 &lt;code&gt;Customer&lt;/code&gt; 指的是自然人，那么所有后续设计都建立在一个错位的基础上。我们后来的做法很土：维护一份术语表，中英文对照，明确写出每个词的边界和不包含什么。上线一年下来，它减少的沟通成本比任何架构决策都多。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;第二是模型驱动设计的&amp;quot;绑定&amp;quot;要求。&lt;/strong&gt; 书里强调模型和实现必须绑死——模型改了代码就得改，代码改了模型文档也得改。做不到这一点，模型就退化成挂在墙上的装饰。这也是为什么我不再维护单独的模型图，而是让代码本身成为模型的唯一表达：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-04f985f8-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="java" data-td-line-count="10"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-04f985f8-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 反例：技术化命名，业务方看不懂，术语在翻译中丢失&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RuleProcessor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BigDecimal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BigDecimal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;amt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BigDecimal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 正例：类名与方法名直接采用统一语言中的业务术语&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// accrual（计提）不简化成 calc，basis（计息基础）不省略&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InterestAccrualRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Money&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;accrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DailyBalance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DayCountBasis&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;basis&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&lt;strong&gt;第三是&amp;quot;深层模型&amp;quot;和重构的关系。&lt;/strong&gt; 书里说好模型需要经历多次突破，而突破往往来自某次对业务的重新理解。这一点我深有体会：我们的账务模型是在第三次重写时才想清楚&amp;quot;分录是第一公民、交易只是外壳&amp;quot;，前两版都是围着交易类型打转。第一次就设计出好模型的期待本身就不现实。&lt;/p&gt;&#10;&lt;h2 id="读完之后我改了什么"&gt;读完之后我改了什么&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;需求评审改成建模会&lt;/strong&gt;。不再让业务方念文档，而是当场画概念、当场确认术语。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;术语表进代码仓库&lt;/strong&gt;。放在 &lt;code&gt;docs/glossary.md&lt;/code&gt;，跟代码一起评审，改术语要走 PR。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;不再追求完整套用模式&lt;/strong&gt;。战术模式里我们只常用值对象和聚合，事件溯源、CQRS 一律不用，除非有明确的读写比例失衡问题。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;接受模型会被重写&lt;/strong&gt;。第一版模型的目标是能跑并暴露问题，不是一次做对。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;如果只有两小时读这本书，我建议读第一部分和第三部分的第 8 章（突破），跳过所有模式定义。模式的定义随便搜一下都有，而&amp;quot;如何通过对话获得领域知识&amp;quot;这件事，只有认真读原文才能体会到。&lt;/p&gt;</description></item></channel></rss>