Как я могу рефакторинг, чтобы избавиться от переменной экземпляра? - PullRequest
1 голос
/ 13 апреля 2011

У меня есть тонны таких методов:

def lab1
  setup
  business_processing
rescue Exception => e
  handle_error('custom error message for lab1', e)
end

def lab2
  setup
  business_processing
rescue Exception => e
  handle_error('custom errror message for lab2', e)
end

Я преобразовал приведенный выше код во что-то вроде этого:

def lab1
  with_setup_and_error_handling do
    @error_message = 'error in lab1'
    business_processing
  end
end

def with_setup_and_error_handling(&block)
  setup
  block.call
rescue Exception => e
  handle_error(@error_message, e)
end

Новый код работает, но он заставляет error_message быть переменной экземпляра. Есть ли лучший способ его рефакторинга?

Когда кто-то смотрит на измененный код, он видит переменную экземпляра, но не ясно, где она используется, поэтому я не доволен ею.

Ответы [ 4 ]

4 голосов
/ 13 апреля 2011

Поместите сообщение об ошибке в качестве аргумента метода de setup:

def lab1
  with_setup_and_error_handling('error in lab1') do
    business_processing
  end
end

def with_setup_and_error_handling(error_message, &block)
  setup
  block.call
rescue Exception => e
  handle_error(error_message, e)
end
1 голос
/ 13 апреля 2011

Если все, что вы изменяете, это сообщение об ошибке для каждого процесса, то почему бы не выполнить рефакторинг кода следующим образом:

def lab(version)
  begin
    setup
    business_processing
  rescue Exception => e
    handle_error("error in lab#{version}", e)
  end
end

и, если необходимо, чтобы сохранить отдельные методы labN, сделайте следующее:

def lab1
  self.lab 1
end

def lab2
  self.lab 2
end
1 голос
/ 13 апреля 2011

Это проблема XY *.

Тот факт, что вам нужно «избавиться» от переменной экземпляра, - это запах, указывающий на плохой дизайн. В этом случае плохой дизайн - это утечка состояний, вызванная неправильным использованием / пониманием области видимости (переменных экземпляра). «Это не работает иначе» не является достаточной причиной, чтобы сделать что-то переменным экземпляра.

* http://www.perlmonks.org/index.pl?node_id=542341

1 голос
/ 13 апреля 2011

Почему бы просто не передать сообщение об ошибке в качестве аргумента вашему with_setup_and_error_handling?Похоже, очевидное решение для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...