Могу ли я использовать объекты вместо условных обозначений для чистого кода Ruby? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть условие на :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 голосов
/ 29 ноября 2018

Используя объекты, вы создадите Фабрику следующим образом:

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 .Обычно вам нужно придерживаться версии, основанной на конфигурации, пока ваши объекты не нуждаются в таком уровне сложности и накладных расходов.

Этот тип шаблона больше используется в Java / .NET, чем Ruby, и вы его не найдетеобычно используется на практике.

0 голосов
/ 29 ноября 2018

Объекты;без условий:

# 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"
0 голосов
/ 29 ноября 2018

Вы можете использовать хеши с конфигурацией, если вы действительно хотите избежать условных выражений:

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]
...