Jestem wielkim fanem pisania stwierdzeń, umów lub wszelkiego rodzaju czeków dostępnych w języku, którego używam. Jedną z rzeczy, która mnie trochę niepokoi, jest to, że nie jestem pewien, jaka jest powszechna praktyka postępowania z duplikatami kontroli.
Przykładowa sytuacja: najpierw piszę następującą funkcję
void DoSomething( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
//code using obj
}
potem kilka godzin później piszę inną funkcję, która wywołuje pierwszą. Ponieważ wszystko jest jeszcze w pamięci, postanawiam nie powielać kontraktu, ponieważ wiem, że DoSomething
sprawdzę już, czy nie ma już obiektu zerowego:
void DoSomethingElse( object obj )
{
//no Requires here: DoSomething will do that already
DoSomething( obj );
//code using obj
}
Oczywisty problem: DoSomethingElse
teraz zależy od DoSomething
sprawdzenia, czy obiekt nie jest pusty. Więc powinienem DoSomething
kiedykolwiek zdecydować, że nie będę już sprawdzać, albo jeśli zdecyduję się użyć innej funkcji, obiekt może nie być już sprawdzany. Co w końcu prowadzi mnie do napisania tej implementacji:
void DoSomethingElse( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
DoSomething( obj );
//code using obj
}
Zawsze bezpieczny, nie martw się, z wyjątkiem tego, że jeśli sytuacja się rozwinie, ten sam obiekt może być sprawdzony wiele razy i jest to forma powielania i wszyscy wiemy, że nie jest tak dobrze.
Jaka jest najczęstsza praktyka w takich sytuacjach?
ArgumentBullException
? To nowy :)