八年实战经验,解读DDD思想内核
怎样让模型更接近业务的本质?DDD 提供了一些方法和辅助工具:
- 让领域专家参与建模(对这个业务最了解的人)
- 建立统一语言(Ubiquitous Language),消除认知差异
- 用业务行为来描述接口,不要用技术概念。以账户为例,开户、销户、冻结、解冻、修改注册信息、修改支付限额等都是业务行为,增删改查就属于技术概念
- 使用充血模型
- 使用 DP(Domain Primitive)而不是语言的基本类型。例如电话号码不要用 String 而用 PhoneNumber
- 还有一些建模方法做为辅助:四色建模法、事件风暴等
这些方法有些听起来挺抽象,但只要回归到原点:让模型尽量还原业务,你就不会再纠结于这些概念。
代码边界的处理:
- 通过依赖倒置,从而避免技术细节影响业务逻辑,如引入 repository 层来解决
- 定义业务上下文边界,即限界上下文。这有两种方式,一种防腐层(ACL:Anticorruption Layer),隔离两个服务,通过 RPC 或者 MQ 等机制进行服务间通信。另一种是共享内核(Shared Kernel),将两个服务相同部分抽取出来,但是容易出现共享内核变动引得两个服务都变动。
分类的处理
- 参与者角度划分。用户、研发、财务、客服对于订单的看法是不同的。
- 模型角度划分。基于类图(服务、实体、值对象)等,从而容易获得高内聚低耦合。
- 风险隔离角度。
- 组织架构角度。
难住了…一个从工作中抽象出来的算法题
题目是这样的:给定多个已经排序好的数组(从小到大),在每个数组中挑选一个数字,计算这些数字的方差。请找出方差最小的数字组合(可能有多个),并输出方差。举例:[1,3,4,6,7,100 ][28,50,70,102 ][14,76,98 ] 选择的数字组合应该是 100,102,98。方差是 2.67,要求性能尽可能的高,避免暴力穷举。
看着最不错的是:先合并有序数组,O(N),同时纪录合并后有序数组的源数组的 index(染色);然后开始滑动窗口,使得窗口内染色数等于数组数,滑的时候更新方差。
多线程读写锁产生死锁的故障解决方案
Golang RLock 不支持重入导致协程泄露
节省 90% 存储!源码级揭秘腾讯云 ES 向量搜索的优化之道
大模型Prompt技巧全解析
DeepSeek
Title Unavailable | Site Unreachable
AI 框架
Cursor
GitHub 等地方有很多开源的 Cursor 的 rulefiles。但是有些黑客会在 rulefiles 中配置 unicode 不可见字符,从而进行配置文件投毒。下载导入也是直接放入到隐藏文件夹下,因此很少会去判断文件是否可信。进而在生成的代码中可能出现不合理的代码逻辑。