SORU
8 NİSAN 2009, ÇARŞAMBA


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

  1. Temizleyin
  2. Senin yöntemin sözleşme onur

Vur beni.

CEVAP
8 NİSAN 2009, ÇARŞAMBA


İ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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • cyriak

    cyriak

    29 Mart 2006
  • Michael Neal

    Michael Neal

    2 Mayıs 2009
  • NYLON Video

    NYLON Video

    11 Aralık 2006