一句话检查版 · 命名语义守恒清单
如果一个方法名无法回答:是谁在做、是否同步、是否改状态、是否跨系统——那这个命名一定有问题。
一句话检查版 · 命名语义守恒清单
总原则(最重要的一句)
方法名必须在“不看实现”的前提下,准确暴露:是否同步、是否有副作用、是否跨系统、是否改变状态。
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,是在决定『能不能做』,还是在判断『规则对不对』?”
终极一句话(命名自检版)
如果一个方法名无法回答:是谁在做、是否同步、是否改状态、是否跨系统——那这个命名一定有问题。