Tristate значения - есть ли соглашение? - PullRequest
7 голосов
/ 07 июня 2011

Меня бросили немного проблемку, и я не уверен, что ответ.

В основном - существует ли соглашение о том, какие значения использовать в трехуровневых типах данных?Поискав, он не выглядит так: Я видел:

  • -1 = Ложь, 0 = Неизвестно / не определено, +1 = Правда
  • 0 = Неверно, +1 = Истинно, +2 = Неизвестно / не определено
  • -1 = Неизвестно / не определено, 0 = Неверно, +1 = Истинно

.. средидругие.Я бы предпочел использовать хорошо известное соглашение, если оно есть.В противном случае я придумаю один :-) Может быть, нет правильного ответа, но просто подумал, что я буду копать немного глубже ...

Редактировать
Найденоа также тот, который Microsoft, похоже, использует в недавнем коде: -1 = true, 0 = false, 2 = неизвестно.Я предполагаю, что наличие 2 == unknown означает, что это устраняет неоднозначность по сравнению с интерпретацией + 1 / -1 при простом просмотре необработанных значений в отладчике / дампе / памяти и т. Д. Как ни странно, эта опция подходит именно для этогоодна причина (исключает возможность забыть, какое из значений 1 означает «истинно»).

Ответы [ 4 ]

3 голосов
/ 07 июня 2011

Насколько мне известно, для этого нет соглашения.

Нет даже одного соглашения для логического значения, наиболее распространенными являются:

  • 0 = Ложь, -1 = Истина
  • 0 = False, 1 = True

Другим распространенным (но не универсальным) соглашением, которое было бы уместно, является использование -1 для неопределенных значений.

Если вы решите использовать -1 для неопределенного значения, вы можете использовать 0/1 для False / True:

  • -1 = Не определено
  • 0 = Ложь
  • 1 = True

И, естественно, я должен упомянуть, что третье состояние, конечно, должно быть не неопределенным / неизвестным, а FileNotFound . ;)

3 голосов
/ 08 июня 2011

Независимо от семантического значения, которое вы придаете, я бы выбрал три значения: одно отрицательное число, одно положительное число и ноль.Это позволяет проводить оптимальное тестирование на членство в каждом возможном 1- или 2-элементном подмножестве из 3 возможных значений с помощью только одного теста и ветвления (> 0, <0, == 0,> = 0, <= 0,! = 0). </p>

1 голос
/ 07 июня 2011

Я бы сказал, что нет ничего похожего на соглашение, но я бы предпочел третий случай, который вы упомянули, потому что я видел его много раз.

Value       State
----------  ----------
 -1         Undefined
  0         False
 +1         True

Я бы не предпочел первые дваслучаи, потому что чисто булевы состояния в основном определяются как 0 = False и 0 <> True, поэтому это может быть немного запутанным.

0 голосов
/ 17 сентября 2011

Если вы ищете замену для булева с тремя состояниями с помощью int, вы всегда можете получить nullable boolean , не беспокоясь о стандартах. Что-то вроде, в C # bool? triState. Он может иметь значения true, false или null, которые можно считать неизвестными, но я вижу, что это не то, что вы ищете.

Я не знаю о конвенции. Скорее всего, не из ответов, приведенных здесь. Мне нравится твой третий.

Но с другой точки зрения мой выбор был бы:

{ True, Unknown, False } => 0, 1, 2 // going by enum like values...

РЕДАКТИРОВАТЬ: После хорошей точки @LarsTech, я должен уточнить. Что если я знаю, что для переменной может быть больше двух значений, то я бы подумал, что это перечисление, и, следовательно, я мог бы перевести его в {0, 1, 2}. Я всегда следую шаблону значений enum, например: «Хорошо, хорошо, плохо». Это естественно для меня, но для многих истинных иметь «0» не приветствуется. Можно всегда иметь обратный порядок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...