En iyi açıklama olmadan boş dilde
Bu yüzden sık sık her zaman programcılar hataları null/null istisnalar biri olmadan biz ne sorar şikayet ediyor.
Seçenek türleri serinlik bazı temel bir fikrim yok, ama bilgi ya da dil en iyi ifade etme becerisi yok. Bir şeydirharikaaşağıda, bir şekilde o kişiye karşı işaret bu, ortalama bir programcı için cana yazılı açıklama?
- Varsayılan olarak başvurular işaretçiler null olmak/sahip olma undesirability
- Nasıl seçenek türlerini kontrol boş kutu gibi hafifletmek için stratejiler içeren bir çalışma
- aynı model ve
- monadic kapsam
- Mesaj nil yemek gibi alternatif çözüm
- (özledim diğer yönleri)
CEVAP
Null istenmeyen neden kısa ve öz bir özet olduğunu düşünüyorumanlamsız Birleşik Devletleri gösterilebilir olmamalıdır.
Modelleme bir odada olduğumu varsayalım. Şu üç durumdan birinde olabilir: açık, kapalı ama kilitli ve kapalı ve kilitli. Şimdi sıra bu modeli deneyeyim
class Door
private bool isShut
private bool isLocked
ve bu iki boolean değişkenleri üç Birleşik Devletleri harita nasıl açıktır. Ama bu dördüncü, istenmeyen bir durumu mevcut yapraklar: isShut==false && isLocked==true
. Benim temsili olarak seçtim türleri bu durumu itiraf çünkü, sınıfı asla bu durumu içine alır sağlamak için zihinsel çaba (açıkça bir sabit kodlama belki) tüketmek zorundayım. Eğer veri türleri veya kontrol numaralandırma cebirsel bir dil kullanarak olsam bunun aksine, bu beni tanımlamak sağlar
type DoorState =
| Open | ShutAndUnlocked | ShutAndLocked
sonra da tanımlayabiliriz
class Door
private DoorState state
ve daha fazla endişe yok. Tür sistemi class Door
bir örneği için sadece üç olası durum vardır emin olun. Bu tür sistemler iyi - açıkça derleme zamanı hataları bütün bir sınıf ekarte edilir.
null
ile sorun her referans türü genellikle istenmeyen olduğunu onun uzayda bu ekstra hal alır. string
bir değişken herhangi bir karakter dizisi olabilir, ya da sorun benim bölgeme göster yok null
bu çılgın ekstra değer olabilir. Triangle
nesne üç Point
ler, kendilerini var X
Y
değerleri, ama ne yazık ki Point
s veya Triangle
kendisi olabilir bu çılgın null değer anlamsızdır grafik etki çalışıyorum. Vb.
Muhtemelen var olmayan bir değer model için niyetinde, sonra içine açıkça tercih edilmelidir. Eğer bu şekilde niyetindeyim için model insanlar her Person
FirstName
LastName
ama sadece bazı insanlar var MiddleName
s, o zaman demek isterdim gibi bir şey
class Person
private string FirstName
private Option<string> MiddleName
private string LastName
string
burada null olmayan bir tip olduğu varsayılır. Sonra kurmak zor değişmezler vardır ve hiç beklenmedik NullReferenceException
birinin adı uzunluğunu hesaplamak için çalışırken. Bu tür sistemi sağlar herhangi bir kod ile ilgilenmek MiddleName
hesapları için mümkün olmak None
, ise herhangi bir kod ile ilgilenmek FirstName
güvenle varsayalım bir değeri yok.
Örneğin, yukarıda türünü kullanarak, bu aptalca işlevi yazar.
let TotalNumCharsInPersonsName(p:Person) =
let middleLen = match p.MiddleName with
| None -> 0
| Some(s) -> s.Length
p.FirstName.Length middleLen p.LastName.Length
Hiçbir endişe ile. Buna karşılık, string gibi türler için null referansı olan bir dil, sonra da varsayarsak
class Person
private string FirstName
private string MiddleName
private string LastName
up gibi şeyler yazma
let TotalNumCharsInPersonsName(p:Person) =
p.FirstName.Length p.MiddleName.Length p.LastName.Length
eğer gelen Kişi, nesne patlar her şey boş olmayan olmanın değişmeyen bir etkisi olmuyor ya
let TotalNumCharsInPersonsName(p:Person) =
(if p.FirstName=null then 0 else p.FirstName.Length)
(if p.MiddleName=null then 0 else p.MiddleName.Length)
(if p.LastName=null then 0 else p.LastName.Length)
ya da belki de
let TotalNumCharsInPersonsName(p:Person) =
p.FirstName.Length
(if p.MiddleName=null then 0 else p.MiddleName.Length)
p.LastName.Length
p
ilk/son var ama orta sağlar varsayarak boş olabilir, ya da belki kim bilir istisnalar, ya da farklı türde atmak denetler. Düşünmek için tüm bu çılgın uygulama seçenekleri ve şeyler istiyorum ya da İhtiyacınız olmayan bu aptal gösterilebilir değeri var çünkü çıkabilirler.
Boş genellikle gereksiz karmaşıklık ekler.Karmaşıklık tüm yazılım düşmanıdır ve karmaşıklığı zaman makul azaltmak için gayret göstermelisiniz.
(Hatta bu basit örnekleri için daha karmaşık olduğunu da unutmayın. Bile FirstName
olamaz null
string
temsil ""
(boş dize), ki muhtemelen de bir kişi adı amaçlıyoruz model. Null olmayan dizeleri ile gibi, hala bulunduğumuz durum olabilir "anlamsız değerleri temsil eden". Yine de değişmezler ve koşullu kod üzerinden bu savaş türü sistemi (NonEmptyString
bir tür olması gibi) kullanarak çalışma zamanında, ya da seçebilirsiniz. İkincisi belki de sakıncalı ("iyi" tür genellikle "kapalı" üzerine bir dizi ortak operasyonlar, örneğin NonEmptyString
değil kapalı .SubString(0,0)
), ama şunu gösteriyor ki daha fazla puan tasarım alanı. Herhangi bir tür sistem günün sonunda, sadece özünde zor kurtulmak için kurtulmak ve diğer karmaşıklığı almak çok iyi olacak biraz karmaşıklık var. Bu konu için anahtar yaklaşık olarakheryazın sistem değişikliği "başvuruları varsayılan olarak null" "null olmayan kaynaklar tarafından varsayılan" hemen hemen her zaman basit bir değişiklik yapar, bu tür bir sistem çok daha iyi mücadele karmaşıklığı ve iktidar belirli tip hataları ve anlamsız Birleşik Devletleri. Bir sürü dil tekrar ve tekrar bu hatayı tekrarlamaya devam et bu çok saçma.)
Neden yok C# izin ver {} önceki bir aç...
Java dönüştürmek.açıklama.JodaTime içi...
Nasıl başka bir dizine cd dir proje ol...
Fark arasında bahar @Denetleyicisi ve ...
Algoritma nasıl olumlu ya da olumsuz b...