Лучший тип данных для хранения троичной переменной или переменной с тремя состояниями

13

Отказ от ответственности: я знаю, что типы данных немного субъективны к тому, какой язык сценариев / программирования вы используете, я предпочитаю писать на Python в порядке предпочтения; хотя я рад слышать о любом языке / реализации.

Каков наилучший тип данных для хранения переменной с тремя состояниями? Нечто способное или представляющее Позитивный, Нейтральный и Негативный.

Пример: Целые -1, 0, 1.

  • Pro: Очень лаконично.
  • Pro: потенциально эффективный, может быть сохранен как одно 2-битное целое число со знаком.
  • Pro: может использоваться в качестве шкалы, такой как множитель с плавающей запятой.

Пример 2: 0, null, 1(или любая перестановка)

  • Pro: Нейтральный вариант использования может быть двоичным.
  • Con: Требуется динамический тип данных
  • Против: Потенциально не лаконично.

Пример 3: +, (пустая строка),-

  • Pro: Очень лаконично.
  • Con: Может использовать строковую логику для определения состояния.
  • Pro ?: Интуитивное графическое представление.

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

Кроме того, есть ли какие-то соображения при адаптации троичного состояния для хранения в ядре базы данных? Как Innodb для справки.

ThorSummoner
источник
12
Enum : python , Java , C # , C , C ++ , go ...
Там же, но я бы добавил, что во многих языках перечисляемые типы дают вам гораздо больше безопасности, чем пытаться вставить их в какой-то другой тип.
Blrfl
4
Этот вопрос сильно зависит от варианта использования. В общем, все перечисленные варианты реализации кажутся подходящими для разных целей в разное время.
Рулон
2
В .NET вы можете использовать обнуляемое логическое значение. Большинство баз данных позволяют вам хранить логическое значение (или бит, как его часто называют) с состоянием обнуляемого типа. Вы также можете использовать символ для хранения. Символ позже предоставит больше места без необходимости менять механизм хранения.
Адам Цукерман
1
Указатель на bool также может быть использован. Bool принудительно устанавливается в 0 и 1, и если указатель равен NULL, у вас третье состояние. Зависит от языка конечно.
Деволус

Ответы:

7

Помимо перечисления, которое является очевидным и ясным способом выражения этого, система, используемая для интероперабельной системы, в которой перечисление для конкретного языка не может быть выражено, является опцией -1/0/1.

Вы можете попробовать использовать битовую маску, где 0 означает 0, 1 означает «бит 2 установлен», а 2 означает «бит 3 установлен» (т. Е. У вас есть 3 бита, которые могут быть включены или выключены. Пока вы не определите 3, или биты 1 и 2 установлены, тогда у вас все хорошо. Этот вариант лучше, если вы думаете, что в будущем вам может понадобиться 4 или более флагов, так как 4, 8, 16 и т.д. устанавливают последующие биты).

Все они вписываются в один 8-битный тип данных, поэтому он не будет растрачивать память и не потребует преобразования (как в случае символьной системы, иногда используются 16-битные символы, иногда 8-битные в зависимости от вашей платформы).

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

gbjbaanb
источник
Лучший ответ здесь ИМО. NULL может заключаться в том, что он просто не был добавлен в БД, а не в том, что его состояние было «NULL» с -1,0,1 и, возможно, NULL - ноль явно указывает на то, что поле никогда не заполнялось!
Кен
3

Я не намерен писать четкий ответ на этот вопрос напрямую; как я рекомендовал выше, этот вопрос сильно зависит от варианта использования. В общем, все перечисленные варианты реализации кажутся подходящими для разных целей в разное время.

Тем не менее, я хотел бы обратить ваше внимание на эти основополагающие принципы и базовые знания, чтобы вы могли принять собственное обоснованное решение.


На более легкой ноте также прочитайте эту шутку: «Бизнесмен спрашивает бухгалтера; что такое два плюс два?»

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


Вопрос: что такое таблица истинности трехзначной логики?

Ответ:

... встал со стула, подошел к двери, закрыл ее, вернулся и сел. Опираясь на стол,

... и вытаскивает нарисованную от руки диаграмму на листе бумаги.

Операция: логическая и - конфиденциальная - проект на третий квартал 2014 года

   FalseTrue Third
FalseFalseFalse?????
True FalseTrue ?????
Third???????????????

... он сказал тихим голосом: " Сколько бы вы хотели, чтобы эти магические ценности были?"

Графический дизайнер спрашивает программиста: «Можете ли вы привести пример трехзначной логики?»

Программист отвечает: «Можете ли вы дать мне два цвета, настолько черный и белый, насколько они могли бы быть?»

Графический дизайнер: "так ... черный и белый?"

Программист: «Точно. Теперь я собираюсь дать третий цвет - но я должен буду указать его как номер ARGB. Надеюсь, вы не против».

Графический дизайнер: «Хорошо, я работаю с ARGB каждый день ...»

