我有一个: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
我想使用类定义和对象创建来避免出现条件。清洁代码建议这样做。我看不到有条件地选择这些符号集之一。
是否可以使用类定义来避免条件?我仍然必须创建两个类,然后选择一个必须在代码中选择的类。还有一个触发器,用于选择要使用或创建的对象。能做到吗,怎么做到?
答案 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"