Enfatizar la negación

13

Estaba escribiendo una declaración if con nombres de propiedad bastante largos y surgió este problema.

Digamos que tenemos una sentencia if como esta:

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
   !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}

La segunda propiedad es de tipo booleano y no tiene sentido tener la declaración como

if(boleanValue == true)

¿Hay una mejor manera de enfatizar la negación que poner ! al frente? Para mí, parece que esto se puede supervisar fácilmente cuando se lee el código y puede causar problemas con la depuración

    
pregunta Ivan Crojach Karačić 21.01.2013 - 12:17

4 respuestas

22
if(_someViewModelNameThatIsLong.NeedsMeToDoSomething(someValue))
{
    //Do something
}

Y luego, en el objeto de modelo de vista

public bool NeedsMeToDoSomething(string someValue)
{
    return AnotherPropertyINeedToCheck == someValue &&
        !ThisIsABooleanPropertyThatIsImportant;
}

(asumiendo que someValue es una cadena y no es conocido por el objeto modelo)

Esto no solo enfatiza el! Operador, pero en general lo hace más legible. Ahora, en el método de llamada, puedo ver una condición, que debería estar bien nombrada para describir la condición en el contexto del objeto que llama. Y en el objeto modelo, puedo ver lo que eso significa en el contexto del objeto modelo.

    
respondido por el pdr 21.01.2013 - 12:37
5

Póngalo en su propio bloque de bloqueo antes de evaluar las condiciones menos importantes. No solo sería más fácil de leer sin el desorden de las otras condiciones, sino que también es la primera condición que un programador leerá. Combine esto con la idea ya mencionada por @scrwtp para asignar a una variable con un nombre significativo y obtendrá:

var isValid = !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant;
if( isValid ) 
{
    if( _someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue ) 
    {
        //Do something
    }
}

Si está programando en un lenguaje de compilación, la mayoría de las veces se anidan si los bloques se combinan al final de todos modos, siempre y cuando no inserte un código entre el exterior if y el interior if, por lo que no debería afectar rendimiento en estos casos.

    
respondido por el Neil 21.01.2013 - 12:32
2

Si está utilizando C / C ++, entonces el preprocesador podría proporcionar legibilidad.

#define NOT !

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
    NOT _someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}
    
respondido por el CWallach 21.01.2013 - 21:47
0

Acabo de extraer

'!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant'

En un método que devuelve esto. Si nombra este método NotThisIsABooleanPropertyThatIsImportant deberías estar bien.

    
respondido por el mrtnrdl 21.01.2013 - 13:27

Lea otras preguntas en las etiquetas