一句话检查版 · 命名语义守恒清单

如果一个方法名无法回答:是谁在做、是否同步、是否改状态、是否跨系统——那这个命名一定有问题。


一句话检查版 · 命名语义守恒清单

总原则(最重要的一句)

方法名必须在“不看实现”的前提下,准确暴露:是否同步、是否有副作用、是否跨系统、是否改变状态。


Controller 层

Controller 只表达 HTTP 意图,不表达业务规则。

  • create / update / delete / get:仅用于 HTTP 语义

  • ❌ 不出现:sync / apply / validate / execute

  • 自检一句话:

    “这个方法名是否只说明我在提供一个 API?”


Application Service 层(你当前讨论的核心)

AppService 表达一个“用例(Use Case)”,允许编排、允许副作用。

  • syncXxx:同步执行一个完整用例

  • asyncXxx:异步触发用例(MQ / 线程池)

  • executeXxx / handleXxx:强调“这是一个用例入口”

  • applyXxx将外部/计算结果应用到本地状态

  • validateXxx用例级前置校验(组合规则)

自检一句话:

“这个方法名,能不能当成一条业务操作记录?”


Domain 层

Domain 只做“规则判断与状态演化”,不关心系统边界。

  • validateXxx纯业务不变量校验(无 IO)

  • checkXxx:轻量 / 局部条件判断

  • applyXxx状态转移(核心动词)

  • calculateXxx:纯计算

  • ❌ 不出现:sync / async / push / call

自检一句话:

“这个方法能不能在单元测试里无依赖运行?”


Infrastructure 层

Infra 只负责“怎么做”,不负责“做什么”。

  • callXxx / invokeXxx:远程调用

  • pushXxx / sendXxx:消息、第三方系统

  • fetchXxx / queryXxx:读外部数据

  • save / update:持久化

  • ❌ 不出现:apply / validate(业务含义)

自检一句话:

“这个方法失败,是否只代表技术失败,而非业务失败?”


validate 的最终统一规则(针对你刚才的疑问)

validate 只表示“校验”,但校验的层级不同,语义必须不同。

  • Controller:❌ 不用 validate

  • AppService.validateXxx
    → 用例级校验(是否允许执行)

  • Domain.validateXxx
    → 业务不变量校验(规则是否成立)

  • Infra:❌ 不用 validate,只返回结果或异常

一句话判断:

“这个 validate,是在决定『能不能做』,还是在判断『规则对不对』?”


终极一句话(命名自检版)

如果一个方法名无法回答:是谁在做、是否同步、是否改状态、是否跨系统——那这个命名一定有问题。