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

重构Angular+Node项目中多条件判断的冗长函数

重构多条件if-else的Angular/Node支付处理函数

我正在用Angular和Node开发项目,其中一个支付处理函数包含大量多条件if-else语句,代码复杂冗长。尝试过switch语句但没找到更佳方案,现有代码如下:

if (
  (
    !orderRequest.paymentProvider
    || orderRequest.paymentProvider === OrderRequestV2.PaymentProviderEnum.ADYEN
  )
  && orderRequest.paymentMethod === OrderRequestV2.PaymentMethodEnum.CREDITCARD
) {
  const mainPaymentInstruments = await this.pickPaymentInstruments(basket, constants.PAYMENT_METHODS.CREDIT_CARD, true);
  const giftCardPaymentInstruments = await this.pickPaymentInstruments(basket, constants.PAYMENT_METHODS.GIFT_CERTIFICATE);

  const mainPayment = {
    paymentInstrument: mainPaymentInstruments[0],
    paymentMethod: this.AdyenCreditCardPaymentMethodService
  };

  const giftCardsPayments = this.getGiftCardsPayments(giftCardPaymentInstruments);

  return [
    mainPayment,
    ...giftCardsPayments
  ];
} else if (
  orderRequest.paymentProvider === OrderRequestV2.PaymentProviderEnum.ADYEN
  && orderRequest.paymentMethod === OrderRequestV2.PaymentMethodEnum.PAYPAL
) {
  const mainPaymentInstruments = await this.pickPaymentInstruments(basket, constants.PAYMENT_METHODS.ADYEN_PAYPAL, true);
  const giftCardPaymentInstruments = await this.pickPaymentInstruments(basket, constants.PAYMENT_METHODS.GIFT_CERTIFICATE);

  const mainPayment = {
    paymentInstrument: mainPaymentInstruments[0],
    paymentMethod: this.adyenPayPalPaymentMethodService
  };

  const giftCardsPayments = this.getGiftCardsPayments(giftCardPaymentInstruments);

  return [
    mainPayment,
    ...giftCardsPayments
  ];
} else if (
  (
    !orderRequest.paymentProvider
    || orderRequest.paymentProvider === OrderRequestV2.PaymentProviderEnum.ADYEN
  )
  && orderRequest.paymentMethod === OrderRequestV2.PaymentMethodEnum.INVOICE
) {
  const mainPaymentInstruments = await this.pickPaymentInstruments(basket, constants.PAYMENT_METHODS.INVOICE, true);
  const giftCardPaymentInstruments = await this.pickPaymentInstruments(basket, constants.PAYMENT_METHODS.GIFT_CERTIFICATE);

  const mainPayment = {
    paymentInstrument: mainPaymentInstruments[0],
    paymentMethod: this.AdyenInvoicePaymentMethodService
  };

  const giftCardsPayments = this.getGiftCardsPayments(giftCardPaymentInstruments);

  return [
    mainPayment,
    ...giftCardsPayments
  ];
} else if (
  orderRequest.paymentProvider === OrderRequestV2.PaymentProviderEnum.GMO
  && orderRequest.paymentMethod === OrderRequestV2.PaymentMethodEnum.CREDITCARD
) {
  const mainPaymentInstruments = await this.pickPaymentInstruments(basket, constants.PAYMENT_METHODS.CREDIT_CARD, true);
  const mainPayment = {
    paymentInstrument: mainPaymentInstruments[0],
    paymentMethod: this.GMOCreditCardPaymentMethodService
  };
  return [mainPayment];
} else if (
  orderRequest.paymentProvider === OrderRequestV2.PaymentProviderEnum.COD
  && orderRequest.paymentMethod === OrderRequestV2.PaymentMethodEnum.COD
) {
  const mainPaymentInstruments = await this.pickPaymentInstruments(basket, constants.PAYMENT_METHODS.CASH_ON_DELIVERY, true);
  const mainPayment = {
    paymentInstrument: mainPaymentInstruments[0],
    paymentMethod: this.CashOnDeliveryPaymentService
  };
  return [mainPayment];
} else if (
  (
    !orderRequest.paymentProvider
    || orderRequest.paymentProvider === OrderRequestV2.PaymentProviderEnum.ADYEN
  )
  && orderRequest.paymentMethod === OrderRequestV2.PaymentMethodEnum.GIFTCERTIFICATE
) {
  const giftCardPaymentInstruments = await this.pickPaymentInstruments(basket, constants.PAYMENT_METHODS.GIFT_CERTIFICATE, true);
  return this.getGiftCardsPayments(giftCardPaymentInstruments);
} else if (
  (
    !orderRequest.paymentProvider
    || orderRequest.paymentProvider === OrderRequestV2.PaymentProviderEnum.ADYEN
  )
  && orderRequest.paymentMethod === OrderRequestV2.PaymentMethodEnum.APPLEPAY
) {
  const mainPaymentInstruments = await this.pickPaymentInstruments(basket, constants.PAYMENT_METHODS.APPLE_PAY, true);
  const mainPayment = {
    paymentInstrument: mainPaymentInstruments[0],
    paymentMethod: this.AdyenApplePayPaymentService
  };
  return [mainPayment];
} 
throw new BadRequestError(`${ERRORS.PLACE_ORDER_V2_PREFIX} Please verify your request`);

