2010-06-03 8 views
6

Si tengo una función llamada desde algunos lugares, y requiere que se cumpla alguna condición para todo lo que ejecuta, ¿dónde debería verificarse esa condición? En mi caso, es para dibujar: si el botón del mouse está presionado, ejecuta la lógica de dibujo (esto se hace en el controlador de movimiento del mouse para cuando lo arrastres).Práctica recomendada: cuándo evaluar los condicionales de la ejecución de la función

La opción uno dice ponerlo en la función que está garantizado para ser verificado. Abstraído, si quieres.

public function Foo() { 
    DoThing(); 
} 

private function DoThing() { 
    if (!condition) return; 
    // do stuff 
} 

El problema que tengo con esto es que cuando se lee el código de Foo, que puede estar muy lejos de DoThing, se ve como un error. Lo primero que se piensa es que la condición no se está controlando.

La segunda opción, entonces, es verificar antes de llamar.

public function Foo() { 
    if (condition) DoThing(); 
} 

Esto lee mejor, pero ahora tiene que preocuparse acerca de la comprobación de todas partes se llame.

La tercera opción es cambiar el nombre de la función para que sea más descriptiva.

public function Foo() { 
    DoThingOnlyIfCondition(); 
} 

private function DoThingOnlyIfCondition() { 
    if (!condition) return; 
    // do stuff 
} 

¿Es esta la solución "correcta"? ¿O esto va demasiado lejos? Siento que si todo fuera así, los nombres de las funciones comenzarían a duplicar su código.

Acerca de esto, es subjetivo: por supuesto que lo es, y puede que no haya una respuesta correcta, pero creo que todavía se siente como en casa. Obtener consejos de mejores programadores que yo es la segunda mejor manera de aprender. Las preguntas subjetivas son exactamente el tipo de cosas que Google no puede responder.

Respuesta

5

Según DRY, me gustaría ir con la primera.

public function Foo() { 
    DoThing(); 
} 

private function DoThing() { 
    if (!condition) return; 
    // do stuff 
} 

vez que se acostumbre al patrón, no es tan desconcertante ver a un solitario DoThing() en el código. Comenzarás a leerlo como EnsureThingDone().

+2

Responde a la pregunta de la estructura. En cuanto al nombre, pensar un poco más debería proporcionar una alternativa que sea adecuadamente descriptiva y no repetitiva. Quizás algo en la línea de 'DrawOnDrag()' para 'DoThing()'. – Novelocrat

0

me gusta comprobar las condiciones previas dentro de la función,

public function DoThing() 
{ 
    ValidatePreconditions(); 
    DoWork(); 
} 

private function DoWork() 
{ 
    //Do the actual work; 
} 

de esta manera Estoy seguro de todas las condiciones adecuadas se cumplen antes de la ejecución de mi función y no hay necesidad de un consumidor para añadir código innecesario cada tiempo en que se llama mi función

0

Puede usar el sistema de tipos. Haga que el parámetro para DoThing sea un objeto que solo puede instanciar si se cumplen las condiciones previas.

Una forma sencilla de hacer esto sería hacer DoThing un método de instancia en ese objeto.

2

La opción cuatro, ajusta el predicado y la llamada real en una tercera función.

function DoThing() { 
    // do stuff 
} 

function DoThingOnlyIfCondition() { 
    if (!condition) return; 
    DoThing(); 
} 

function Foo() { 
    DoThingOnlyIfCondition(); 
} 

// Foo version 2 
function FooBar() { 
    DoThing(); 
} 

Ahora Foo, o la función que sea, puede usar la versión DoXXX() más adecuada.

Cuestiones relacionadas