Отказ от ответственности: я знаю, что типы данных немного субъективны к тому, какой язык сценариев / программирования вы используете, я предпочитаю писать на Python в порядке предпочтения; хотя я рад слышать о любом языке / реализации.
Каков наилучший тип данных для хранения переменной с тремя состояниями? Нечто способное или представляющее Позитивный, Нейтральный и Негативный.
Пример: Целые -1
, 0
, 1
.
- Pro: Очень лаконично.
- Pro: потенциально эффективный, может быть сохранен как одно 2-битное целое число со знаком.
- Pro: может использоваться в качестве шкалы, такой как множитель с плавающей запятой.
Пример 2: 0
, null
, 1
(или любая перестановка)
- Pro: Нейтральный вариант использования может быть двоичным.
- Con: Требуется динамический тип данных
- Против: Потенциально не лаконично.
Пример 3: +
, (пустая строка),
-
- Pro: Очень лаконично.
- Con: Может использовать строковую логику для определения состояния.
- Pro ?: Интуитивное графическое представление.
Возможно, есть какая-то умная бинарная логика, которая может сделать что-то умное, что я даже не могу себе представить, возможно, слишком много полагается на случай использования.
Кроме того, есть ли какие-то соображения при адаптации троичного состояния для хранения в ядре базы данных? Как Innodb для справки.
источник
Ответы:
Помимо перечисления, которое является очевидным и ясным способом выражения этого, система, используемая для интероперабельной системы, в которой перечисление для конкретного языка не может быть выражено, является опцией -1/0/1.
Вы можете попробовать использовать битовую маску, где 0 означает 0, 1 означает «бит 2 установлен», а 2 означает «бит 3 установлен» (т. Е. У вас есть 3 бита, которые могут быть включены или выключены. Пока вы не определите 3, или биты 1 и 2 установлены, тогда у вас все хорошо. Этот вариант лучше, если вы думаете, что в будущем вам может понадобиться 4 или более флагов, так как 4, 8, 16 и т.д. устанавливают последующие биты).
Все они вписываются в один 8-битный тип данных, поэтому он не будет растрачивать память и не потребует преобразования (как в случае символьной системы, иногда используются 16-битные символы, иногда 8-битные в зависимости от вашей платформы).
Я бы не стал считать ноль в любом случае. Может быть, в базе данных, но только там, где я могу гарантировать, что система будет иметь четкую поддержку NULL, и даже тогда это может быть подвержено ошибкам, если кто-то не сделает явного различия и в итоге получит 0, когда оно действительно будет нулевым.
источник
Я не намерен писать четкий ответ на этот вопрос напрямую; как я рекомендовал выше, этот вопрос сильно зависит от варианта использования. В общем, все перечисленные варианты реализации кажутся подходящими для разных целей в разное время.
Тем не менее, я хотел бы обратить ваше внимание на эти основополагающие принципы и базовые знания, чтобы вы могли принять собственное обоснованное решение.
На более легкой ноте также прочитайте эту шутку: «Бизнесмен спрашивает бухгалтера; что такое два плюс два?»
Извинения всем бухгалтерам и не бухгалтерам. Мое упоминание об этой шутке предназначено, чтобы подчеркнуть свободу того, что мы собираемся определить очень скоро, и ответственность и последствия (как в логическом смысле), которые следуют.
Вопрос: что такое таблица истинности трехзначной логики?
Ответ:
... и вытаскивает нарисованную от руки диаграмму на листе бумаги.
Операция: логическая и - конфиденциальная - проект на третий квартал 2014 года
FalseTrue Third
FalseFalseFalse?????
True FalseTrue ?????
Third???????????????
Графический дизайнер спрашивает программиста: «Можете ли вы привести пример трехзначной логики?»
Программист отвечает: «Можете ли вы дать мне два цвета, настолько черный и белый, насколько они могли бы быть?»
Графический дизайнер: "так ... черный и белый?"
Программист: «Точно. Теперь я собираюсь дать третий цвет - но я должен буду указать его как номер ARGB. Надеюсь, вы не против».
Графический дизайнер: «Хорошо, я работаю с ARGB каждый день ...»
Black#FF000000
White#FFFFFFFF
Nothing#00000000
Замечание. Выше черный и белый цвета полностью непрозрачны. Третий цвет, ничего, полностью прозрачен. При смешивании в различных соотношениях черный и белый смешиваются в различные оттенки серого, но смешивание в Nothing ничего не меняет.
источник
Если три возможных состояния имеют какое-то внутреннее значение, используйте что-то подходящее для этого внутреннего значения. Например, это возможные состояния 1, 2 или 3, или, если они равны 100, 200 и 300, используйте целое число. Если возможными состояниями являются «да», «нет» или «неизвестно», вы можете использовать необязательный логический или указатель на логический объект с возможностью отсутствия значения, значения «да» или значения «нет». Хотя некоторым людям это может не понравиться.
Если существует очевидный способ интерпретации целых чисел как возможных состояний, вы можете использовать целое число. Скажем, функция сравнения, которая имеет состояния «меньше», «равно», «больше», может использовать -1, 0 и +1. Хотя некоторые люди могут не найти очевидного, что вы находите очевидным.
Если существует очевидный способ интерпретации букв как возможных состояний, вы можете использовать символ. Например, если ваши состояния «красный», «зеленый» или «синий», вы можете использовать буквы «r», «g» и «b». Опять же, что для тебя очевидно ...
Перечислимый тип всегда возможен. Строка всегда возможна, но вы теряете проверку типов в большинстве языков.
Некоторые люди используют три логических значения для представления «находится в состоянии 1», «находится в состоянии 2», «находится в состоянии 3».
Что бы вы ни делали, вы должны руководствоваться попытками использовать что-то очевидное и понятное, не доставляющее вам неприятностей, если вдруг у вас четыре состояния, и давайте компилятору как можно больше находить ошибки.
источник
Это сильно зависит от языка, того, что вы делаете, уровня абстракции (который также зависит от языка и т. Д.).
Я в основном использую 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 я бы использовал набор констант или класс (опять же, в зависимости от того, какая семантика / операции мне понадобится в клиентском коде):
Например, я бы использовал:
если бы у меня был простой случай функции, возвращающей один из трех результатов.
Если бы вместо этого у меня была полная библиотека, требующая булевой логики с тремя состояниями, я бы реализовал тип значения как класс.
источник
Если вы используете Java, вы можете использовать логический объект: поскольку он является объектом и содержит логическое значение, он может содержать значения true, false и null. Я не уверен, что это лучший способ.
источник
В Microsoft.NET есть тип «Tuple», который может использоваться по вашему требованию. Посетите http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx
источник