我可以在Clean Code Ruby中使用对象代替条件吗?

时间:2018-11-28 21:54:19

标签: ruby class conditional

我有一个:environment的条件,可以为交易设置电子商务符号。在开发时,我希望使用测试帐户。

if :environemnt == 'development'
    :ssl_merchant_id  = '001234'
    :ssl_user_id      = 'windoe6'
    :ssl_pin          = 'ABCDE'
elsif :environemnt == 'production'
    :ssl_merchant_id  = '006543'
    :ssl_user_id      = 'dingbat32'
    :ssl_pin          = 'AKEIN'
end

我想使用类定义和对象创建来避免出现条件。清洁代码建议这样做。我看不到有条件地选择这些符号集之一。

是否可以使用类定义来避免条件?我仍然必须创建两个类,然后选择一个必须在代码中选择的类。还有一个触发器,用于选择要使用或创建的对象。能做到吗,怎么做到?

3 个答案:

答案 0 :(得分:6)

如果您确实想避免有条件的话,可以在配置中使用哈希:

config = {
  development: {
    ssl_merchant_id: '001234'
    ssl_user_id: 'windoe6'
    ssl_pin: 'ABCDE'
  }
  production: { 
    ssl_merchant_id: '006543'
    ssl_user_id: 'dingbat32'
    ssl_pin: 'AKEIN'
  }
}

config[environment.to_sym]

答案 1 :(得分:3)

使用对象创建一个这样的工厂:

class Environment
  attr_accessor :ssl_merchant_id, :ssl_user_id, :ssl_pin
end

class Development < Environment
  def initialize
    @ssl_merchant_id  = '001234'
    @ssl_user_id      = 'windoe6'
    @ssl_pin          = 'ABCDE'
  end
end

class Production < Environment
  def initialize
    @ssl_merchant_id  = '006543'
    @ssl_user_id      = 'dingbat32'
    @ssl_pin          = 'AKEIN'
  end
end

class EnvironmentFactory
  def self.build(environment)
    Kernel.const_get(environment.to_s.capitalize).new
  end
end

EnvironmentFactory.build(<:development or :production>)

这是mrzasa's answer的“面向对象”版本。通常,您将要坚持使用基于配置的版本,直到您的对象需要这种级别的复杂性和开销。

与Ruby相比,这种类型的模式在Java / .NET中使用更多,您不会在实践中发现它。

答案 2 :(得分:2)

对象;没有条件:

# a Struct is just a fast way of creating a class
SSldata = Struct.new(:ssl_merchant_id, :ssl_user_id, :ssl_pin) 

development = SSldata.new('001234', 'windoe6', 'ABCDE')
production  = SSldata.new('006543', 'dingbat32','AKEIN')

# demo    
environment = development

environment.ssl_pin # => "ABCDE"