Tristate значения - есть ли соглашение?
Меня бросили немного проблемку, и я не уверен, что ответ.
В основном - существует ли соглашение о том, какие значения использовать в трехсторонних типах данных? Занимаясь поиском, он не выглядит так: Я видел:
- -1 = неверно, 0 = неизвестно / не определено, +1 = верно
- 0 = неверно, +1 = верно, +2 = неизвестно / не определено
- -1 = неизвестно / не определено, 0 = неверно, +1 = верно
..среди других. Я бы предпочел использовать хорошо известное соглашение, если оно есть. В противном случае я придумаю один:-) Может быть, нет правильного ответа, но просто подумал, что я буду копать немного глубже...
редактировать
Нашел и этот, который Microsoft, похоже, использует в недавнем коде: -1 = true, 0 = false, 2 = неизвестно. Я предполагаю, что наличие 2 == unknown означает, что это устраняет неоднозначность по сравнению с интерпретацией +1/-1 при простом просмотре необработанных значений в отладчике / дампе / памяти и т. Д. Как ни странно, эта опция привлекательна только по этой причине (исключает возможность забывая, что вариант 1 означает "истинно").
4 ответа
Насколько мне известно, для этого нет соглашения.
Не существует даже единого соглашения для логического значения, наиболее распространенными являются:
- 0 = неверно, -1 = верно
- 0 = неверно, 1 = верно
Другим распространенным (но не универсальным) соглашением, которое было бы уместно, является использование -1 для неопределенных значений.
Если вы решите использовать -1 для неопределенного, вы можете использовать 0/1 для False / True:
- -1 = не определено
- 0 = Ложь
- 1 = верно
И, естественно, я должен отметить, что третье состояние, конечно, должно быть не неопределенным / неизвестным, а FileNotFound.;)
Независимо от семантического значения, которое вы придаете, я бы выбрал ваши три значения как одно отрицательное число, одно положительное число и ноль. Это позволяет проводить оптимальное тестирование на членство в каждом возможном 1- или 2-элементном подмножестве из 3 возможных значений с помощью только одного теста и ветвления (>0, <0, ==0, >=0, <=0,!=0).
Я бы сказал, что нет ничего похожего на соглашение, но я бы предпочел третий случай, о котором вы упомянули, потому что я видел это много раз.
Value State
---------- ----------
-1 Undefined
0 False
+1 True
Я не предпочел бы первые два случая, потому что чистые логические состояния в основном определяются как 0 = False
а также 0 <> True
так что это может немного сбить с толку.
Если вы ищете замену для булева с тремя состояниями с помощью int, вы всегда можете получить логическое значение null, не беспокоясь о стандартах. Что-то вроде, в C# bool? triState
, Он может иметь значения true, false или null, которые можно считать неизвестными, но я вижу, что это не то, что вы ищете.
Я не знаю о конвенции. Скорее всего, не из ответов, приведенных здесь. Мне нравится твой третий.
Но с другой точки зрения, мой выбор будет:
{ True, Unknown, False } => 0, 1, 2 // going by enum like values...
РЕДАКТИРОВАТЬ: После хорошей точки @LarsTech, я должен уточнить. Что если я знаю, что для переменной может быть больше двух значений, я бы подумал, что это перечисление, и, следовательно, я мог бы перевести ее в { 0, 1, 2 }. Я всегда следую шаблону значений enum, например: "Хорошо, хорошо, плохо". Это естественно для меня, но для многих истинных иметь "0" не приветствуется. Можно всегда иметь обратный порядок.