Google'da kullanabileceğim tüm standart yanıtlardan kaçınmak için, hepinizin istediği zaman saldırabileceğiniz bir örnek vereceğim.
C # ve Java (ve diğer pek çok) hiç sevmiyorum 'taşma' davranış bazı türleri bol var (örneğin type.MaxValue + type.SmallestValue == type.MinValue
: örneğin int.MaxValue + 1 == int.MinValue
).
Ancak, kısır doğamı gördüğümde, bu davranışı genişleterek bu yaralanmaya biraz hakaret edeceğim, diyelim ki Geçersiz kılınmış bir DateTime
tip. (Ben DateTime
.NET mühürlü olduğunu biliyorum , ama bu örnek uğruna, ben DateTime mühürlenmemiş olması dışında, tam olarak C # gibi bir sahte dil kullanıyorum).
Geçersiz kılınan Add
yöntem:
/// <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.
}
}
Tabii ki bir if bu kadar kolay çözebilir, ancak gerçek şu ki neden istisnaları kullanamadığınızı göremiyorum (mantıklı olarak, performans belirli durumlarda istisnalardan kaçınılması gereken bir sorun olduğunda görebiliyorum ).
Ben birçok durumda if-yapılar daha açıktır ve yöntemin herhangi bir sözleşme kırmak değil düşünüyorum.
IMHO, “Bunları asla düzenli program akışı için kullanmayın” reaksiyonu, herkesin sahip olduğu görünüşte, bu reaksiyonun gücü haklı çıkarabileceği kadar iyi bir yapıya sahip değildir.
Yoksa yanılıyor muyum?
Her türlü özel durumla ilgilenen diğer yazıları okudum, ama benim açımdan, ikiniz de yanlış bir şey yok:
- Açık
- Yönteminizin sözleşmesini onurlandırın
Vur beni.
if
belirtin. Bunu çok zor bulacaksınız. Başka bir deyişle: öncülünüz kusurludur ve bundan çıkardığınız sonuçlar yanlıştır.