Trileanの使用(True、False、??)を見ますか?[終了]


22

時々、trueまたはfalseを返す関数があります。ただし、3つの可能な値の方が意味がある場合があります。

一部の言語では、これらのケースは整数または例外を使用して処理されます。

たとえば、ユーザーが18歳以上の場合、ユーザーの年齢を処理する必要があります。そして、あなたはこのような機能を持っています。

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

しかし、アプリの作成方法によっては、誕生日フィールドが不完全な場合があります。次に、この関数は未決定の何かを返す必要があります。

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

先ほど述べたように、ExceptionsとIntでそれを処理できますが、いくつかのホーム定義定数を使用する代わりに、言語にtrue、false、未定の埋め込みを含めるのは非常にセクシーです。



2
@アンナリア:くそー、あなたは私にそれを打ち負かした。^^
ギャブリン

3
ギャブリン:くそー、あなたはアンナについて不平を言うために私をbeatりました。
user281377

1
うーん、私もT、F、FNFを手に入れたかった!握手拳
マイクM.

4
@ gablin、@ ammoQ、@ Mike M:ごめんなさい。:)
アダムリア

回答:


33

これは、言語に応じて、列挙型、整数、シンボル(Lisp、Rubyなど)、null許容型(不確定状態としてnullを使用)、オプション型(MLなど)、または同様の構成体で処理できます。

したがって、あなたの例と理論的根拠は健全ですが、開発する言語機能の優先リストに載っていることは見当たりません。


C / C ++のnullはfalseと等しいと想定されています。これらの場合、-1を返す必要があります。未決定の状態は非常に頻繁に発生すると思いますが、この構文は実際には存在しないため、常に異なる方法で処理されます。Javaでは、ブール関数はブール関数に対してtrueまたはfalse以外を返すことはできません。そのため、異なる型を使用し、戻り値を適切に文書化する必要があります。
ロイックフォール-ラクロア

@Sybiam- 必要に応じて異なる型を使用しても問題はありません。私が言ったように、3進型の引数を見ることができますが、すぐに既存の言語に追加されるのを見ることができません。
ChrisF

6
@Sybiam:Javaでは、ブール値を返すことができますnull。C / C ++では、enumを返すことができます。
マクニール

これは狂気です!
ロイックフォール-ラクロア

2
@マクニール多分スパルタ?
syockit

5

これが必要なケースを見たことはありません。指定した例では、そのフィールドが必要な場合、他の場所で検証されている必要があります。isAdult()本質的に2状態の方法です。あなたはそうであるかそうでないかのどちらかです。何も処理する必要はありませんが、処理できないデータが見つかった場合はfalseを返します。例えば:

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

2
データが無効な場合、ユーザーに新しい年齢の入力を求めない未成年者とは異なる修正を求めることができます。これは2つの異なる動作です。たとえば、一部のソーシャルサイトでは、プライバシーのために不完全な誕生日を入力できます。
ロイックフォール-ラクロア

2
検証はコードの別の領域/セクションで実行する必要があると思います。最初にデータを検証してから、それを操作します。
マイケルK

1
@Sybiam:一般的に、アプリケーションは、必要なときに、無計画にデータを要求しません。.isAdult()それが本当にあなたが望むものであるなら、あなたはユーザー自身に問い合わせることができ、それはより良く機能するでしょう。
デビッドソーンリー

5

true、false、unknown

そうですね

C#では、null可能なboolを使用できます(今すぐ恐怖で反動できます)

MS-SQLでは、null許容ビットフィールド(同上)を使用できます


2
null値を許可するブール値の問題は、null値を持つことではなく、ほとんどの人(私も含む)が3値の論理について何も知らないことです。初心者のためのどちらが、:scientopia.org/blogs/goodmath/2010/08/24/...
フランクShearar

True / False / None。
レナートレゲブロ

2
面白いのは、多くの人が2進法、8進法、および16進法を理解しているが、3進法を思い浮かべることができないということです。何故ですか?同じこと、3を基数とするだけで、3つの値の論理問題を解決できます。
マイケルK

5
ほとんどの人はただの恐怖を持っていunknownます。
dan04

2

C ++では、これは非bool戻り型で、または例外をスローすることで処理できます。3値の戻り値型が必要な場合は、を使用しenumます。それほどセクシーではありませんが、機能します。さらに重要なことは、他の人たちのために言語を台無しにせずにできることです。

