Найкращий тип даних для зберігання потрійної або три стану змінної


13

Відмова: я знаю, що типи даних є трохи суб'єктивними щодо того, якою мовою сценаріїв / програмування ви користуєтесь, я люблю писати в Python як питання переваги; хоча я радий почути про будь-яке прання / реалізацію.

Який найкращий тип даних для зберігання змінної трьох станів? Щось здатне або репрезентує позитивне, нейтральне та негативне.

Приклад: Цілі -1, 0, 1.

  • Про: Дуже стисло.
  • Pro: Потенційно ефективний, може зберігатися як єдине 2-бітове ціле число, підписане.
  • Pro: може використовуватися як масштаб, наприклад, множник з плаваючою комою.

Приклад 2: 0, null, 1(або будь-яка перестановка)

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

Приклад 3: +, (порожній рядок),-

  • Про: Дуже стисло.
  • Con: Може використовувати логіку рядків для визначення стану.
  • Pro?: Інтуїтивне графічне зображення.

Можливо, є якась розумна бінарна логіка, яка може зробити щось розумне, що я навіть уявити не можу, можливо, в цьому випадку покладається занадто багато міркувань.

Також чи є якісь міркування при адаптації потрійного стану для зберігання в двигуні бази даних? Як Innodb для довідки.


12
Enum : python , java , C # , C , C ++ , go ...

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

4
Це питання сильно залежить від випадку використання. Загалом, всі перераховані варіанти реалізації здаються підходящими для різних цілей, у різний час.
rwong

2
У .NET ви можете використовувати нульовий булевий. Більшість баз даних дозволять вам зберігати булевий (або біт, як його часто називають) з нульовим станом. Ви також можете використовувати char для зберігання. Графік дозволить отримати більше місця згодом, не потребуючи зміни механізму зберігання.
Адам Цукерман

1
Вказівник на bool також може бути корисним. Bool змушений до 0 та 1, і якщо вказівник NULL, у вас є третій стан. Залежно від язика, звичайно.
Devolus

Відповіді:


7

Крім enum, який є очевидним і найяснішим способом вираження цього, система, що використовується для сумісної системи, де не можна виразити специфіку для мови, є -1/0/1.

Можливо, ви хочете спробувати біт-маску, де 0 означає 0, 1 означає "біт 2 набір", а 2 означає "біт 3 набір" (тобто у вас є 3 біти, які можна вмикати або вимикати. Поки ви не визначаєте 3, або встановлено біти 1 і 2, тоді ви добрі. Цей варіант найкращий, якщо ви думаєте, що вам можуть знадобитися 4 або більше прапорів у майбутньому, оскільки 4, 8, 16 тощо встановлює наступні біти).

Усі вони вписуються в єдиний 8-розрядний тип даних, тому він не буде марнувати пам'ять або вимагати перетворення (як система, заснована на символах, іноді використовуються 16-бітні символи, іноді 8-бітні залежно від вашої платформи).

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


Найкраща відповідь на ІМО. NULL може бути, що він просто не доданий у БД, не те, що його стан був "NULL", маючи -1,0,1 і, можливо, NULL - null виразно вказує на те, що поле ніколи не було заповнене!
Кен

3

Я не маю наміру писати чіткої відповіді на це питання безпосередньо; як я вже зауважував вище, це питання сильно залежить від випадку використання. Загалом, всі перераховані варіанти реалізації здаються підходящими для різних цілей, у різний час.

Однак я хотів би звернути вашу увагу на ці основні принципи та основні знання, щоб ви могли приймати власне обгрунтоване рішення.


На легкій ноті також прочитайте цей жарт: "Бізнесмен запитує бухгалтера; що два плюс два?"

Вибачення перед усіма бухгалтерами та не бухгалтерами. Моя згадка про цей жарт має на меті підкреслити свободу того, що ми будемо визначати дуже скоро, та відповідальність та наслідки (як у логічному сенсі), що випливають.


Питання: що таке таблиця істинності тризначної логіки?

Відповідь:

... підвівся з крісла, підійшов до дверей, зачинив його, повернувся і сів. Нахилившись через стіл,

... І витягує намальований вручну графік на аркуші паперу.

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

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

... - сказав він тихим голосом, - скільки б ви хотіли, щоб були ці магічні цінності?

