Herhangi bir Trilenin (Gerçek, Yanlış, ??) kullanıldığını görür müsünüz [kapalı]


22

Bazen doğru ya da yanlış dönmesi gereken bir işleve sahibim. Ancak bazen üç olası değer daha anlamlı olur.

Bazı dillerde tezler tamsayılı veya istisnalar dışında ele alınacaktır.

Örnek olarak, 18 yaşından büyükse, kullanıcının yaşını idare etmek istersiniz. Ve bunun gibi bir işlevin var.

if(user.isAdult(country_code)){
     //Go On
}else{
     // Block access or do nothing
}

Ancak bazı durumlarda uygulamanızın nasıl oluşturulduğuna bağlı olarak, doğum günü alanının eksik olduğu durumu görebiliyorum. O zaman bu fonksiyon belirlenmemiş bir şey döndürmelidir.

switch(user.isAdult()){
    case true:
        // go on
        break;
    case undetermined:
        //Inform user birthday is incomplete
    case false:
        //Block access
}

İstisnalar ve İnt ile başa çıkabileceğimizi söylediğim gibi, bazı ev tanımlanmış sabitleri kullanmak yerine, dilde gerçek, yanlış, saptanmamış bir gömülme yapmanın oldukça seksi olacağını düşünüyorum.



2
@ Anna Lear: Kahretsin, beni yendin. ^^
gablin

3
gablin: Kahretsin, beni Anna'dan şikayet etmek için bile yendin.
user281377,

1
U, F, FNF'yi de almak istedim! yumruk sallıyor
Mike M. 15

4
@gablin, @ammoQ, @Mike M .: Üzgünüm. :)
Adam Lear

Yanıtlar:


33

Bu, dillerinize bağlı olarak, numaralandırma, tamsayı, sembol (örneğin, Lisp, Ruby), boş tipler (belirsiz durum olarak boş kullanın), seçenek türleri (örneğin, ML) veya benzer bir yapıyla kullanılabilir.

Bu nedenle, örnek ve gerekçeniz sağlam olsa da, geliştirilecek dil özelliklerinin öncelikli listesinde olduğunu göremiyorum.


C / C ++ 'da null değerinin false değerine eşit olması beklenir. Bu durumlarda -1 değerini döndürmeniz gerekir. Belirsiz durumun oldukça sık olduğunu düşünüyorum, ancak bu sözdizimi gerçekten varolmadığı için her zaman farklı davranılıyor. Java'da bir boole işlevi, bir boole işlevi için true veya false dışında bir şey döndüremez. Bu yüzden farklı bir tür kullanmanız ve iade edilen değeri iyi belgelemeniz gerekiyor.
Loïc Faure-Lacroix,

@Sybiam - uygun olan yerlerde farklı bir tür kullanmanın yanlış bir tarafı yoktur . Dediğim gibi, üçlü bir tür için bir argüman görebiliyorum, ancak yakın zamanda varolan dillere eklendiğini göremiyorum.
ChrisF

6
@Sybiam: Java'da olabilecek bir Boolean'ı döndürebilirsiniz null. C / C ++ ile bir enum döndürebilirsiniz.
Macneil

Bu delilik!
Loïc Faure-Lacroix,

2
@ Macneil belki Sparta?
syockit

5

Bunun gerekli olduğu bir durum görmedim. Verdiğiniz örnekte, eğer bu alan gerekliyse, başka bir yerde doğrulanmış olmalıdır. isAdult()doğal olarak iki durumlu bir yöntemdir: Ya öyle ya da değilsin. Bir şey yapmasına gerek yoktur, ancak idare edemeyeceği verilerle karşılaşırsa yanlış döndürür. Örneğin:

switch(user.isAdult()){
   case true:
      // go on
      break;
   default:
      // Block access.
}

2
Veriler geçersizse, kullanıcıdan yeni bir yaş girmesini istemediğiniz durumlarda reşit olmayandan farklı olan bir kullanıcıyı düzeltmesini isteyebilir. Bu 2 farklı davranış. Örnek olarak, bazı sosyal siteler gizlilik için eksik doğum günleri girmenize olanak sağlar.
Loïc Faure-Lacroix,

