Najlepszy typ danych do przechowywania zmiennej trójskładnikowej lub trójstanowej


13

Uwaga: Wiem, że typy danych są nieco subiektywne w stosunku do używanego języka skryptowego / programowania, lubię pisać w Pythonie jako kwestię preferencji; chociaż cieszę się, że słyszę o każdym języku / implementacji.

Jaki jest najlepszy typ danych do przechowywania zmiennej trójstanowej? Coś zdolnego lub reprezentującego pozytywne, neutralne i negatywne.

Przykład: Liczby -1, 0, 1.

  • Pro: bardzo zwięzły.
  • Pro: Potencjalnie wydajny, Może być przechowywany jako pojedyncza liczba całkowita ze znakiem 2-bitowym.
  • Pro: może być stosowany jako skala, na przykład mnożnik zmiennoprzecinkowy.

Przykład 2: 0, null, 1(lub dowolnego permutacji)

  • Pro: nieneutralny przypadek użycia może być binarny.
  • Przeciw: Wymaga dynamicznego typu danych
  • Con: Potencjalnie nieprecyzyjny.

Przykład 3: +, (pusty łańcuch),-

  • Pro: bardzo zwięzły.
  • Przeciw: Może wykorzystywać logikę ciągów do określania stanu.
  • Pro ?: Intuicyjna reprezentacja graficzna.

Być może istnieje jakaś sprytna logika binarna, która może zrobić coś sprytnego, czego nawet nie mogę sobie wyobrazić, być może zbyt wiele rozważań dotyczy użycia.

Czy istnieją również względy przy dostosowywaniu stanu trójskładnikowego do przechowywania w silniku bazy danych? Jak Innodb w celach informacyjnych.


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

Tamże, ale dodam, że w wielu językach wyliczone typy dają o wiele większe bezpieczeństwo niż próba przekształcenia ich w inny typ.
Blrfl,

4
To pytanie jest wysoce zależne od przypadku użycia. Ogólnie rzecz biorąc, wszystkie wymienione opcje implementacji wydają się odpowiednie do różnych celów, w różnych momentach.
rwong

2
W .NET można użyć wartości logicznej o wartości null. Większość baz danych umożliwia przechowywanie wartości logicznych (lub bitowych, jak się często nazywa) ze stanem zerowym. Możesz także użyć znaku do przechowywania. Znak pozwoli na więcej miejsca w późniejszym czasie bez konieczności zmiany mechanizmu przechowywania.
Adam Zuckerman

1
Wskaźnik do bool może być również użyteczny. Bool jest zmuszony do 0 i 1, a jeśli wskaźnik ma wartość NULL, masz trzeci stan. Oczywiście zależy od języka.
Devolus,

Odpowiedzi:


7

Oprócz wyliczenia, które jest oczywistym i najczystszym sposobem wyrażenia tego, systemem stosowanym w systemie interoperacyjnym, w którym nie można wyrazić wyliczenia specyficznego dla języka, jest opcja -1/0/1.

Możesz jednak wypróbować maskę bitów, gdzie 0 oznacza 0, 1 oznacza „bit 2 set”, a 2 oznacza „bit 3 set” (tzn. Masz 3 bity, które można włączyć lub wyłączyć. O ile nie zdefiniujesz 3, lub ustawiamy bity 1 i 2. To jest dobre. Ta opcja jest najlepsza, jeśli uważasz, że będziesz potrzebować 4 lub więcej flag w przyszłości, ponieważ 4, 8, 16 itd. Ustawia kolejne bity).

Wszystko to pasuje do jednego 8-bitowego typu danych, więc nie będzie marnować pamięci ani wymagać konwersji (tak jak w przypadku systemu opartego na znakach, czasami używane są 16-bitowe znaki, czasem 8-bitowe, w zależności od platformy).

W każdym razie nie uważałbym za nieważny. Może w bazie danych, ale tylko tam, gdzie mogłem zagwarantować, że system ma wyraźne wsparcie dla wartości NULL, a nawet wtedy może to być podatne na błędy, jeśli ktoś nie dokona wyraźnego rozróżnienia i skończy na 0, gdy tak naprawdę było zero.


