Ruby on rails 如何使用开放/封闭原则或策略模式重构此ruby代码

Ruby on rails 如何使用开放/封闭原则或策略模式重构此ruby代码,ruby-on-rails,ruby,strategy-pattern,open-closed-principle,Ruby On Rails,Ruby,Strategy Pattern,Open Closed Principle,如何使用开放/封闭原则或策略模式重构此ruby代码? 我知道其主要思想是“软件实体(类、模块、函数等)应该开放以供扩展,但关闭以供修改”,但我如何在实践中使用它呢 class PaymentService def initialize(payment, payment_type) @payment = payment @payment_type = payment_type end def process result = case payment_type

如何使用开放/封闭原则或策略模式重构此ruby代码? 我知道其主要思想是“软件实体(类、模块、函数等)应该开放以供扩展,但关闭以供修改”,但我如何在实践中使用它呢

class PaymentService
  def initialize(payment, payment_type)
    @payment = payment
    @payment_type = payment_type
  end

  def process
    result = case payment_type
    when 'first'
      process_first
    when 'second'
      process_second
    end

    payment.save(result)
  end

  def process_first
    'process_first'
  end

  def process_second
    'process_second'
  end
end

在本例中,您可以使用处理付款的类来构建对象,而不是传递
付款类型

class FirstPayment
  def process
    'process_first'
  end
end

class SecondPayment
  def process
    'process_second'
  end
end

class PaymentService
  def initialize(payment, payment_strategy)
    @payment = payment
    @payment_strategy = payment_strategy
  end

  def process
    result = @payment_stategy.process
    payment.save(result)
  end
end

PaymentService.new(payment, FirstPayment.new)

因此,
PaymentService
行为可以通过传递新策略(例如,
ThirdPayment
)来扩展,但如果处理第一次或第二次付款的逻辑发生更改,则不需要修改类。

在本例中,您可以使用处理付款的类来构建对象,而不是传递
payment\u type

class FirstPayment
  def process
    'process_first'
  end
end

class SecondPayment
  def process
    'process_second'
  end
end

class PaymentService
  def initialize(payment, payment_strategy)
    @payment = payment
    @payment_strategy = payment_strategy
  end

  def process
    result = @payment_stategy.process
    payment.save(result)
  end
end

PaymentService.new(payment, FirstPayment.new)

因此,
PaymentService
行为可以通过传递一个新策略(例如,
ThirdPayment
)来扩展,但是如果处理第一次或第二次付款的逻辑发生了变化,则不需要修改类。

“但是关闭以进行修改”-在ruby中不是这样。在ruby中,我们无法阻止第三方修改任何代码。我认为您的意思是
result=case@payment\u type
in
PaymentService#process
“但关闭以进行修改”-在ruby中不是这样。不能阻止ruby中的第三方修改任何代码。我认为您的意思是
result=case@payment\u type
in
PaymentService#process