Булевы параметры в методах.Почему бы и нет? - PullRequest
7 голосов
/ 24 февраля 2012

Я использую reek в качестве инструмента анализа лучших практик в моем коде.Однако недавно я обнаружил, что если в методе, у меня есть логические параметры, такие как.

def method (flag = true)

reek дает мне предупреждение.Почему reek говорит мне, что это предупреждение?

Ответы [ 3 ]

3 голосов
/ 25 февраля 2012

За пару лет до того, как я написал reek, я написал в блоге об этом запахе кода здесь: http://silkandspinach.net/2004/07/15/avoid-boolean-parameters/

Все проблемы с булевыми параметрами связаны с дублированием и SRP: вызываемый метод имеет две обязанности, и вызывающая сторона знает, какую из них он хочет вызвать.

0 голосов
/ 31 января 2016

Старый вопрос, но я подумал, что я хотел бы добавить свои мысли для людей, которые приходят из Google:

Отдельные методы хороши в некоторых случаях, но лучший вариант, на мой взгляд, следующий:

def method(option = {:flag => false})
  options[:flag] ? doFoo : doBar
end

method(:flag => true)

Это также может включать проверку, действительно ли флаг является логическим:

def method(option = {:flag => false})
  flag = options.fetch(:flag) { false }
  unless [true, false].include?(flag)
    raise ArgumentError, ':flag option should be true or false'   
  end
  flag? doFoo : doBar
end

method(:flag => true)
0 голосов
/ 24 февраля 2012

Флаговая переменная считается плохой практикой. Это потому, что это по своей сути нарушает принцип, согласно которому функции должны выполнять одну и только одну вещь. Передавая логический флаг, вы говорите: «Делайте это, если это правда, и это, если это ложно», а это две вещи.

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