2010-10-02 12 views
5

¿Hay alguna regla sobre cuándo usar dos funciones o cuándo pasar el parámetro booleano?¿Dos funciones o parámetro booleano?

Gracias

+2

¿Qué significa eso? ¿Puedes proporcionar un ejemplo de código? – NullUserException

+0

Sí, hay muchas reglas. Todos ellos son contradictorios y todos son una cuestión de preferencia personal (o de equipo). Mi regla personal es simple: si siento la necesidad de agregar comentario (s) al método o una llamada al método, necesito cambiarlo. – Tergiver

Respuesta

7

Ha sido un tiempo desde la última re-leer el código completo, pero recuerdo vagamente McConnell hacer frente a esto, y las palabras "conherence disyuntiva" estallar en mi cabeza. En pocas palabras,

void f(int x, int y, bool b) 

frente

void f1(int x, int y) 
void f2(int x, int y) 

es a menudo una opción, y dependiendo de qué tan similares o diferentes f se comportaría bajo true frente false, puede tener sentido para dividirla en dos funciones y darles nombres distintos A menudo, una tercera opción es mejor, que es cambiar el bool a una enumeración de dos valores, donde el nombre enum hace la distinción clara.

La clave es mirar los sitios de llamadas, y ver si el significado es claro solo por leer el código. Si usted está tentado a poner un comentario en cada llamada in situ booleano:

f(3, 4, true /* absoluteWidgetMode */) 

y la llamada-sitios suelen llamar con booleanos constantes, eso es un olor fuerte que se debe dividirla en múltiples funciones.

4

parámetros booleanos son sentidola mayor parte de las veces, básicamente la misma crítica que merece números mágicos hacen. No tiene posibilidad de entender lo que se hace simplemente mirando la llamada a la función.

Así que, incluso si es conveniente tener un parámetro booleano para códigos muy similares (al agregar/sobreescribir un archivo), manténgalo interno, privado y no permita que esto sea visible en la interfaz.

En su lugar, siempre obligar al programador para ser explícita:

Uso enumeraciones para dar descripciones relevantes para la distinción o simplemente utilizan funciones separadas.

Compare:

WriteFile(path, "Hello, World", true) 

con

WriteFile(path, "Hello, World", FileMode.Append) 

o simplemente

AppendFile(path, "Hello, World") 
+2

Tenga en cuenta que esto no se aplica a los idiomas con parámetros nombrados. 'WriteFile (Append: True)' es probablemente tan legible como 'WriteFile (Mode: FileMode.Append)'. – sepp2k

+0

@ sepp2k: Es cierto, aunque no me gusta el enfoque de parámetros nombrados -a pesar de ser prolijo- porque su uso no se aplica y, por lo tanto, aún es probable que se produzcan parámetros sin sentido (por ejemplo, debido a la pereza). Hacer que los nombres de argumento sean compulsivos mejoraría la situación, pero probablemente reduzca las posibilidades de abstracción (funciones de orden superior, delegados, aplicación parcial, programación tácita). En estos casos también, los tipos fuertes o las diferentes funciones siguen siendo la mejor opción. – Dario

Cuestiones relacionadas