打开网易新闻 查看精彩图片

每个程序员都见过那种代码:500行的函数里,SQL语句、错误处理、业务逻辑和API调用像打翻的乐高混在一起。你想重构,把关注点拆开——这想法没错。但网上教程教你的那个"标准答案",正在制造另一种灾难。

这就是Repository模式。初衷很简单:把业务逻辑和数据层隔开。Martin Fowler的原话是,用「一个类似集合的接口,在领域层和数据映射层之间进行协调」。听起来优雅,抄作业的人抄歪了。

打开网易新闻 查看精彩图片

歪在哪?接口定义的位置。常见做法是按表建一个巨型接口,把所有可能用到的数据库方法塞进去——GetUser、DeleteUser、50个边缘场景的查询方法。这个文件变成全公司服务的垃圾填埋场,谁需要新方法就往里扔。

作者管这叫"生产者定义接口":写数据库层的人决定提供什么,用的人只能被动接受。结果是接口膨胀、依赖混乱、测试时想Mock都得拖进一整头大象。

打开网易新闻 查看精彩图片

解法是倒过来:消费者定义接口。需要查询用户生日的那个服务,自己声明一个只有GetUserBirthdayByID的精简接口。数据库层去实现它。接口变小了,依赖干净了,测试时Mock两行代码搞定。这才是Fowler说的"类似集合"——不是超市仓库,是你家抽屉,只放你需要的东西。

一位读者在评论区说,他们团队把巨型接口拆成消费者定义的接口后,单元测试的Mock代码从200行降到了15行。