2
Doğrulamanın, kodun başka bir alanında / bölümünde yapılması gerektiğini düşünüyorum. Önce verileri doğrulayın ve sonra üzerinde çalışın.
Michael K,

1
@Sybiam: Genel olarak, uygulamalar ihtiyaç duydukları zaman, tesadüfen bazında veri istememektedir. Sen olabilir .isAdult()bu istediğini gerçekten buysa, kullanıcıyı kendisi sorgu ve daha iyi çalışacak.
David Thornley

5

doğru, yanlış, bilinmeyen

Evet Hayır Belki

C # 'da boş bir bool kullanabilirsiniz (şimdi korku içinde geri tepebilirsin)

MS-SQL'de boş bir bit alanı (ditto) kullanabilirsiniz.


2
Null booleans ile ilgili sorun, çoğu insanın (ben dahil) üç değerli mantık hakkında hiçbir şey bilmediği kadar boş olmaları değil. Hangisi, yeni başlayanlar için: scientopia.org/blogs/goodmath/2010/08/24/…
Frank Shearar

Doğru / Yanlış / Yok.
Lennart Regebro,

2
İşin garibi, birçok insan ikili, sekizli ve onaltılıyı anlıyor, ama aklını üçlünün etrafına saramıyor. Neden? Aynı şey, sadece üçe dayanan ... bu üç değer mantık problemini çözecektir.
Michael K,

5
Çoğu insan sadece bundan korkuyor unknown.
dan04,

2

C ++ 'da bu, boolgeri dönüşsüz bir tiple veya bir istisna atarak yapılabilir. Üç değerli bir iade türü istiyorsanız, bir kullanın enum. O kadar seksi değil, ama işe yarıyor ve daha da önemlisi, geri kalanımız için dili mahvetmeden yapabilecekleriniz.

Having boolbe sorunlara neden olur üç değerli. Üç değerden birinin olabileceğini bool foo; ... if (foo)...varsayarak nasıl başa fooçıkabilirsiniz? boolDeğişkenlere sahip olmanın avantajlarından biri , her zaman kesin olanlardan biri foove !foodoğrudur. Programlar hakkında akla yardımcı olur.

İnsanların, NaNdeğer elde edebilecekleri sayısal işlemlerde neler yaptıklarını kontrol edin . Karmaşık. Sıradan boolean işlemleri için onunla gitmek zorunda kalmamayı tercih ederim.

.isAdult()Yetersiz bilgi işlemek istiyorsanız , bunu dahili olarak yapmasını sağlayın ve ardından ya trueda öğesini döndürün false. Aksi takdirde, her kullanışınızda başka bir şey yapmadan önce dönüş kodunu kontrol etmeniz ve kullanmanız için bir yol bulmanız gerekir. Bir fonksiyonun isminin söylediğini gerçekten yapıp yapmadığını ve bunun okunabilirlik için bir felaket olacağını görmek için doktorları kontrol etmeniz gerektiği anlamına gelir.


2

Bu fikir oldukça kullanışlıdır. Bulanık Mantık adlı belirsizlikle başa çıkmak için ayrılmış bir alan var .

Neyse ki, biz programcılar için bulanık dil mantığını standart dil özellikleri ile uygulayabilirsiniz.

Örneğin, verdiğiniz durumda, belirsiz bilgi kullanıcıya sorarak kolayca belirlenebilir. Yani tanımladığınız gibi bir üç devletli enum iyi çalışacaktır.

Belirsiz olmanın her türlü yolu var. Bu tür sorular şunlardır:

  • Yarın yağmur yağacak mı? Henüz olmadı, bu yüzden kimse bilemez - ama eğitimli bir tahmin yapabilir ve olasılık verebilirsiniz.
  • Beta Pictoris yıldızının güneş sisteminde bir gezegende çok hücreli yaşam var mı? Kesin bir evet-hayır-cevabı var, fakat şu anda bunun ne olduğunu söyleyemiyoruz.

