重构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
相关产品推荐
相关产品推荐

