Neden çoğu “iyi bilinen” zorunlu / OO dili, 'hiçbir şey' değeri gösterebilecek türlere denetlenmeden erişime izin veriyor?


29

(Un) nullyerine (örneğin) sahip olmanın kolaylığını okudum Maybe. Bu makaleyi okuduktan sonra , kullanmanınMaybe (veya benzeri bir şey) daha iyi olacağına ikna oldum . Bununla birlikte, tüm "iyi bilinen" zorunlu veya nesne yönelimli programlama dillerinin (hala null'hiçbir şey' değerini temsil edebilecek türlere denetlenmeyen erişime izin veren) Maybekullandığını ve çoğunlukla işlevsel programlama dillerinde kullanıldığını görünce şaşırdım .

Örnek olarak, aşağıdaki C # koduna bakın:

void doSomething(string username)
{
    // Check that username is not null
    // Do something
}

Burada bir şeyler kötü kokuyor ... Argüman boş olup olmadığını neden kontrol etmeliyiz? Her değişkenin bir nesneye referans içerdiğini varsaymalı mıyız? Gördüğünüz gibi, sorun tanımı gereği hemen hemen tüm değişkenlerin boş bir başvuru içermesidir. Hangi değişkenlerin "null" olduğuna ve hangilerinin olmayacağına karar verebilirsek ne olur ? Hata ayıklama ve bir "NullReferenceException" ararken bu bize çok çaba sarfeder. Varsayılan olarak hiçbir türün boş başvuru içeremeyeceğini hayal edin . Bunun yerine, bir değişkene yalnızca gerçekten ihtiyaç duyduğunuzda boş bir başvuru içerebileceğini açıkça belirtirsiniz . Belki arkasındaki fikir budur. Bazı durumlarda başarısız olan bir işleve sahipseniz (örneğin sıfıra bölme),Maybe<int>, açıkça sonucun bir int olabileceğini, ancak aynı zamanda hiçbir şey olamayacağını da belirterek! Bu, belki null yerine tercih etmek için bir nedendir . Daha fazla örnekle ilgileniyorsanız, bu makaleyi okumanızı öneririm .

Gerçekler, çoğu türü varsayılan olarak null yapmanın dezavantajlarına rağmen, OO programlama dillerinin çoğunun aslında yaptığı gibi. Bu yüzden merak ediyorum:

  • nullProgramlama dilinizde yerine ne tür argümanlar uygulamanız gerekir Maybe? Nedenler var mı yoksa sadece "tarihi bagaj" mı?

Lütfen bu soruyu cevaplamadan önce null ve Belki arasındaki farkı anladığınızdan emin olun.


3
Tony Hoare hakkında , özellikle milyar dolarlık hatasını okumayı öneririm .
Oded

2
Bu onun sebebiydi. Ve talihsiz sonuç, bugüne kadar takip eden birçok dile kopyalanmış bir hatadır. Orada olan diller nullonun kavram yoktur ya da (IIRC Haskell böyle bir örneğidir).
53'te Oded

9
Tarihi bagaj, hafife alınacak bir şey değildir. Bunların üzerine kurulu olan işletim sistemlerinde nulluzun zamandan beri var olan dillerde yazılmış olduğunu unutmayın . Bunu düşürmek kolay değil.
Oded

3
Bence, bir link göndermek yerine, Belki de kavramına ışık tutmalısın.
JeffO

1
@ GlenH7 C # 'daki dizeler referans değerleridir (boş olabilirler). İnt'nin ilkel bir değer olduğunu biliyorum, ama belki kullanımını göstermek faydalı oldu.
aochagavia

Yanıtlar:


15

Öncelikle tarihi bir bagaj olduğuna inanıyorum.

