Sono un grande fan della scrittura di asserzioni, contratti o qualsiasi tipo di controllo disponibile nella lingua che sto usando. Una cosa che mi disturba un po 'è che non sono sicuro di quale sia la pratica comune per gestire i controlli duplicati.
Esempio di situazione: prima scrivo la seguente funzione
void DoSomething( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
//code using obj
}
poi qualche ora dopo scrivo un'altra funzione che chiama la prima. Poiché tutto è ancora fresco nella memoria, decido di non duplicare il contratto, poiché so che DoSomething
wil controlla già un oggetto nullo:
void DoSomethingElse( object obj )
{
//no Requires here: DoSomething will do that already
DoSomething( obj );
//code using obj
}
Il problema ovvio: DoSomethingElse
ora dipende da DoSomething
per verificare che obj non sia nullo. Quindi, se DoSomething
decidesse mai 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 al sicuro, non preoccuparti, tranne che se la situazione aumenta, lo stesso oggetto potrebbe essere controllato un numero di volte ed è una forma di duplicazione e sappiamo tutti che non è così bello.
Qual è la pratica più comune per situazioni come queste?