Neden kontrol düzenli akışı gibi özel durumlar kullanmak değil mi?
Standart cevaplar üzerine Google'dan araştırdım da olurmuş önlemek için, hepinizin de saldırabilir bir örnek sunacağım.
C# (ve de diğerleri) türlerinin bol Java var bazıları ‘taşma’ davranışı hiç hoşuma gitmiyor (e.örneğin type.MaxValue type.SmallestValue == type.MinValue
g : int.MaxValue 1 == int.MinValue
).
Ama, vahşi doğa benim gördüğüm, diyelim DateTime
Geçersiz bir türü için bu davranış genişleterek bu yaralanma için bazı hakaret ekleyeceğim. (DateTime
mühürlü olduğunu biliyorum .Ama bu örnek için, tam olarak C gibi sözde bir dil kullanıyorum#, NET DateTime mühürlü olmadığı gerçeği dışında).
Add
geçersiz kılınmış yöntemi:
/// <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 eğer çözmek bu kadar kolay, ama bir gerçek varki o sadece başarısız olmasına neden yapamadın kullanmak özel durumlar (mantıklı olduğunu görebiliyorum performans sorunu olan bazı özel durumlar kaçınılmalıdır).
Birçok durumda ise yapıları daha net ve yöntemi yapıyor herhangi bir sözleşme sonu yok bence.
“Hiçbir zaman düzenli bir program akışı için bunları kullanmak herkes iyi tepki gücü haklı olarak underbuild. var gibi görünüyor” tepki IMHO
Yoksa yanılıyor muyum?
Diğer Mesajlar, Özel durumlarda her türlü ile ilgili çok şey okudum, ama demek istediğim, eğer her ikisi de varsa onunla yanlış bir şey var
- Temizleyin
- Senin yöntemin sözleşme onur
Vur beni.
CEVAP
İstisnalar temelde ikincisi tüm sonuçları ile yerel olmayan goto
ifadeleri. Akış kontrolü için kullanan özel durumlar principle of least astonishment, programları okumak çok zor programlar programcılar için yazılmış ilk hatırlıyorum) bir ihlal.
Ayrıca bu derleyici satıcıları neler bekliyor. Özel durumlar nadiren atılmayı bekliyorlar, ve genellikle throw
kod oldukça verimsiz olsun. Atma istisnalar en pahalı işlemlerden biridir .NET.
Ancak, bazı dillerde (özellikle) Python akış kontrol yapıları gibi özel durumlar kullanın. Örneğin, kullanımına daha fazla öğe varsa hayır StopIteration
bir istisna yükseltmek. Hatta standart dil yapıları (for
) Bu güveniyor.
Neden eğer sözlük anahtarı varsa kontr...
Kontrol özel durumlar karşı dava...
Neden Python'In 'gizli'...
Neden bir WordPress kullanmak'ler...
Neden bu tür özel özel alanlar, örnek ...