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

标签 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
    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

最佳答案

在此示例中,您可以构建一个对象,其中包含处理付款的类,而不是传递 payment_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-on-rails - 如何使用开放/封闭原则或策略模式重构此 ruby​​ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51491421/

相关文章:

ruby-on-rails - 版本化的 rails db 和不同

ruby-on-rails - 如何根据域名有条件地强制使用 SSL?

ruby - 局部变量、实例变量和类变量有什么区别?

c++ - 如何在 C++ 中使用 std::function 实现策略模式

c# - 使用 Unity 的策略模式和依赖注入(inject)

ruby-on-rails - 使用 postgresql 和 ruby​​ on rails 优化时间序列数据检索的数据库查询

javascript - 如何通过 .ajax() jQuery 方法获取 Carrierwave 上传到 Amazon S3 的图像的 URL?

ruby-on-rails - 什么是数据库连接限制以及 ActiveRecord 如何处理它?

ruby - 选择标记 : How to use params to set the selected value?

c# - 没有 'switch' 语句的策略模式?