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.
źródło
Odpowiedzi:
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.
źródło
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ź:
... 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???????????????
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.
źródło
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.
źródło
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::tribool
gdybym chciał wyrazić rozmytej logiczną wynik, który obsługiwany pełny Tri-State operacji logicznych (nptrue || indetermined -> true
,false && indetermined -> false
,true && indetermined -> indetermined
i 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:
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ę.
źródło
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.
źródło
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
źródło