En belirgin ve en eski dil nullC ve C ++ dilleridir . Ama burada nullmantıklı. İşaretçiler hala oldukça sayısal ve düşük seviye bir konsepttir. Ve bir başkasının söylediği gibi, C ve C ++ programcılarının zihniyetinde, açıkça bu göstergenin açıklanabileceğini söylemek zorunda olmak bir nullanlam ifade etmiyor.

İkinci sırada Java geliyor. Java geliştiricileri, C ++ 'ya en yakın olanı bulmaya çalıştıklarını düşünürler, böylece C ++' dan Java 'ya geçişi daha basit hale getirebilirlerdi, muhtemelen bu tür bir dil kavramı ile uğraşmak istemiyorlardı. Ayrıca, açık uygulama nullçok daha fazla çaba gerektirecektir, çünkü boş olmayan referansın başlangıçtan sonra doğru bir şekilde ayarlanıp ayarlanmadığını kontrol etmeniz gerekir.

Diğer tüm diller Java ile aynıdır. Genellikle C ++ veya Java'nın yaptığı gibi kopyalarlar ve nullreferans türlerinin temel kavramının ne kadar temel olduğu dikkate alındığında, açık bir dil kullanan bir tasarım yapmak gerçekten zorlaşır null.


“Muhtemelen dilin temel kavramlarıyla uğraşmak istemediler.” Zaten işaretçileri tamamen kaldırdılar, aynı zamanda kaldırmanın nullbir değişim kadar büyük olmayacağını düşünüyorum.
svick

2
@svick Java için referanslar işaretçilerin yerine geçer. Ve birçok durumda, C ++ 'daki işaretçiler Java referanslarında olduğu gibi kullanıldı. Hatta bazı insanlar, Java'nın işaretçilerine sahip olduğunu iddia ediyor ( programmers.stackexchange.com/questions/207196/… )
Euphoric

Bunu doğru cevap olarak işaretledim. Oy vermek isterim ama yeterli itibarım yok.
aochagavia

1
Anlaşmak. C ++ 'da (Java ve C'den farklı olarak), null yapabilmenin istisna olduğunu unutmayın. std::stringolamaz null. int&olamaz null. Bir int*kutu ve C ++, iki nedenden ötürü denetlenmeyen erişime izin verir: 1. C çünkü ve 2. C ++ 'da ham işaretçiler kullanırken ne yaptığınızı anlamanız gerektiği için.
MSalters

@ MSalters: Eğer bir tür bit kodlu bir varsayılan değere sahip değilse, bu tip bir dizi oluşturmak, dizinin kendisine erişime izin vermeden önce her eleman için bir kurucu çağırmayı gerektirir. Bu, işe yaramaz bir çalışma gerektirebilir (eğer bazı unsurlar veya bütün unsurlar okunmadan önce üzerine yazılacaksa), daha sonraki bir elemanın kurucusu daha önceki bir eleman yapıldıktan sonra başarısız olursa ve yine de çok fazla sonuç vermeyebilirse, komplikasyonlar ortaya çıkabilir. bazı dizi öğeleri için uygun bir değer, diğerlerini okumadan belirlenemedi).
supercat

15

Aslında, nullharika bir fikir. Bir işaretçi verildiğinde, bu işaretçinin geçerli bir değere referans göstermediğini belirtmek isteriz. Bu yüzden bir hafıza yeri alırız, geçersiz ilan ederiz ve bu sözleşmeye sadık kalırız (bazen segfaults ile uygulanan bir kongre). Şimdi ne zaman bir işaretçiye sahip olduğumu Nothing( ptr == null) veya Some(value)( ptr != null, value = *ptr) içerip içermediğini kontrol edebilirim . Bunun bir Maybetüre eşit olduğunu anlamanı istiyorum .