Bu soruların çoğu, 0.0 (yanlış) ile 1.0 (doğru) arasındaki olasılıkları kullanmak ve kayan nokta matematiğini uygulamakla ilgilenilebilir.

David E. Shaw adlı hesaplamalı bir kimyager ve bilgisayar bilimcisi, bu tür şeyleri Wall Street'e uyguladı ve şimdi yaklaşık 2,5 milyar dolar değerinde. Yani evet, faydalı. :-)


1

Yıllar önce, değerlere inanç vermek için ortaya çıkan bazı algoritmalarla oynadım. Biraz eğlenceliydi. Nihayetinde ondan kazandığım şey, booleanın genellikle kesinleşmiş bir uyum olduğudur. Gerçekten trilean bir doğru / yanlış / diğer değer olmalıdır. Deneyde o zaman benim için "en iyi" koduna yol açıyor gibiydi. O zamandan beri mağarada bulundum ve herkesin yaptığını yaptım, dahili olarak bir şeyleri aynı eski şekilde yapmayı bırakırsak ne kadar basit olacağını düşünürken ... :-)


0

Case veya Switch ifadeleri, bununla birlikte, keyfi olarak anahtarla ilgilenmek için tamsayıları kullanarak iyi sonuç verir.

Ayrıca, Ruby'de, 'nil' bazı durumlarda yanlış olarak nil == falsedönerken false, eşitlik operatörünü kullanırsanız geri döner , böylece nilüçlü mantığı işlemek için yakut kullanabilirsiniz .


0

Durumunuzdaki bir başka seçenek de "söyleme sorma" ilkesini uygulayarak kontrolü tersine çevirmek ve değiştirmek (yetişkinlik, beyin tıkanıklığı kelimesi için üzgünüm):

user.isAdult(new OnlyAllowAdultsToLogin())

burada OnlyAllowAdultsToLoginStrategytakma bir arayüz:

interface UserAdultnessPolicy
{
   void userIsAdult();
   void userIsChild();
   void userAdultnessIsUnknown();
}

Ne yapar void userIsAdult()? Belki demek istedin bool userIsAdult()?
Timwi 19

0

Oğlum bana, buna benzer testleri nasıl etkili bir şekilde uygulayacağımı soruyordu. Test edilen bayraklar yalnızca doğru / yanlıştı, ancak eşeklerin üç durumu vardı (Doğru olmalı, yanlış olmalı ya da umrumda değil). Elbette bu 2 bitlik bir veri yapısı ve biraz da titremeyle uygulanabilir, ancak amaç sadece koda bakmaktan ayırt etmek kolay olmadığından bu tür bir kodun gerçekten yorumlanması gerekir.


0

C bu özellik kütüphane fonksiyonlarının çoğunda uygulanmıştır. örneğin strcmp 2 dizgiyi karşılaştırır ve aynı ise 0, 1 ise 2'den büyükse 1 (yani herhangi bir pozitif tamsayı), ikincisi 2'den büyükse 1 (örneğin herhangi bir negatif tamsayı) döndürür. .

Aynı yaklaşım, üçlü durumunuz olarak başka bir yerde, + / 0 / - kullanılabilir. Ayrıca, eğer yanlışsa ve diğer herhangi bir değerin doğru olup olmadığını biliyorsanız 0'da boolean mantığı gerçekleştirmenize izin verir.


0

C ++ için Boost aslında şöyle tanımlandığı gibi bir Tribool uygular :

Tribool sınıfı, yerleşik bool tipi gibi davranır, ancak 3 durumlu boole mantığı için kullanılır. Üç durum doğru, yanlış ve belirsizdir, burada ilk iki durum C ++ bool türüne eşdeğerdir ve son durum bilinmeyen bir boolean değerini temsil eder (bu doğru ya da yanlış olabilir, bilmiyoruz).


-1

VB6 onay kutusu bu özelliğe sahiptir. Onay kutusu değerleri 0 = kapalı, 1 = açık, 2 = gri olabilir

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.