持つboolことが問題を引き起こす三値。3つの値のいずれかをbool foo; ... if (foo)...想定しfooて、どのように処理しますか?bool変数が常に1つでfooあり!foo、常に真であるような変数を持つことには利点があります。それはプログラムについての理性に役立ちます。

NaN値を取得する可能性がある場合に、人々が数値処理で行うことを確認してください。それは複雑です。通常のブール値処理のためにこれを経験する必要はありません。

.isAdult()不十分な情報を処理したい場合は、内部で処理してから、trueまたはを返しますfalse。それ以外の場合は、使用するたびに、他の操作を行う前にリターンコードを確認し、それを処理する方法を考え出す必要があります。関数がその名前のとおりに機能しているかどうかをドキュメントで確認する必要があることを意味します。これは読みやすさの障害になります。


2

このアイデアは非常に便利です。ファジーロジックと呼ばれる不確実性を扱うことに専念する分野全体があります。

私たちプログラマーにとって幸いなことに、標準言語機能を備えたファジーロジックを実装できます。

たとえば、あなたが与えた場合、不確かな情報はユーザーに尋ねることで簡単に決定できます。したがって、あなたが説明するようなトライステート列挙型はうまく機能します。

不確実な他のすべての種類の方法があります。そのような質問は次のとおりです。

  • 明日雨が降りますか?それはまだ起こっていないので、誰も知ることはできません-しかし、あなたは経験に基づいた推測を行い、確率を与えることができます。
  • 星Beta Pictorisの太陽系の惑星には多細胞生物がいますか?これには明確なyesまたはnoの答えがありますが、現在それが何であるかはわかりません。

これらの質問の多くは、0.0(false)から1.0(true)の範囲の確率を使用し、浮動小数点演算を適用して処理できます。

David E. Shawという名前の計算化学者およびコンピューター科学者は、このようなことをウォールストリートに適用し、現在では約25億ドルの価値があります。はい、それは便利です。:-)


1

何年も前、私は信念を価値に割り当てるために出てきたいくつかのアルゴリズムで遊んでいました。ちょっと楽しかった。最終的に私が得たのは、ブール値がしばしば不自然な適合であるということです。本当にそれは、trilean true / false / otherの値でなければなりません。当時の私にとって「最良の」コードにつながると思われる実験。それ以来、同じ古い方法で物事をやめた場合、それがどれほど簡単になるかを内部的に考えながら、私は他の誰もがやっていることを気にし、やりました... :-)


0

ただし、整数を使用して任意にスイッチを処理することにより、CaseまたはSwitchステートメントはこれに対して正常に機能します。

また、Rubyでは、状況によって「nil」がfalseを返しますが、等値演算子を使用するとnil == falseが返されるfalseため、ruby nilを使用して3項論理を処理できます。


0

あなたの場合の別の選択肢は、「尋ねないでください」というプリンシパルを適用してコントロールを反転し、それを変更することです(大人の言葉、脳の閉塞についてはごめんなさい):

user.isAdult(new OnlyAllowAdultsToLogin())

OnlyAllowAdultsToLoginStrategyインターフェイスを実装する場所:

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

何をvoid userIsAdult()するの?おそらくあなたはどういう意味bool userIsAdult()ですか?
ティムウィ

0

私の息子は、これに似たテストを効率的に実装する方法を私に尋ねていました。テスト対象のフラグはtrue / falseのみでしたが、マッチキーには3つの状態がありました(trueである必要があり、falseである必要がありますが、気にしません)。もちろん、これは2ビットのデータ構造と少し調整することで実装できますが、そのようなコードは、目的をコードを見ただけでは見分けがつかないため、実際にコメントする必要があります。


0

Cには、ほとんどのライブラリ関数にこの機能が実装されています。たとえば、strcmpは2つの文字列を比較し、同じ場合は0を返します。 。

同じアプローチは、トライステートとして+ / 0 /-で使用できます。また、falseで0で他の値がtrueであることがわかっている場合、値に対してブールロジックを実行できます。


0

C ++の場合、Boostは実際に次のようなTriboolを実装します

triboolクラスは、組み込みbool型のように機能しますが、トライステートブールロジック用です。3つの状態はtrue、false、およびindeterminateで、最初の2つの状態はC ++ bool型の状態と同等で、最後の状態は不明なブール値を表します(trueまたはfalseの場合もありますが、わかりません)。


-1

VB6チェックボックスにはこの機能があります。チェックボックスの値は、0 =オフ、1 =オン、2 =グレーにすることができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.