2012-02-24 24 views
5

Estoy usando reek como una herramienta de análisis de las mejores prácticas en mi código. Sin embargo, recientemente descubrí que si en el método tengo parámetros booleanos, como.Parámetros booleanos en métodos. Por qué no?

def method (flag = true) 

reek me da una advertencia. ¿Por qué reek me dice que es una advertencia?

+0

más probable, ya un método tomando sólo un booleano generalmente debe ser dividido en dos, por ejemplo, un 'setEnabled (bool) 'podría dividirse en' Enable' y 'Disable 'que tengan más sentido. –

+0

Joachim, yo diría que está bien pasar un booleano como un valor que se guardará, como si se pudiera establecer un entero con un método setter. – AJcodez

Respuesta

3

Un par de años antes de escribir apesto que escribió en su blog acerca de este código de olor aquí: http://silkandspinach.net/2004/07/15/avoid-boolean-parameters/

Los problemas con los parámetros de Boole todos tienen que ver con la duplicación y la SRP: el método llamado tiene dos responsabilidades, y la persona que llama sabe a cuál quiere invocar.

+0

Eso es una gran exageración en mi opinión. Hay toneladas de casos cuando un método con un parámetro booleano cumple con SRP. Me gusta 'def import (ignore_errors)', etc. –

0

Una variable de marcador se considera una mala práctica. Esto se debe a que infringe intrínsecamente el principio de que las funciones deben hacer una y solo una cosa. Al pasar una bandera booleana, usted está diciendo: "Haga esto si es verdadero, y si es falso", que son dos cosas.

+5

pero las funciones siempre hacen cosas diferentes dependiendo de sus parámetros. –

0

vieja pregunta, pero pensé que me gustaría añadir mis pensamientos para las personas que vienen de Google:

métodos independientes están bien en algunos casos, pero la mejor opción por lo general en mi mente es el siguiente:

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

method(:flag => true) 

Esto también podría incluir una comprobación de si el indicador es en realidad un valor booleano:

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) 
Cuestiones relacionadas