SORU
19 Kasım 2008, ÇARŞAMBA


Ne kadar boş kontrol yeterli mi?

O zaman için bazı kurallar vardırdeğilgerekli bir null için kontrol etmek?

Olarak çalıştığım miras kodu çok geç-Çek boş bıktıracak. API çağrıları üzerine önemsiz işlevleri, null kontrolleri Null denetleyen devlet null döndürür, vb. Bazı durumlarda, boş çekler makul ama pek çok yerde null makul bir beklenti değil.

Duydum sayıda bağımsız değişken olarak değişen "güvenemezsin diğer kodu" için "her ZAMAN programı savunma" yapmak "Kadar dil garanti bana bir boş olmayan değer, ben her zaman kontrol edecek." Ben kesinlikle bir noktaya kadar bu ilkelerin pek çoğu ile katılıyorum, ama boş kontrol aşırı genellikle bu ilkeleri ihlal eden başka problemlere neden buldum. İnatçı null kontrolü gerçekten değer mi?

Sık sık, aşırı null kontrolü ile kodları aslında daha düşük kaliteli, yüksek kaliteli olarak gördüm. Kod çok geliştirici diğer önemli özellikleri, okunabilirlik, doğruluk, veya özel durum işleme gibi gözden kaybolmuş boş Çek odaklanmış gibi görünüyor. Özellikle, bir sürü kod std görmezden görüyorum::bad_alloc istisnası, ama bir boş Çek new.

C , bir dereceye kadar bu boş bir işaretçi kaldırma öngörülemeyen davranışları nedeniyle anlamak; null başvuru (daha düzgün bir şekilde Java, C#, Python, vb işlenir. Sadece uyanık yoksul-örnekler gördüm null denetleme var ya orada gerçekten bir şey mi?

Bu soru dil agnostik olmak üzere, başlıca ilgi olsam da C , Java, ve C#.

< / ^ hr .

Bu gördüğüm boş kontrol bazı örnekler gibi görünüyoraşırıaşağıdakileri içerir:

< / ^ hr .

Bu örnek C spec başarısız bir yeni bir istisna atar dediği gibi standart olmayan Derleyiciler için hesap gibi görünüyor. Açıkça uyumsuz Derleyiciler destek olduğunuz sürece, bu mantıklı mı? Bu yaparherhangi birJava gibi yönetilen bir dilde anlamı ya da C# (hatta C /CLR)?

try {
   MyObject* obj = new MyObject(); 
   if(obj!=NULL) {
      //do something
   } else {
      //??? most code I see has log-it and move on
      //or it repeats what's in the exception handler
   }
} catch(std::bad_alloc) {
   //Do something? normally--this code is wrong as it allocates
   //more memory and will likely fail, such as writing to a log file.
}

< / ^ hr .

Başka bir örnek, iç kod üzerinde çalışırken. Eğer kendi geliştirme uygulamalarını tanımlayabilir olan küçük bir ekip ise özellikle, bu gereksiz gibi görünüyor. Bazı projeler veya eski kod, güvenen belgeleri makul olmayabilir... ama yeni kod için sizin ya da ekibinizin bu denetimleri, bu gerçekten gerekli mi?

Görmek ve güncelleştirmek için bir yöntem (veya sorumlu geliştirici bağırmadan) bir sözleşme varsa, hala boşluk kontrol etmek için gerekli mi?

//X is non-negative.
//Returns an object or throws exception.
MyObject* create(int x) {
   if(x<0) throw;
   return new MyObject();
}

try {
   MyObject* x = create(unknownVar);
   if(x!=null) {
      //is this null check really necessary?
   }
} catch {
   //do something
}

< / ^ hr .

Özel ya da başka bir iç fonksiyonu geliştirirken, gerçekten açıkça sözleşmede boş olmayan değerler için çağırdığında boş işlemek için gerekli olan tek ben miyim? Neden boş bir onay savunmak için bir tercih olur?

(belli ki, kamu API, boş çekler kaba hatalı API kullanarak kullanıcıların bağırmak için olduğu gibi hayati önem taşır)

//Internal use only--non-public, not part of public API
//input must be non-null.
//returns non-negative value, or -1 if failed
int ParseType(String input) {
   if(input==null) return -1;
   //do something magic
   return value;
}

Göre:

//Internal use only--non-public, not part of public API
//input must be non-null.
//returns non-negative value
int ParseType(String input) {
   assert(input!=null : "Input must be non-null.");
   //do something magic
   return value;
}

CEVAP
19 Kasım 2008, ÇARŞAMBA


Küçük bir ekip olabilir ve siz bu arada o yazdığınız kodunuzu bugün hatırlanması gereken bir şey bir başkasını korumak zorunda kalacağını iyi belgelere sahip, eski kod dönüşecek. Aşağıdaki kuralları kullanın:

  1. Eğer başkaları için kullandığı ortak bir API yazıyorum, o zaman tüm başvuru parametreleri null kontrolleri yapacağım.

  2. Eğer benim uygulama için dahili bir bileşen yazıyorum, boş olduğunda özel bir şey yapmak istiyorum, ya da çok net yapmak istediğimde boş Çek yazıyorum. Yoksa neler olduğunu da oldukça net olduğu bir null başvuru özel durumu almamın bir sakıncası yok.

  3. Diğer halklar çerçeveler dönüş veri ile çalışırken, mümkün ve geçerli bir boş döndü o zaman sadece null için kontrol edin. Eğer sözleşme değerlere dönüş yok diyorsa, hesabı yapmayacağım.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • calicoJake

    calicoJake

    29 EKİM 2007
  • 趣味そうこ♪

    趣味そう

    3 Mart 2010
  • MagmaRhino

    MagmaRhino

    16 Temmuz 2011