我可以使用对象而不是 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"
我有条件 :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>)
这是
这种类型的模式在 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"