用途:该技能面向采用 Tell Don't Ask 原则的领域驱动设计代码库,用于在不得不暴露 getter 时,通过命名显式标记「封装被破坏」,提醒使用者这是例外用法,并便于代码评审与静态分析发现。
主要能力:约定在领域模型(尤其是实体)的 getter 上添加 breachEncapsulationOf 前缀,例如 Java 的 public String breachEncapsulationOfName()、Kotlin 的 fun breachEncapsulationOfName(): String、TypeScript 的 breachEncapsulationOfName(): string、Python 的 def breach_encapsulation_of_name(self)、Go 的 BreachEncapsulationOfName、Rust 的 breach_encapsulation_of_name。资料给出的判断流程:若不需要 getter 就不要创建;若需要,则值对象可使用普通访问器(如 Money.amount()、UserId.value()),实体则使用 breachEncapsulationOf。
允许的使用场景:持久化层(仓储实现)、JSON/XML 序列化到 DTO、测试断言、调试与日志输出。
限制与反模式:在业务逻辑中使用该 getter 并结合 if 判断、在外部做计算、进行链式调用(违反迪米特法则)都属于应被警告的做法,应改为把行为交给对象本身(Tell 模式)或添加委托方法。
实现与检查建议:领域模型侧不提供 getName() 这类普通 getter,业务逻辑以方法形式提供(如 rename、hasName);可在静态分析中加入规则,检测 breachEncapsulationOf 后紧跟 if/switch、在领域层调用该前缀方法、以及领域模型中出现普通 get 前缀等情况。
相关技能:tell-dont-ask、law-of-demeter、first-class-collection、domain-building-blocks。语言别详细实现模式可参考 references/patterns.md。