Sono un grande fan della scrittura di asserzioni, contratti o qualsiasi tipo di controllo disponibile nella lingua che sto usando. Una cosa che mi preoccupa un po 'è che non sono sicuro di quale sia la pratica comune per gestire i controlli doppi.
Esempio di situazione: scrivo innanzitutto la seguente funzione
void DoSomething( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
//code using obj
}
poi poche ore dopo scrivo un'altra funzione che chiama la prima. Poiché tutto è ancora fresco in memoria, decido di non duplicare il contratto, poiché so che DoSomething
verificherò già un oggetto null:
void DoSomethingElse( object obj )
{
//no Requires here: DoSomething will do that already
DoSomething( obj );
//code using obj
}
Il problema ovvio: DoSomethingElse
ora dipende dalla DoSomething
verifica che obj non sia nullo. Quindi dovrei DoSomething
mai decidere di non controllare più, o se decido di usare un'altra funzione, obj potrebbe non essere più controllato. Il che mi porta a scrivere questa implementazione dopo tutto:
void DoSomethingElse( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
DoSomething( obj );
//code using obj
}
Sempre sicuro, nessuna preoccupazione, tranne che se la situazione cresce lo stesso oggetto potrebbe essere verificato più volte ed è una forma di duplicazione e sappiamo tutti che non è così buono.
Qual è la pratica più comune per situazioni come queste?
ArgumentBullException
? Questo è nuovo :)