Aby uniknąć wszystkich standardowych odpowiedzi, na które mógłbym Googled, podam przykład, który wszyscy możecie atakować do woli.
C # i Java (i zbyt wiele innych) mają wiele typów zachowań polegających na przepełnieniu, których w ogóle nie lubię (np. type.MaxValue + type.SmallestValue == type.MinValue
Na przykład int.MaxValue + 1 == int.MinValue
:).
Ale, widząc moją okrutną naturę, dodam zniewagę do tej kontuzji, rozszerzając to zachowanie na, powiedzmy, DateTime
typ Overridden . (Wiem, że DateTime
jest zamknięty w .NET, ale na potrzeby tego przykładu używam pseudo-języka, który jest dokładnie taki jak C #, z wyjątkiem faktu, że DateTime nie jest zamknięty).
Przesłonięta Add
metoda:
/// <summary>
/// Increments this date with a timespan, but loops when
/// the maximum value for datetime is exceeded.
/// </summary>
/// <param name="ts">The timespan to (try to) add</param>
/// <returns>The Date, incremented with the given timespan.
/// If DateTime.MaxValue is exceeded, the sum wil 'overflow' and
/// continue from DateTime.MinValue.
/// </returns>
public DateTime override Add(TimeSpan ts)
{
try
{
return base.Add(ts);
}
catch (ArgumentOutOfRangeException nb)
{
// calculate how much the MaxValue is exceeded
// regular program flow
TimeSpan saldo = ts - (base.MaxValue - this);
return DateTime.MinValue.Add(saldo)
}
catch(Exception anyOther)
{
// 'real' exception handling.
}
}
Oczywiście i może rozwiązać to równie łatwo, ale faktem jest, że po prostu nie rozumiem, dlaczego nie można użyć wyjątków (logicznie to znaczy, widzę, że gdy wydajność jest problemem, w niektórych przypadkach należy unikać wyjątków ).
Myślę, że w wielu przypadkach są one bardziej przejrzyste niż struktury if i nie łamią żadnych umów zawartych przez metodę.
IMHO reakcja „Nigdy nie używaj ich do regularnego przebiegu programu” wydaje się, że wszyscy nie są tak słabo rozwinięci, jak siła tej reakcji może to uzasadnić.
Czy się mylę?
Czytałem inne posty dotyczące wszelkiego rodzaju specjalnych przypadków, ale moim zdaniem nie ma w tym nic złego, jeśli oboje:
- Jasny
- Honoruj kontrakt swojej metody
Zastrzel mnie.
if
oświadczenie. Znajdziesz to bardzo trudne. Innymi słowy: twoje założenie jest błędne, a wnioski, które z niego wyciągasz, są błędne.