Enfatizzare la negazione


13

Stavo solo scrivendo un'istruzione if con nomi di proprietà abbastanza lunghi e ho riscontrato questo problema.

Supponiamo che abbiamo un'istruzione if come questa:

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

La seconda proprietà è di tipo booleano e non ha senso avere lo stetement simile

if(boleanValue == true)

Esiste un modo migliore per enfatizzare la negazione e metterlo !in primo piano. A me sembra che questo possa essere facilmente supervisionato durante la lettura del codice e potrebbe causare seriamente problemi con il debug


7
Estrai la condizione in un metodo con un nome significativo.
Joachim Sauer,

2
... oppure assegna il valore negato a una variabile con un nome significativo e utilizzalo invece nella condizione if.
scrwtp,

+1 cosa ha detto @JoachimSauer, se possibile metti quel metodo sull'oggetto da interrogare .. In questo caso l'intera condizione potrebbe essere incapsulata con un metodo su_someViewModelNameThatIsLong
MattDavey,

2
Una cosa generale che faccio spesso è circondare la negazione con uno spazio su ciascun lato per renderla più visibile. if( ! something)vsif(!something)
Svish,

Se stai enfatizzando la negazione, perché non usarla ... && model.Prop == false)? Personalmente lo uso molto raramente !, è troppo facile da trascurare.

Risposte:


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

E poi, nell'oggetto modello vista

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

(supponendo che someValue sia una stringa e non sia conosciuta dall'oggetto modello)

Questo non solo sottolinea il! operatore, ma lo rende generalmente più leggibile. Ora, nel metodo di chiamata, posso vedere una condizione, che dovrebbe essere ben denominata per descrivere la condizione nel contesto dell'oggetto chiamante. E nell'oggetto modello, posso vedere cosa significa nel contesto dell'oggetto modello.


1
+1, questa è una buona applicazione del principio dell'esperto dell'informazione .
MattDavey,

1
Vale la pena notare che someValuepotrebbe essere necessario essere un parametro del NeedsMeToDoSomethingmetodo, a seconda della situazione.
MattDavey,

@MattDavey: Oh, buon punto.
pdr

@pdr Forse dovresti creare una proprietà per quel modello di vista con lo stesso valore booleano e riutilizzare quella bandiera in più punti. Sono sicuro che lo troverai utile.
Radu Florescu,

5

Mettilo da solo se blocca prima di valutare le condizioni meno importanti. Non solo sarebbe più facile leggere senza il disordine delle altre condizioni, ma è anche la prima condizione che leggerà un programmatore. Combina questo con l'idea già menzionata da @scrwtp per assegnarlo a una variabile con un nome significativo e otterrai:

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

Se stai programmando in un linguaggio di compilazione, la maggior parte delle volte questi blocchi annidati se vengono comunque combinati alla fine, purché tu non inserisca codice tra if esterno e if interno, quindi non dovrebbe influire sulle prestazioni in questi casi.


2

Se si utilizza C / C ++, il preprocessore potrebbe fornire leggibilità.

#define NOT !

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

o forse ... funzione not (x) {return! x; } // javascript
Alex

2
Operatori in C e C ++ Esistono già sinonimi standard per vari operatori.
Gioele,

0

Vorrei solo estrarre

`!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant`

In un metodo che restituisce questo. Se si chiama questo metodo NotThisIsABooleanPropertyThatIsImportant, si dovrebbe andare bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.