SORU
21 EKİM 2010, PERŞEMBE


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
21 EKİM 2010, PERŞEMBE


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 üç Pointler, kendilerini var X Y değerleri, ama ne yazık ki Points 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 MiddleNames, 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 NullReferenceExceptionbirinin 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.)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CorridorDigital

    CorridorDigi

    17 Mayıs 2010
  • FD2097

    FD2097

    21 HAZİRAN 2009
  • jeffisthecoolguy

    jeffisthecoo

    17 HAZİRAN 2013