Графічний дизайнер запитує програміста: "Чи можете ви навести приклад тризначної логіки?"

Програміст відповідає: "Чи можете ви дати мені два кольори? Це такий же чорний і білий, як вони могли бути?"

Графічний дизайнер: "так ... чорно-біле?"

Програміст: "Рівно. Зараз я надам третій колір, але мені доведеться вказати його як номер ARGB. Сподіваюся, ви не заперечуєте".

Графічний дизайнер: "добре я працюю з ARGB щодня ..."

Black#FF000000
White#FFFFFFFF
Nothing#00000000

Зауваження. У вищесказаному чорно-білий - повністю непрозорі кольори. Третій колір, Нічого, є повністю прозорим. Коли їх змішують у різних співвідношеннях, Чорний і Білий змішуються, стаючи різними сірими, але змішування в Ніщо нічого не змінює.


Мене цілком цікавить використання таблиці правди, знову відкриваючи погляд на сенс, що стоїть за моїми власними питаннями.
ThorSummoner

1

Якщо три можливі стани мають певне притаманне значення, використовуйте щось придатне для цього притаманного значення. Наприклад, можливі стани 1, 2 або 3, або якщо вони 100, 200 і 300, використовуйте ціле число. Якщо можливі стани - так, ні або невідомо, ви можете використовувати необов'язковий булевий або вказівник на булевий об'єкт, з можливістю не мати значення, значення "так" або значення "ні". Хоча деяким це може не сподобатися.

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

Якщо існує очевидний спосіб інтерпретації букв як можливих станів, ви можете використовувати символ. Наприклад, якщо ваші штати "червоні", "зелені" або "сині", ви можете використовувати літери "r", "g" і "b". Знову ж таки, що вам очевидно ...

Перелічений тип - це завжди можливість. Рядок - це завжди можливість, але ви втрачаєте перевірку типу на більшості мов.

Деякі люди використовують три булеві значення для представлення "знаходиться в стані 1", "знаходиться в стані 2", "знаходиться в стані 3".

Що б ви не робили, вам слід керуватися, намагаючись використати те, що є очевидним і зрозумілим, не врізає вас у проблеми, якщо раптом у вас є чотири стани, і давайте компілятору знайти помилки якнайбільше.


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

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

Якби у мене замість цього була повна бібліотека, що вимагає тривідової булевої логіки, я би реалізував тип значення як клас.


0

Якщо ви використовуєте Java, ви можете використовувати булевий об'єкт: оскільки він є об'єктом і містить булеві значення, він може містити значення true, false та null. Я не впевнений, чи це найкращий спосіб.


-6

У Microsoft.NET є тип "кортеж", який можна використовувати для ваших потреб. Відвідайте http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx


На цій сторінці: кортеж - це структура даних, яка має певну кількість та послідовність елементів. Прикладом кортежу є структура даних з трьома елементами (відомими як 3-трійний або потрійний), яка використовується для зберігання ідентифікатора, такого як ім’я людини в першому елементі, рік у другому елементі та дохід особи для того року в третьому елементі. .NET Framework безпосередньо підтримує кортежі з одним до семи елементів. Крім того, ви можете створити кортежі з восьми і більше елементів, вклавши кортежні об’єкти у властивість "Відпочинок" кортежу <T1, T2, T3, T4, T5, T6, T7, TRest>.
Адам Цукерман

1
Це говорить про те, що кортеж може зберігати будь-який тип до octuple (8 розмірів).
Адам Цукерман


Мій вибір Lang, Python, також містить тип даних даних кортежу, який, як ми читаємо, підказує мені, що кортежі підходять для потрійних даних. Або потенційно значенням індексу кортежу буде дані, що зберігаються для випадку використання, і кортеж буде більше схожим на константу. Щось про посилання на глобальні чи навіть локалізовані константи за індексом здається мені поганою практикою, якщо ви не маєте обмежень, які забороняють розкіш.
ThorSummoner

2
Кортеж - це тип даних, який може зберігати кілька елементів, щось на зразок структури, лише динамічно визначених. Таким чином, він би зберігав 3 змінні типу, який хотів ОП. Він не забезпечує обмеження, яке він хотів.
gbjbaanb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.