我可以使用对象而不是 Clean Code Ruby 的条件吗?

Can I use objects instead of conditionals for Clean Code Ruby?

我有条件 :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

我想使用 class 定义和对象创建来避免条件语句。清洁代码建议这样做。我看不出有条件地选择这些符号集中的任何一个。

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

如果你真的想避免条件,你可以在配置中使用散列:

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]

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

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>)

这是 的 "more object oriented" 版本。通常,您会希望坚持使用基于配置的版本,直到您的对象需要这种级别的复杂性和开销。

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

对象;没有条件:

# 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"