MST
星途 面试题库

面试题:Ruby复杂业务逻辑代码的重构优化

给定一个Ruby程序,用于处理用户订单系统。程序中有一个`Order`类,包含多个复杂方法,如`calculate_total_price`(计算订单总价,涉及商品价格、折扣、运费等复杂计算)、`validate_order`(验证订单是否合法,需要检查用户信息、商品库存等多项条件)、`process_order`(处理订单流程,如生成订单号、更新库存、发送邮件通知等一系列操作)。由于业务发展,代码变得冗长且难以维护。请描述你会如何对`Order`类中的这些方法进行重构,提高代码的可维护性和扩展性,可从设计模式、代码结构优化等方面阐述,并给出关键重构点的伪代码示例。
46.9万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

重构思路

  1. 设计模式应用
    • 策略模式:对于calculate_total_price方法中涉及的复杂计算,可将不同计算逻辑(如商品价格计算、折扣计算、运费计算)封装成不同策略类。这样在计算总价时,可以根据不同场景灵活切换策略。
    • 责任链模式validate_order方法需要检查多项条件,可将每个检查条件封装成一个处理者对象,通过责任链依次传递订单对象进行检查,使得代码结构更清晰,易于扩展新的检查条件。
    • 命令模式process_order方法包含多个不同操作,可将每个操作(如生成订单号、更新库存、发送邮件通知)封装成命令对象,这样方便对操作进行管理和扩展。
  2. 代码结构优化
    • 方法拆分:将复杂方法拆分成更小的、功能单一的方法,提高代码的内聚性。
    • 提取类:如果某些方法或数据具有较高的相关性,可以提取成独立的类,降低Order类的复杂度。

关键重构点伪代码示例

  1. 策略模式 - calculate_total_price重构
# 策略类 - 商品价格计算
class ProductPriceCalculator
  def calculate(product)
    # 商品价格计算逻辑
  end
end

# 策略类 - 折扣计算
class DiscountCalculator
  def calculate(order)
    # 折扣计算逻辑
  end
end

# 策略类 - 运费计算
class ShippingFeeCalculator
  def calculate(order)
    # 运费计算逻辑
  end
end

class Order
  def initialize(product_price_calculator, discount_calculator, shipping_fee_calculator)
    @product_price_calculator = product_price_calculator
    @discount_calculator = discount_calculator
    @shipping_fee_calculator = shipping_fee_calculator
  end

  def calculate_total_price
    product_price = @product_price_calculator.calculate(self.product)
    discount = @discount_calculator.calculate(self)
    shipping_fee = @shipping_fee_calculator.calculate(self)
    product_price - discount + shipping_fee
  end
end
  1. 责任链模式 - validate_order重构
# 抽象处理者
class OrderValidator
  def initialize(next_validator = nil)
    @next_validator = next_validator
  end

  def validate(order)
    if can_validate?(order)
      result = do_validate(order)
      return result if result == false
    end
    @next_validator&.validate(order)
  end

  def can_validate?(order)
    raise NotImplementedError
  end

  def do_validate(order)
    raise NotImplementedError
  end
end

# 用户信息检查处理者
class UserInfoValidator < OrderValidator
  def can_validate?(order)
    true
  end

  def do_validate(order)
    # 用户信息检查逻辑
  end
end

# 商品库存检查处理者
class ProductStockValidator < OrderValidator
  def can_validate?(order)
    true
  end

  def do_validate(order)
    # 商品库存检查逻辑
  end
end

class Order
  def validate_order
    user_validator = UserInfoValidator.new(ProductStockValidator.new)
    user_validator.validate(self)
  end
end
  1. 命令模式 - process_order重构
# 抽象命令类
class OrderCommand
  def execute(order)
    raise NotImplementedError
  end
end

# 生成订单号命令
class GenerateOrderNumberCommand < OrderCommand
  def execute(order)
    # 生成订单号逻辑
  end
end

# 更新库存命令
class UpdateStockCommand < OrderCommand
  def execute(order)
    # 更新库存逻辑
  end
end

# 发送邮件通知命令
class SendEmailNotificationCommand < OrderCommand
  def execute(order)
    # 发送邮件通知逻辑
  end
end

class Order
  def process_order
    commands = [GenerateOrderNumberCommand.new, UpdateStockCommand.new, SendEmailNotificationCommand.new]
    commands.each do |command|
      command.execute(self)
    end
  end
end