Doğru null kullanarak
Kullanmanın farklı yolları var null. En yaygın ve anlamsal olarak doğru yol, tek bir değere sahip olabileceğinize veya sahip olamayacağınız zaman kullanmaktır . Bu durumda, bir değer ya nullveri tabanındaki bir kayıt gibi bir şeye eşittir veya buna benzer bir şeydir.
Bu durumlarda, daha sonra çoğunlukla bu şekilde kullanın (sözde kodda):
if (value is null) {
doSomethingAboutIt();
return;
}
doSomethingUseful(value);
Sorun
Ve çok büyük bir problemi var. Sorun şu ki, çağıracağınız zaman doSomethingUseful, değeri kontrol etmemiş olabilirsiniz null! Öyle değilse, program muhtemelen çökecektir. Ve kullanıcı, "korkunç hata: aranan değer ama boş aldı!" Gibi bir şeyle bırakılarak, iyi bir hata mesajı bile görmeyebilir. (güncellemeden sonra: Segmentation fault. Core dumped.bazı durumlarda null hakkında hiçbir hata ve yanlış manipülasyon gibi , hatta daha da kötüsü gibi daha az bilgilendirici bir hata olsa da)
Durumlar için çek yazmayı nullve işlemeyi unutmak oldukça yaygın bir hatadır . Bu nedenle , 2009'da QCon Londra adlı bir yazılım konferansında, 1965'te milyar dolarlık bir hata yaptığını söyleyen Tony Hoare’in :
https://www.infoq.com/presentations/Null-References-The-Billion-Dollar- hata-Tony-Hoarenullnull
Sorunu önlemek
Bazı teknolojiler ve diller nullfarklı şekillerde unutmayı imkansız hale getirir ve böcek miktarını azaltır.
Örneğin Haskell, Maybeboş değer yerine monad'a sahiptir. Bunun DatabaseRecordkullanıcı tarafından tanımlanan bir tür olduğunu varsayalım . Haskell'de bir tür değer Maybe DatabaseRecordeşit Just <somevalue>veya eşit olabilir Nothing. Daha sonra farklı şekillerde kullanabilirsiniz, ancak nasıl kullanıyor olursanız olun, Nothingbilmeden bazı işlemleri uygulayamazsınız .
Örneğin, çağrılan bu işlev için ve için zeroAsDefaultdöndürür :xJust x0Nothing
zeroAsDefault :: Maybe Int -> Int
zeroAsDefault mx = case mx of
Nothing -> 0
Just x -> x
Christian Hackl, C ++ 17 ve Scala'nın kendi yöntemlerinin olduğunu söylüyor. Dolayısıyla, dilinizde böyle bir şey olup olmadığını öğrenmeyi denemek isteyebilirsiniz.
Null hala geniş kullanımda
Daha iyi bir şeyiniz yoksa kullanmak nulliyidir. Sadece izlemeye devam et. İşlevlere bildirim yazın, yine de size yardımcı olacaktır.
Ayrıca bu çok ilerici görünmeyebilir ancak meslektaşlarınızın kullanmak nullveya başka bir şey isteyip istemediğinizi kontrol etmeniz gerekir . Muhafazakar olabilir ve bazı nedenlerden dolayı yeni veri yapılarını kullanmak istemeyebilirler. Örneğin bir dilin daha eski sürümlerini desteklemektedir. Bu tür şeyler projenin kodlama standartlarında ilan edilmeli ve ekiple uygun şekilde tartışılmalıdır.
Teklifin üzerine
Ayrı bir boole alanı kullanmanızı öneririz. Ama yine de kontrol etmelisin ve yine de kontrol etmeyi unutabilirsin. Yani burada kazanılan hiçbir şey yok. Başka bir şeyi bile unutabilirseniz, her seferinde her iki değeri de güncellemek gibi, o zaman daha da kötüdür. Kontrol etmeyi unutma sorunu nullçözülmediyse, bunun anlamı yoktur. Sakınmak nullzordur ve onu daha da kötüleştirecek şekilde yapmamalısınız.
Null kullanılmaz
Son olarak nullyanlış kullanmanın yaygın yolları vardır . Bu yollardan biri, diziler ve dizgiler gibi boş veri yapıları yerine kullanmaktır. Boş bir dizi, diğerleri gibi uygun bir dizidir! Birden fazla değere uyan, boş olabilen, yani 0 uzunluğa sahip veri yapıları için hemen hemen her zaman önemli ve kullanışlıdır.
Cebir açısından, dizgiler için boş bir dize, sayılar için 0'a çok benzer, yani kimlik:
a+0=a
concat(str, '')=str
Boş dize, dizelerin genel olarak monoid hale gelmesini sağlar:
https://en.wikipedia.org/wiki/Monoid
Bunu elde edemezseniz, sizin için o kadar önemli değildir.
Şimdi bu örnekle programlama için neden önemli olduğunu görelim:
for (element in array) {
doSomething(element);
}
Burada boş bir dizi geçirirsek kod iyi çalışır. Sadece hiçbir şey yapmaz. Ancak bir nullburadan geçersek, "null üzerinden geçemiyorum, üzgünüm" gibi bir hatayla karşılaşacağız. İçeri sarabiliriz ifama bu daha az temiz ve tekrar, kontrol etmeyi unutabilirsin
Null nasıl kullanılır
Yapması doSomethingAboutIt()gereken ve özellikle de bir istisna atıp atmaması gerekip gerekmediği bir başka karmaşık konudur. Kısacası null, verilen bir görev için kabul edilebilir bir girdi değerinin olup olmadığına ve bunun cevabında beklenenin ne olduğuna bağlıdır . İstisnalar, beklenmeyen olaylar içindir. Bu konuya daha fazla girmeyeceğim. Bu cevap çok uzun zamandır.
std::optionalveya kullanırsınızOption. Diğer dillerde, kendinize uygun bir mekanizma inşa etmeniz gerekebilirnullya da daha deyimsel olduğu için aslında buna benzer bir şeye başvurabilirsiniz .