Bununla ilgili sorunlar:

  1. Birçok dilde, tür sistemi boş olmayan bir referansı garanti etmek için burada yardımcı olmaz.

    Bu, çoğu ana zorunluluk veya OOP dilinin, öncekilerle karşılaştırıldığında tip sistemlerinde yalnızca artan ilerlemelere sahip olması nedeniyle, tarihi bir bagajdır. Küçük değişiklikler, yeni dillerin öğrenilmesinin daha kolay olması avantajına sahiptir. C #, boş değerleri daha iyi ele almak için dil seviyesi araçları tanıtan bir ana dildir.

  2. API tasarımcıları nullbaşarısızlıkla sonuçlanabilir, ancak başarıda gerçekleşen şeyin kendisine referans olmayabilir. Genellikle, bir şey (referans olmadan) doğrudan iade edilir. Bir işaretçi seviyesinin bu şekilde düzleştirilmesi, nullbir değer olarak kullanılmasını imkansız kılar .

    Bu tasarımcının tarafında sadece tembellik ve uygun bir tür sistemi ile doğru yuvalama zorlamadan yardım edilemez. Bazı insanlar da bunu performansla ilgili hususlarda veya isteğe bağlı kontrollerin varlığında haklı çıkarmaya çalışabilir (bir koleksiyon geri dönebilir nullveya ürünün kendisi olabilir, ancak bir containsyöntem de sağlayabilir ).

  3. Haskell'de Maybetipe bir monad olarak düzgün bir görünüm vardır . Bu, dönüştürülen değeri içerilen değer üzerinde oluşturmayı kolaylaştırır.

    Öte yandan, C gibi düşük seviyeli diller dizileri ayrı bir tür olarak görmezler, bu yüzden ne beklediğimizden emin değilim. Parametreli polimorfizmi olan OOP dillerinde, çalışma zamanı tarafından kontrol edilen bir Maybetürün uygulanması oldukça önemsizdir.


“C #, boş başvurulardan uzaklaşıyor.” Bunlar hangi adımlar? Dilde yapılan değişikliklerde böyle bir şey görmedim. Yoksa ortak kütüphanelerin nullgeçmişte olduğundan daha az kullandıklarını mı kastediyorsunuz ?
svick

@svick Benim açımdan kötü ifadeler. “ C # nulls'yi daha iyi idare etmek için dil seviyesi araçları tanıtan bir ana dildir ” - NullableTürlerden ve ??varsayılan operatörden bahsediyorum . Bu, şu anda eski kodun varlığında sorunu çözmez, ancak daha iyi bir gelecek için bir adımdır.
amon