重构方案:策略模式+配置映射

这种多分支判断最适合用配置映射表来重构,把条件和对应的处理逻辑解耦,新增支付方式只需添加配置项,无需修改核心逻辑。

步骤1:定义配置类型

先明确每个支付场景需要的配置参数:

type PaymentConfig = {
  paymentMethodConstant: string;
  paymentService: any; // 替换成你的支付服务实际类型
  supportsGiftCard?: boolean;
  isGiftCardOnly?: boolean;
};

步骤2:创建配置映射表

把原来的每个if-else分支对应成配置项,处理!paymentProvider的情况(默认映射到ADYEN的配置):

private paymentConfigs: Record<string, PaymentConfig> = {
  // ADYEN 或无支付提供商的场景
  [`${OrderRequestV2.PaymentProviderEnum.ADYEN}_${OrderRequestV2.PaymentMethodEnum.CREDITCARD}`]: {
    paymentMethodConstant: constants.PAYMENT_METHODS.CREDIT_CARD,
    paymentService: this.AdyenCreditCardPaymentMethodService,
    supportsGiftCard: true
  },
  [`${OrderRequestV2.PaymentProviderEnum.ADYEN}_${OrderRequestV2.PaymentMethodEnum.PAYPAL}`]: {
    paymentMethodConstant: constants.PAYMENT_METHODS.ADYEN_PAYPAL,
    paymentService: this.adyenPayPalPaymentMethodService,
    supportsGiftCard: true
  },
  [`${OrderRequestV2.PaymentProviderEnum.ADYEN}_${OrderRequestV2.PaymentMethodEnum.INVOICE}`]: {
    paymentMethodConstant: constants.PAYMENT_METHODS.INVOICE,
    paymentService: this.AdyenInvoicePaymentMethodService,
    supportsGiftCard: true
  },
  [`${OrderRequestV2.PaymentProviderEnum.ADYEN}_${OrderRequestV2.PaymentMethodEnum.APPLEPAY}`]: {
    paymentMethodConstant: constants.PAYMENT_METHODS.APPLE_PAY,
    paymentService: this.AdyenApplePayPaymentService
  },
  [`${OrderRequestV2.PaymentProviderEnum.ADYEN}_${OrderRequestV2.PaymentMethodEnum.GIFTCERTIFICATE}`]: {
    paymentMethodConstant: constants.PAYMENT_METHODS.GIFT_CERTIFICATE,
    paymentService: null,
    isGiftCardOnly: true
  },
  // GMO 场景
  [`${OrderRequestV2.PaymentProviderEnum.GMO}_${OrderRequestV2.PaymentMethodEnum.CREDITCARD}`]: {
    paymentMethodConstant: constants.PAYMENT_METHODS.CREDIT_CARD,
    paymentService: this.GMOCreditCardPaymentMethodService
  },
  // COD 场景
  [`${OrderRequestV2.PaymentProviderEnum.COD}_${OrderRequestV2.PaymentMethodEnum.COD}`]: {
    paymentMethodConstant: constants.PAYMENT_METHODS.CASH_ON_DELIVERY,
    paymentService: this.CashOnDeliveryPaymentService
  }
};

步骤3:重构核心函数

用通用逻辑匹配配置,执行对应的支付处理:

async processPayment(basket: any, orderRequest: OrderRequestV2) {
  // 处理无支付提供商的情况,默认使用ADYEN的配置
  const provider = orderRequest.paymentProvider || OrderRequestV2.PaymentProviderEnum.ADYEN;
  const configKey = `${provider}_${orderRequest.paymentMethod}`;
  const config = this.paymentConfigs[configKey];

  if (!config) {
    throw new BadRequestError(`${ERRORS.PLACE_ORDER_V2_PREFIX} Please verify your request`);
  }

  // 礼品卡单独支付的场景
  if (config.isGiftCardOnly) {
    const giftCardInstruments = await this.pickPaymentInstruments(basket, config.paymentMethodConstant, true);
    return this.getGiftCardsPayments(giftCardInstruments);
  }

  // 获取主支付工具
  const mainInstruments = await this.pickPaymentInstruments(basket, config.paymentMethodConstant, true);
  const mainPayment = {
    paymentInstrument: mainInstruments[0],
    paymentMethod: config.paymentService
  };

  // 处理支持礼品卡的场景
  if (config.supportsGiftCard) {
    const giftCardInstruments = await this.pickPaymentInstruments(basket, constants.PAYMENT_METHODS.GIFT_CERTIFICATE);
    const giftCardPayments = this.getGiftCardsPayments(giftCardInstruments);
    return [mainPayment, ...giftCardPayments];
  }

  // 不支持礼品卡的场景
  return [mainPayment];
}

重构优势

  • 简洁易读:核心逻辑和分支配置分离,一眼就能看到所有支付场景的配置
  • 易扩展:新增支付方式只需在paymentConfigs里加一条配置,不用修改处理逻辑
  • 低耦合:条件判断和业务逻辑解耦,避免后续修改引入bug

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:27:03