Black#FF000000
White#FFFFFFFF
Nothing#00000000

Замечание. Выше черный и белый цвета полностью непрозрачны. Третий цвет, ничего, полностью прозрачен. При смешивании в различных соотношениях черный и белый смешиваются в различные оттенки серого, но смешивание в Nothing ничего не меняет.

rwong
источник
Я весьма заинтересован в использовании таблицы истинности, снова открывая глаза на смысл моих собственных вопросов.
ThorSummoner
1

Если три возможных состояния имеют какое-то внутреннее значение, используйте что-то подходящее для этого внутреннего значения. Например, это возможные состояния 1, 2 или 3, или, если они равны 100, 200 и 300, используйте целое число. Если возможными состояниями являются «да», «нет» или «неизвестно», вы можете использовать необязательный логический или указатель на логический объект с возможностью отсутствия значения, значения «да» или значения «нет». Хотя некоторым людям это может не понравиться.

Если существует очевидный способ интерпретации целых чисел как возможных состояний, вы можете использовать целое число. Скажем, функция сравнения, которая имеет состояния «меньше», «равно», «больше», может использовать -1, 0 и +1. Хотя некоторые люди могут не найти очевидного, что вы находите очевидным.

Если существует очевидный способ интерпретации букв как возможных состояний, вы можете использовать символ. Например, если ваши состояния «красный», «зеленый» или «синий», вы можете использовать буквы «r», «g» и «b». Опять же, что для тебя очевидно ...

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

Некоторые люди используют три логических значения для представления «находится в состоянии 1», «находится в состоянии 2», «находится в состоянии 3».

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

gnasher729
источник
0

Каков наилучший тип данных для хранения переменной с тремя состояниями? Нечто способное или представляющее Позитивный, Нейтральный и Негативный.

Это сильно зависит от языка, того, что вы делаете, уровня абстракции (который также зависит от языка и т. Д.).

Я в основном использую C ++, и здесь есть много вариантов. Самое простое это enum tribool_state { false_val, true_val, undetermined_val }. Этого будет достаточно, если ваш сценарий использования представляет собой одну функцию, возвращающую этот тип значения.

Я бы, вероятно, использовал boost::optional<bool>бы, если бы я хотел выразить логический результат, который может быть невозможно получить (например, проверьте, завершены ли полученные данные сети, затем обработайте логическое значение, если это так).

Я хотел бы использовать , boost::triboolесли я хотел бы выразить нечеткий логический результат , который поддерживается полный тремя состояниями булевой логики (например true || indetermined -> true, false && indetermined -> false, true && indetermined -> indeterminedи так далее).

Точно так же в Python я бы использовал набор констант или класс (опять же, в зависимости от того, какая семантика / операции мне понадобится в клиентском коде):

Например, я бы использовал:

POSITIVE, INDETERMINED, NEGATIVE = 1, 0, -1

если бы у меня был простой случай функции, возвращающей один из трех результатов.

Если бы вместо этого у меня была полная библиотека, требующая булевой логики с тремя состояниями, я бы реализовал тип значения как класс.

utnapistim
источник
0

Если вы используете Java, вы можете использовать логический объект: поскольку он является объектом и содержит логическое значение, он может содержать значения true, false и null. Я не уверен, что это лучший способ.

Даниил
источник
-6

В Microsoft.NET есть тип «Tuple», который может использоваться по вашему требованию. Посетите http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx

Shadakshari
источник
На этой странице: кортеж - это структура данных, которая имеет определенное количество и последовательность элементов. Примером кортежа является структура данных с тремя элементами (известная как 3-кортеж или тройка), которая используется для хранения идентификатора, такого как имя человека в первом элементе, год во втором элементе и доход человека за этот год в третьем элементе. .NET Framework напрямую поддерживает кортежи с одним-семью элементами. Кроме того, вы можете создавать кортежи из восьми или более элементов, вкладывая объекты кортежей в свойство Rest объекта Tuple <T1, T2, T3, T4, T5, T6, T7, TRest>.
Адам Цукерман
1
Это говорит о том, что кортеж может хранить любой тип вплоть до восьмикратного (8 измерений).
Адам Цукерман
1
Рекомендуемое чтение: Ваш ответ в другом замке: когда ответ не ответ?
комнат
Мой выбор языка, Python, также содержит тип данных кортежа, который , как мне кажется, немного читающий предполагает, что кортежи подходят для троичных данных. Или, возможно, значением индекса кортежа будут данные, которые нужно сохранить для варианта использования, а кортеж будет больше похож на константу. Что-то в ссылках на глобальные или даже локализованные константы по индексу кажется мне плохой практикой, если только вы не находитесь под ограничениями, которые запрещают роскошь.
ThorSummoner
2
Кортеж - это тип данных, который может хранить несколько элементов, что-то вроде структуры, только с динамическим определением. Таким образом, в нем будут храниться 3 переменные того типа, который требуется оператору. Это не служит для ограничения контента, который он хотел.
gbjbaanb