Sana katılıyorum. Cevabını kadar oy vereceğini ama enought üne yok :( Ancak, null ilkel türleri için çalışır sadece biraz adımdır Yani..
aochagavia

1
@svick Nullable'ın bununla hiçbir ilgisi yok. Programcının açıkça tanımlamasını sağlamak yerine, örtük olarak boş değere izin veren tüm referans türlerinden bahsediyoruz. Ve Nullable yalnızca değer türlerinde kullanılabilir.
Öforik

@Euphoric Bence senin yorumunun amon'a bir cevap olduğunu düşünmüştüm, bahsetmedim Nullable.
saat

9

Anladığım kadarıyla nullprogramlama dillerini meclisten soyutlamak için gerekli bir yapıydı. 1 Programcılar bir işaretçi veya kayıt değerinin olduğunu not a valid valueve nullbu anlam için ortak terim olduğunu belirtme yeteneğine ihtiyaç duyuyorlardı .

nullSadece bir kavramı temsil eden bir kongre noktası olan noktayı güçlendirmek için nullkullanılan gerçek değer programlama dili ve platforma bağlı olarak değişebilir.

Yeni bir dil tasarlıyorsanız ve nullkullanmaktan kaçınmak maybeyerine kullanmak istiyosanız, niyetini belirtmek not a valid valueveya navvbelirtmek gibi daha açıklayıcı bir terim öneririm. Ancak, bu değer olmayanın adı , değerlerin kendi dilinizde var olmasına bile izin vermeniz gerekip gerekmediğinden ayrı bir kavramdır .

Bu iki noktadan herhangi birine karar vermeden önce maybe, sisteminiz için ne anlama geleceğini tanımlamanız gerekir . Bunun nullanlamını sadece yeniden adlandırdığını not a valid valueveya diliniz için farklı bir anlam ifade ettiğini görebilirsiniz.

Aynı şekilde, nullerişim veya başvuruya karşı erişimi kontrol edip etmediğine dair karar, dilinizin başka bir tasarım kararıdır.

Biraz tarih sağlamak için C, programcıların hafızayı değiştirirken ne yapmaya çalıştıklarını anladıklarına dair kesin bir varsayım vardı. Montaj ve önündeki zorunlu diller için üstün bir soyutlama olduğundan, programcının yanlış bir referanstan güvenli bir şekilde korunma fikrinin akıllarına gelmediğini düşünürdüm.

Bazı derleyicilerin veya ek araçlarının geçersiz işaretçi erişimine karşı bir kontrol önlemi sağlayabileceğine inanıyorum. Böylece diğerleri bu potansiyel konuyu not etmiş ve buna karşı korunmak için önlemler almıştır.

Buna izin verip vermemeniz, dilinizin neyi başarmasını istediğinize ve dilinizin kullanıcılarına ne derece sorumluluk vermek istediğinize bağlıdır. Ayrıca, bu tür davranışları sınırlandırmak için bir derleyici oluşturma yeteneğinize de bağlıdır.

Yani sorularınızı cevaplamak için:

  1. “Ne tür argümanlar…” - Peki, dilin ne yapmasını istediğine bağlı. Çıplak metal erişimini simüle etmek istiyorsanız, izin vermek isteyebilirsiniz.

  2. "Bu sadece tarihi bir bagaj mı?" Belki de belki de değil. nullelbette bir çok dil için bir anlamı vardı / vardır ve bu dillerin ifadesini yönlendirmeye yardım eder. Tarihsel emsal daha yeni dilleri ve onların izinlerini etkilemiş olabilir, nullancak ellerinizi el sallamak ve kavramı işe yaramaz tarihsel bagaj olarak ilan etmek biraz daha fazla.


1 Boş değerler ve nesne yönelimli diller için Hoare'e kredi verilse de bu Wikipedia makalesine bakın . Zorunlu dillerin Algol'dan farklı bir soy ağacında ilerlediğine inanıyorum.


Mesele şu ki, C # veya Java'daki değişkenlerin çoğuna boş başvuru atanabilir. Boş referansları yalnızca "Belki" nin referans olmadığını açıkça gösteren nesnelere atamak daha iyi olacak gibi görünüyor. Öyleyse, benim sorum “boş” kavramı ile ilgili, kelime ile değil.
aochagavia

2
“Boş gösterici referansları derleme sırasında hata olarak gösterilebilir” Hangi derleyiciler bunu yapabilir?
15'te

Tamamen adil olmak gerekirse, hiçbir zaman bir nesneye boş bir başvuru atamazsınız ... nesneye yapılan başvuru henüz yoktur (referans hiçbir şeye işaret etmez (0x000000000), ki bu tanım gereğidir null).
mgw854

C99 spec alıntı , boş gösterici değil, boş karakter hakkında konuşuyor , bunlar çok farklı iki kavram.
13'te

2
@ GlenH7 Bunu benim için yapmaz. Kod object o = null; o.ToString();VS2012'de hatalar veya uyarılar olmadan benim için gayet iyi derleniyor. ReSharper bundan şikayet ediyor, ama bu derleyici değil.
svick

7

Alıntı yaptığınız makaledeki örneklere bakarsanız, çoğu zaman Maybekodu kısaltmaz. Kontrol etme ihtiyacını ortadan kaldırmıyor Nothing. Aradaki tek fark, bunu tür sistemi üzerinden yapmayı hatırlatmasıdır.

Not, zorlamak değil "hatırlatmak" diyorum. Programcılar tembel. Eğer bir programcı bir değerin olamayacağına ikna olmuşsa Nothing, Maybekontrol etmeden onaysızlaştırmaya başlayacaklar , tıpkı şimdi boş bir göstergeye başvurdukları gibi. Sonuçta boş gösterici istisnasını "belki boş belki" istisnasına dönüştürürsünüz.

Aynı insan doğası prensibi, programlama dillerinin programcıları bir şeyler yapmaya zorladığı başka alanlarda da geçerlidir. Örneğin, Java tasarımcıları insanları istisnaların çoğunu ele almaya zorlamaya çalıştı; bu durum, istisnaları sessizce görmezden ya da göz ardı eden bir şekilde çoğaltan birçok kazan plakasıyla sonuçlandı.

İşe yaramaz Maybeolan şey, açık kontroller yerine desen eşleştirme ve polimorfizmle çok fazla karar verilmesidir. Örneğin, ayrı işlevler oluşturabilirsiniz processData(Some<T>)ve processData(Nothing<T>)bunlarla yapamazsınız null. Hata işleme fonksiyonunuzu otomatik olarak, fonksiyonların her zaman yukarıdan aşağıya çağrılmak yerine, temkinli olarak değerlendirildiği ve fonksiyonların geçtiği fonksiyonel programlamada çok arzulanan ayrı bir işleve taşır. OOP'de, hata işleme kodunuzu ayırmanın tercih edilen yolu istisnalardır.


Yeni bir OO dilinde arzu edilen bir özellik olacağını düşünüyor musunuz?
aochagavia

Polimorfizmden faydalanmak istiyorsanız, kendiniz uygulayabilirsiniz. Dil desteğine ihtiyacınız olan tek şey, geçersiz olmamak. Bunu kendinize belirtmenin bir yolunu görmeyi çok isterdim, kendinize benzer const, ancak isteğe bağlı hale getirin. Bazı bağlantılı alt düzey kodlar, örneğin bağlantılı listeler gibi, silinemez nesnelerle uygulamak çok can sıkıcı olacaktır.
Karl Bielefeldt

2
Yine de Belki türünü kontrol etmeniz gerekmez. Belki türü bir monaddır , bu yüzden üzerinde işlev görmeli map :: Maybe a -> (a -> b) ve bind :: Maybe a -> (a -> Maybe b)tanımlanmalıdır, böylece bir if else ifadesi kullanarak yeniden yapılanma ile daha fazla hesaplama yapmaya devam edebilirsiniz. Ve getValueOrDefault :: Maybe a -> (() -> a) -> anull halini alabilmenizi sağlar. Açıkça desen eşleştirmesinden çok daha zarif Maybe a.
DetriusXii

1

Maybebir problemi düşünmenin çok fonksiyonel bir yoludur - bir şey vardır ve tanımlanmış bir değeri olabilir veya olmayabilir. Bununla birlikte, nesne yönelimli bir anlamda, bir şey hakkındaki fikrini (değeri olsun veya olmasın) bir nesneyle değiştiririz. Açıkçası, bir nesnenin bir değeri vardır. Olmazsa, nesnenin olduğunu söyleriz null, ancak gerçekten demek istediğimiz, hiçbir nesnenin olmamasıdır. Nesneye gönderdiğimiz referans hiçbir şeye işaret etmez. Çevriliyor Maybebir OO kavramının içine hiçbir şey roman yapar - aslında, bu sadece daha fazla oranda darmadağın kodu için yapar. Değeri için hala boş bir referansa sahip olmanız gerekir.Maybe<T>. Şimdi "belki çek" olarak adlandırılsalar bile, hala boş kontroller yapmalısınız (aslında, daha fazla boş kontrol yapmanız, kodunuzu bozmanız). Elbette, yazarın iddia ettiği gibi daha sağlam bir kod yazacaksınız, ancak bunun sadece durum olduğunu iddia ediyorum, çünkü çoğu zaman gereksiz olan bir çalışma düzeyi gerektiren dili çok daha soyut ve anlaşılır kılıyordunuz. İsteyerek bir süre NullReferenceException alırdım spagetti koduyla uğraşmak yerine belki yeni bir değişkene her giriş yaptığımda bir kontrol yapabilirim.


2
Daha az boş çekle sonuçlanacağını düşünüyorum, çünkü yalnızca bir Belki <T> görüp görmediğinizi kontrol etmeniz ve türlerin geri kalanı için endişelenmenize gerek yok.
aochagavia,

1
@svick bir değer olarak Maybe<T>izin vermek zorundadır null, çünkü değer olmayabilir. Eğer sahipsem Maybe<MyClass>ve bir değeri yoksa, değer alanı boş bir referans içermelidir. Bunun kesin olarak güvenli olması için başka hiçbir şey yok.
mgw854

1
@ mgw854 Elbette var. OO dilinde, Maybeondan kalan iki sınıfla soyut bir sınıf olabilir: Some(değer için bir alana sahip olan) ve None(bu alana sahip olmayan). Bu şekilde, değer asla değildir null.
13'te

6
Varsayılan olarak "iptal edilemezlik" ve Belki <T> ile bazı değişkenlerin her zaman nesne içerdiğinden emin olabilirsiniz. Yani, belki de <T> olmayan tüm değişkenler
aochagavia

3
@ mgw854 Bu değişikliğin amacı geliştirici için etkileyici gücü arttırır. Şu anda, geliştirici her zaman referans veya işaretçinin boş olabileceğini ve kullanılabilir bir değer olduğunu kontrol etmek için kontrol yapması gerektiğini varsaymalıdır. Bu değişikliği uygulayarak geliştiriciye gerçekten geçerli bir değere ihtiyacı olduğunu ve geçerli değerin geçtiğinden emin olmak için derleyici denetimi yaptırdığını söyleme gücü verirsiniz. Ama yine de geliştirici seçeneği vererek, tercih etmek ve bir değer atmamak.
Öforik

1

Kavramı nullkolayca C'ye kadar uzanabilir, ancak problemin olduğu yer burası değildir.

Gündelik seçim dilim C # ve nulltek bir farkla tutardım. C # iki tür tip, değer ve referansa sahiptir . Değerler asla olamaz null, ancak hiçbir değerin tamamen iyi olmadığını ifade edebilmek istiyorum. Bunu yapmak için C # Nullabletürünü kullanır, böylece intdeğer ve int?boş değer olur. Referans türlerinin de çalışması gerektiğini düşünüyorum.

Ayrıca bakınız: Boş başvuru bir hata olmayabilir :

Boş referanslar yararlı ve bazen vazgeçilmezdir (C ++ 'da bir dize döndürürseniz veya döndürmezseniz ne kadar sorun olduğunu düşünün). Hata, boş göstericilerin varlığında değil, tip sisteminin onları nasıl ele aldığına bağlı. Ne yazık ki çoğu dilde (C ++, Java, C #) bunları doğru bir şekilde işlemez.


0

Bunun nedeni işlevsel programlamanın türler , özellikle de nesne yönelimli programlamanın (veya en azından başlangıçta yaptığınız gibi) diğer türleri birleştiren türler (tekiller, birinci sınıf türler, işlevler, monadlar, vs.).

Programlama dillerinin modern versiyonlarından bahsettiğinizi düşünüyorum (C ++, C #, Java), genel olarak herhangi bir genel programlama biçimine sahip olmayan dilleri temel alır (C, C # 1.0, Java 1). Bu olmadan, hala null ve null olmayan nesneler arasında dile bir tür fark yaratabilirsiniz (C ++ referansları gibi, olamaz nullama aynı zamanda sınırlıdır), ama bu daha az doğaldır.


Fonksiyonel programlama durumunda, referans veya işaretçi tiplerinin bulunmadığı durumlarda FP'nin durumudur. FP'de her şey bir değerdir. Bir işaretçi türünüz varsa, "hiçbir şeye işaretçi" demek kolaylaşır.
Öforik

0

Bence temel sebep, bir programın veri bozulmasına karşı "güvenli" hale getirilmesi için nispeten az sayıda boş denetim yapılması gerektiğidir. Bir program, bir dizi öğesinin içeriğini veya geçerli bir referansla yazılmış olması öngörülen başka bir depolama konumunun içeriğini kullanmaya çalışırsa, en iyi sonuç, bir istisna atılmasıdır. İdeal olarak, istisna sorunun tam olarak nerede gerçekleştiğini gösterecektir, ancak boş referans, verilerin bozulmasına neden olabilecek bir yerde saklanmadan önce bir tür istisna ortaya çıkması önemlidir. Bir yöntem ilk önce onu kullanmaya çalışmadan bir nesneyi saklamadığı sürece, bir nesneyi kullanma denemesi - kendi başına - bir tür "boş denetim" oluşturacaktır.

Eğer biri haricinde belirli bir istisnaya neden olmayacak gibi görünen boş bir referansın olmasını sağlamak isterse NullReferenceException, genellikle her yere boş kontroller eklemek gerekecektir. Öte yandan, yalnızca boş bir referansın, önceden yapılmış olanların ötesinde “hasara” yol açmasından önce bir istisna oluşmasını sağlamak genellikle çok az test gerektirecektir - testler genellikle sadece bir nesnenin depolanacağı durumlarda gerekli olacaktır. kullanmaya çalışınca olmadan referans, ve ya boş bir başvuru geçerli bir adres üzerine yazılacağı, ya da programın devletin yanlış anlaşılabilir diğer yönlerine başka kod neden olur. Bu tür durumlar var, ama hepsi bu kadar yaygın değil; yanlışlıkla yapılan en null referanslar çok çabuk yakalanırbirinin onları kontrol edip etmediği .


Bu yazı okumak oldukça zordur (metin duvarı). Sakıncası var düzenleyebilir daha iyi bir şekle ing?
tatarcık

1
@gnat: Bu daha mı iyi?
supercat

0

" Maybe," yazıldığı gibi, sıfırdan daha yüksek bir yapıdır. Tanımlamak için daha fazla kelime kullanmak, Belki de "bir şeye işaretçi veya hiçbir şeye işaretçi değil, ama derleyiciye hangisine karar vermesi için yeterli bilgi henüz verilmemiş." Bu, yazdığınız koda ayak uyduracak kadar akıllı bir derleyici özelliği oluşturmadığınız sürece, her bir değeri sürekli olarak açıkça kontrol etmeye zorlar.

Belki kolayca nulls bir dil ile bir uygulama yapabilirsiniz. C ++ şeklinde bir tane vardır boost::optional<T>. Belki ile null eşdeğerini yapmak çok zor. Özellikle, eğer varsa Maybe<Just<T>>, onu null olarak atayamam (çünkü böyle bir kavram yoktur), T**null olan bir dilin null değerine atanması çok kolaydır. Bu Maybe<Maybe<T>>, tamamen geçerli olan birini kullanmaya zorlar , ancak sizi bu nesneyi kullanmak için daha fazla kontrol yapmaya zorlar.

Bazı işlevsel diller Belki kullanır, çünkü boş, tanımlanmamış davranış veya istisnaların işlenmesini gerektirir, bunların hiçbiri işlevsel dil sözdizimleriyle eşleştirilmesi kolay bir kavram değildir. Belki de bu tür işlevsel durumlarda rolü daha iyi doldurur, ancak usul dillerinde null kraldır. Bu doğru ve yanlış meselesi değil, sadece yapmasını istediğiniz şeyi yapmasını bilgisayara söylemeyi kolaylaştıran şeydir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.