You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遵循单一职责原则实现服务下单接口的代码设计疑问

问题解答

1. 当前设计是否符合单一职责原则?

完全符合。Order类仅负责orders表的创建逻辑,聚焦主订单的下单与计费数据管理;OrderService类仅负责order_services表的创建逻辑,专注服务额外参数的存储。两者边界清晰,没有交叉操作不属于自身职责的数据库表,完全契合单一职责原则的核心——一个类只承担一项明确的职责。

2. 处理实体依赖的正确方式

在OrderService中先创建orders记录再创建自身是不合理的,这会让OrderService承担原本不属于它的主订单创建职责,打破单一职责边界,同时提升代码耦合度:后续主订单创建逻辑变更时,还需修改OrderService类,维护成本会大幅提升。

正确的做法是新建一个业务协调类,专门负责整合两个实体的创建流程,处理依赖关系与事务一致性。这个类的核心职责就是完成「用户购买服务」这一完整业务动作,示例代码如下:

// 业务协调类:负责编排主订单与服务参数的创建流程
class ServiceOrderCreator {
  private orderData: IOrder;
  private serviceParams: Omit<IOrderService, 'orderId'>;

  constructor(orderData: IOrder, serviceParams: Omit<IOrderService, 'orderId'>) {
    this.orderData = orderData;
    this.serviceParams = serviceParams;
  }

  async completePurchase(): Promise<{ order: any, serviceRecord: any }> {
    // 开启数据库事务,保证两个操作原子性:要么都成功,要么都回滚
    await DB.startTransaction();
    try {
      // 1. 创建主订单
      const order = new Order(this.orderData);
      const createdOrder = await order.create();

      // 2. 用主订单ID创建服务参数记录
      const orderService = new OrderService({
        ...this.serviceParams,
        orderId: createdOrder.id
      });
      const createdServiceRecord = await orderService.create();

      await DB.commitTransaction();
      return { order: createdOrder, serviceRecord: createdServiceRecord };
    } catch (error) {
      await DB.rollbackTransaction();
      throw error; // 抛出异常交由上层处理错误返回逻辑
    }
  }
}

在POST /api/orders/services接口的控制器中,你可以这样调用这个协调类:

// 接口处理示例
async function handleServiceOrder(req: Request, res: Response) {
  try {
    const { amount, methodId, attributeId, valueId } = req.body;
    const creator = new ServiceOrderCreator(
      { amount, methodId },
      { attributeId, valueId }
    );
    const result = await creator.completePurchase();
    res.status(201).json(result);
  } catch (err) {
    res.status(500).json({ error: '创建服务订单失败' });
  }
}

这种设计的优势

  • 坚守单一职责:Order与OrderService依然只负责各自表的操作,职责不越界;协调类仅负责业务流程编排与事务管理,职责明确。
  • 降低代码耦合:后续修改主订单或服务参数的逻辑时,只需修改对应类,不会影响其他模块。
  • 保障数据一致性:通过事务确保主订单与服务参数的创建操作原子化,避免出现数据不一致的异常情况。

内容的提问来源于stack exchange,提问作者No Name

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:40:16