Najlepsza odpowiedź tutaj IMO. NULL może oznaczać, że po prostu nie został dodany do bazy danych, nie że jego stan to „NULL” mający -1,0,1 i być może NULL - null wyraźnie wskazuje, że pole nigdy nie było wypełnione!
Ken

3

Nie zamierzam pisać bezpośredniej odpowiedzi na to pytanie; jak już wspomniałem powyżej, pytanie to w dużym stopniu zależy od przypadku użycia. Ogólnie rzecz biorąc, wszystkie wymienione opcje implementacji wydają się odpowiednie do różnych celów, w różnych momentach.

Chciałbym jednak zwrócić uwagę na te podstawowe zasady i wiedzę podstawową, abyś mógł podjąć własną świadomą decyzję.


Na lżejszej notatce przeczytaj także ten żart: „Biznesmen pyta księgowego; co to dwa plus dwa?”

Przepraszamy wszystkich księgowych i nie-księgowych. Wspomnienie tego dowcipu ma na celu podkreślenie wolności czegoś, co wkrótce zdefiniujemy, oraz odpowiedzialności i konsekwencji (oba w logicznym sensie), które następują.


Pytanie: jaka jest tabela prawdy logiki trójwartościowej?

Odpowiedź:

... wstał z krzesła, podszedł do drzwi, zamknął je, wrócił i usiadł. Opierając się o biurko

... i wyciąga ręcznie rysowany wykres na kartce papieru.

Operacja: Logiczna i - Poufna - Projekt w trzecim kwartale 2014 r

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

... powiedział niskim głosem: „ Jak bardzo chciałbyś mieć te magiczne wartości?”

Grafik pyta programistę: „Czy możesz podać przykład trójwartościowej logiki?”

Programista odpowiada: „Czy możesz podać mi dwa kolory, które są tak czarno-białe, jak to tylko możliwe?”

Projektant graficzny: „więc… czarno-biały?”

Programista: „dokładnie. Teraz dam trzeci kolor - ale będę musiał podać go jako numer ARGB. Mam nadzieję, że nie masz nic przeciwko”.

Projektant graficzny: „no cóż, codziennie pracuję z ARGB ...”

Black#FF000000
White#FFFFFFFF
Nothing#00000000

Uwaga. Na powyższym czarno-białe kolory są całkowicie nieprzezroczyste. Trzeci kolor, Nic, jest w pełni przezroczysty. Po zmieszaniu ze sobą w różnych proporcjach, Czarno-Biały miesza się, tworząc różne szarości, ale mieszanie w Nic nie zmienia niczego.


Interesuje mnie użycie tabeli prawdy. Ponownie otwieram oczy na sens moich własnych pytań.
ThorSummoner

1

Jeśli trzy możliwe stany mają jakieś nieodłączne znaczenie, użyj czegoś odpowiedniego dla tego nieodłącznego znaczenia. Na przykład, możliwe stany to 1, 2 lub 3, lub jeśli są to 100, 200 i 300, użyj liczby całkowitej. Jeśli możliwe stany to tak, nie lub nieznane, możesz użyć opcjonalnej wartości logicznej lub wskaźnika do obiektu logicznego, z możliwością braku wartości, wartości „tak” lub „nie”. Chociaż niektórym może się to nie podobać.

Jeśli istnieje oczywisty sposób interpretacji liczb całkowitych jako możliwych stanów, można użyć liczby całkowitej. Powiedzmy, że funkcja porównania, która ma stany „mniej”, „równa”, „większa”, może użyć -1, 0 i +1. Chociaż niektórzy ludzie mogą nie znaleźć oczywistego, co uważasz za oczywiste.

Jeśli istnieje oczywisty sposób, w jaki litery mogą być interpretowane jako możliwe stany, możesz użyć znaku. Na przykład, jeśli twoje stany są „czerwone”, „zielone” lub „niebieskie”, możesz użyć liter „r”, „g” i „b”. Znowu, co jest dla ciebie oczywiste ...

Wyliczenie typu jest zawsze możliwe. Ciąg jest zawsze możliwy, ale w większości języków tracisz sprawdzanie typu.

