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 null
veri 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ı null
ve 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-Hoarenull
null
Sorunu önlemek
Bazı teknolojiler ve diller null
farklı şekillerde unutmayı imkansız hale getirir ve böcek miktarını azaltır.
Örneğin Haskell, Maybe
boş değer yerine monad'a sahiptir. Bunun DatabaseRecord
kullanıcı tarafından tanımlanan bir tür olduğunu varsayalım . Haskell'de bir tür değer Maybe DatabaseRecord
eşit Just <somevalue>
veya eşit olabilir Nothing
. Daha sonra farklı şekillerde kullanabilirsiniz, ancak nasıl kullanıyor olursanız olun, Nothing
bilmeden bazı işlemleri uygulayamazsınız .
Örneğin, çağrılan bu işlev için ve için zeroAsDefault
döndürür :x
Just x
0
Nothing
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 null
iyidir. 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 null
veya 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 null
zordur ve onu daha da kötüleştirecek şekilde yapmamalısınız.
Null kullanılmaz
Son olarak null
yanlış 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 null
buradan geçersek, "null üzerinden geçemiyorum, üzgünüm" gibi bir hatayla karşılaşacağız. İçeri sarabiliriz if
ama 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::optional
veya kullanırsınızOption
. Diğer dillerde, kendinize uygun bir mekanizma inşa etmeniz gerekebilirnull
ya da daha deyimsel olduğu için aslında buna benzer bir şeye başvurabilirsiniz .