整洁架构下实体方法边界划分及条件逻辑归属问询
问题解答
第一部分:实体方法边界与createPost的归属
User实体的方法边界
User实体只应该封装与自身状态、核心行为直接相关的方法,比如createUser、deleteUser、updateUser、getUser这类操作User自身属性或生命周期的方法。它的职责是维护User的业务规则(比如密码格式校验、昵称唯一性),而不是处理其他实体的行为。
createPost等方法的归属
这类方法不应该放在User实体中,原因如下:
- 实体的单一职责:Post是独立业务实体,其创建、修改、删除属于自身的生命周期管理,应该由
Post实体负责。 - 解耦需求:如果把
createPost放在User里,会导致User和Post强耦合,后续修改Post的创建规则时,不得不改动User实体,违反开闭原则。
你提到的用例层逻辑是合理的,用例层的职责就是编排业务流程,把各实体的操作串起来:
- 输入:
userId、postContent - 执行流程:
- 调用
getUser(userId)校验用户存在性及头衔,不存在则抛出错误 - 评估用户权限(比如是否符合发帖要求),不满足则抛出错误
- 调用
post.create(userId, postContent)完成帖子创建,返回postId或错误
- 调用
- 输出:
postId或错误信息
这种方式下,User和Post实体各自专注自身职责,用例层负责协调,整体架构更清晰、易维护。
第二部分:验证/授权逻辑的放置位置
这类逻辑的放置,核心看是否属于全局核心业务规则:
- 核心业务规则必须放在实体层:如果"只有VIP用户能创建帖子"是所有业务场景都必须遵守的硬性规则,那应该把这个判断放在
Post.create方法中。这样所有调用Post创建的路径都必须遵守这个规则,避免出现规则遗漏或不一致的情况,比如:// Post实体中的create方法 function create(userId, userTitle, postContent) { if (userTitle !== 'vip-user') { throw new Error('仅VIP用户可创建帖子'); } // 执行帖子创建逻辑 return postId; } - 场景化的灵活规则放在用例层:如果某些特殊场景需要打破核心规则(比如管理员可以替普通用户发帖),或者不同场景有不同的权限要求,那这类场景化的判断应该放在用例层。比如用例层可以先判断当前操作者是否是管理员,再决定是否跳过VIP校验,调用Post创建方法。
简单来说:实体层守住不可动摇的核心业务底线,用例层负责适配不同业务场景的灵活规则,这样既保证了核心规则的一致性,又能应对业务场景的变化。
内容的提问来源于stack exchange,提问作者cozycoder
相关产品推荐
相关产品推荐