Niektóre osoby używają trzech wartości logicznych do reprezentowania „jest w stanie 1”, „jest w stanie 2”, „jest w stanie 3”.

Cokolwiek robisz, powinieneś kierować się próbą użycia czegoś, co jest oczywiste i zrozumiałe, nie wpada w kłopoty, jeśli nagle masz cztery stany, i pozwólmy kompilatorowi znaleźć błędy w jak największym stopniu.


0

Jaki jest najlepszy typ danych do przechowywania zmiennej trójstanowej? Coś zdolnego lub reprezentującego pozytywne, neutralne i negatywne.

Zależy to w dużej mierze od języka, tego, co robisz, poziomu abstrakcji (który również zależy od języka i tak dalej).

Używam głównie C ++ i jest tutaj wiele możliwości wyboru. Najprostszy jest enum tribool_state { false_val, true_val, undetermined_val }. Byłoby to wystarczające, jeśli scenariusz użycia jest pojedynczą funkcją zwracającą ten typ wartości.

Prawdopodobnie skorzystałbym, boost::optional<bool>gdybym chciał wyrazić wynik logiczny, który może być niemożliwy do uzyskania (np. Sprawdź, czy odebrane dane sieciowe są kompletne, a następnie przetworz wartość logiczną, jeśli tak jest).

Użyłbym boost::triboolgdybym chciał wyrazić rozmytej logiczną wynik, który obsługiwany pełny Tri-State operacji logicznych (np true || indetermined -> true, false && indetermined -> false, true && indetermined -> indeterminedi tak dalej).

Podobnie w Pythonie użyłbym zestawu stałych lub klasy (ponownie, zależnie od tego, jakiego rodzaju semantyki / operacji potrzebowałbym w kodzie klienta):

Na przykład użyłbym:

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

gdybym miał prosty przypadek funkcji zwracającej jeden z trzech wyników.

Gdybym zamiast tego miał pełną bibliotekę wymagającą trójstanowej logiki logicznej, zaimplementowałbym typ wartości jako klasę.


0

Jeśli używasz Javy, możesz użyć obiektu boolowskiego: ponieważ jest to obiekt i zawiera wartość logiczną, może przechowywać wartości true, false i null. Nie jestem jednak pewien, czy jest to najlepszy sposób.


-6

W Microsoft.NET istnieje typ „Tuple”, którego można użyć do własnych wymagań. Odwiedź http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx


Na tej stronie: krotka to struktura danych, która ma określoną liczbę i sekwencję elementów. Przykładem krotki jest struktura danych z trzema elementami (znanymi jako 3-krotna lub potrójna), która służy do przechowywania identyfikatora, takiego jak imię i nazwisko osoby w pierwszym elemencie, rok w drugim elemencie oraz dochód osoby na ten rok w trzecim elemencie. .NET Framework bezpośrednio obsługuje krotki z jednym do siedmiu elementów. Ponadto można tworzyć krotki składające się z ośmiu lub więcej elementów, zagnieżdżając obiekty krotkowe we właściwości Rest obiektu Tuple <T1, T2, T3, T4, T5, T6, T7, TRest>.
Adam Zuckerman

1
Oznacza to, że krotka może przechowywać dowolny typ w maksymalnie ośmiu (8 wymiarach).
Adam Zuckerman


Mój wybrany język, Python, zawiera także krotkowy typ danych, co trochę przy czytaniu sugeruje mi, że krotki są odpowiednie dla danych trójskładnikowych. Lub potencjalnie wartością indeksu krotek byłyby dane do przechowywania dla przypadku użycia, a krotka byłaby bardziej jak stała. Coś w odniesieniu do odwoływania się do globalnych, a nawet zlokalizowanych stałych za pomocą indeksu, wydaje mi się złym postępowaniem, chyba że masz ograniczenia, które zabraniają luksusów.
ThorSummoner

2
Krotka to typ danych, który może przechowywać wiele elementów, coś w rodzaju struktury, tylko dynamicznie definiowanych. Przechowuje więc 3 zmienne typu pożądanego przez OP. Nie służy ograniczeniu treści, których chciał.
gbjbaanb
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.