삼항 또는 3 상태 변수를 저장하기위한 최상의 데이터 유형


13

면책 조항 : 데이터 유형은 사용중인 스크립팅 / 프로그래밍 언어에 약간 주관적이라는 것을 알고 있으며 선호하는 문제로 Python으로 작성하고 싶습니다. 모든 언어 / 구현에 대해 기뻐합니다.

3 상태 변수를 저장하는 가장 좋은 데이터 유형은 무엇입니까? 긍정적, 중립적, 부정적 능력을 나타내거나 나타내는 것.

예 : 정수 -1, 0, 1.

  • 찬성 : 매우 간결합니다.
  • 장점 : 잠재적으로 효율적이며 단일 2 비트 부호있는 정수로 저장 될 수 있습니다.
  • Pro : 부동 소수점 승수와 같은 스케일로 사용될 수 있습니다.

실시 예 2 : 0, null, 1(또는 순열)

  • 장점 : 비 중립 사용 사례는 이진일 수 있습니다.
  • 단점 : 동적 데이터 유형 필요
  • 단점 : 간결하지 않을 수 있습니다.

예 3 : +, (빈 문자열),-

  • 찬성 : 매우 간결합니다.
  • 단점 : 문자열 논리를 사용하여 상태를 확인할 수 있습니다.
  • Pro ?: 직관적 인 그래픽 표현.

아마도 상상조차 할 수없는 영리한 일을 할 수있는 영리한 이진 논리가있을 수 있습니다. 아마도 유스 케이스에 대해 너무 많은 고려가 필요합니다.

또한 데이터베이스 엔진에 저장하기 위해 3 진 상태를 조정할 때 고려해야 할 사항이 있습니까? 참조를 위해 Innodb처럼.


12
열거 형 : python , java , C # , C , C ++ , go ...

Ibidem, 그러나 많은 언어에서 열거 유형은 다른 유형으로 구두를 치는 것보다 훨씬 안전합니다.
Blrfl

4
이 질문은 유스 케이스에 크게 의존합니다. 일반적으로, 나열된 모든 구현 선택 사항은 다른 시간에 다른 목적에 적합한 것으로 보입니다.
rwong

2
.NET에서는 널 입력 가능 부울을 사용할 수 있습니다. 대부분의 데이터베이스는 널 입력 가능 상태로 부울 (또는 호출되는 비트)을 저장할 수 있도록합니다. 저장을 위해 문자를 사용할 수도 있습니다. 문자는 저장 메커니즘을 변경하지 않고도 나중에 더 많은 공간을 허용합니다.
Adam Zuckerman

1
bool에 대한 포인터도 사용할 수 있습니다. Bool은 0과 1로 강제 설정되며 포인터가 NULL이면 세 번째 상태입니다. 물론 언어에 따라 다릅니다.
Devolus

답변:


7

이를 표현하는 가장 분명하고 명확한 방법 인 열거 형 외에 언어 별 열거 형을 표현할 수없는 상호 운용 가능한 시스템에 사용되는 시스템은 -1/0/1 옵션입니다.

비트 마스크를 시도하고 싶을 수도 있습니다. 여기서 0은 0을, 1은 '비트 2 세트'를, 2는 '비트 3 세트'를 의미합니다 (즉, 3 비트가 켜져 있거나 꺼져있을 수 있음). 3 또는 비트 1과 2가 설정되면 좋습니다.이 옵션은 나중에 4, 8, 16 등이 후속 비트를 설정하는 것처럼 4 개 이상의 플래그가 필요할 것으로 생각되는 경우에 가장 좋습니다.

이 모든 것이 단일 8 비트 데이터 유형에 적합하므로 메모리 낭비 나 변환이 필요하지 않습니다 (문자 기반 시스템에서 때때로 16 비트 문자가 사용되기도하고 플랫폼에 따라 8 비트가 사용되기도 함).

어떤 경우에도 null을 고려하지 않습니다. 어쩌면 데이터베이스에서는 시스템이 NULL을 명확하게 지원한다고 보장 할 수있는 곳에서만 누군가가 명시 적으로 구별하지 않고 실제로 null 일 때 0으로 끝나면 오류가 발생할 수 있습니다.


여기 IMO에 대한 최고의 답변. NULL은 DB에 추가되지 않았고 상태가 -1,0,1을 갖는 'NULL'이 아니라 NULL 일 수 있습니다. NULL은 필드가 채워지지 않았 음을 나타냅니다.
Ken

3

나는이 질문에 직접 명확한 답을 쓰려고하지 않는다. 위에서 언급 했듯이이 질문은 유스 케이스에 크게 의존합니다. 일반적으로, 나열된 모든 구현 선택 사항은 다른 시간에 다른 목적에 적합한 것으로 보입니다.

그러나 본인은 정보에 근거한 결정을 내릴 수 있도록 이러한 기본 원칙과 배경 지식에주의를 기울이고 싶습니다.


더 가벼운 쪽지에서 " 농담이 회계사에게 묻습니다. 2 + 2는 무엇입니까?"

모든 회계사 및 비 회계사에게 사과드립니다. 이 농담에 대한 언급은 우리가 곧 정의 할 무언가 의 자유 와 그에 따른 책임과 결과 (논리적 의미에서) 를 강조하기위한 것 입니다.


질문 : 3 값 논리의 진리표는 무엇입니까?

대답:

... 의자에서 일어나서 문으로 가서 문을 닫고 돌아와 앉았다. 책상을 기대어

... 그리고 종이에 손으로 그린 ​​차트를 꺼냅니다.

운영 : 2014 년 3 분기 논리 및 기밀-초안

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

... 그는 "낮은 목소리로 말했다 얼마나 당신이 그 마법 값이 무엇을 할 것 같은?"

그래픽 디자이너가 프로그래머에게 "3 값 논리의 예를들 수 있습니까?"라고 묻습니다.

프로그래머는 "흑백과 같이 두 가지 색상을 줄 수 있습니까?"라고 대답합니다.

그래픽 디자이너 : "그래서 ... 흑백?"

프로그래머 : "정확합니다. 이제 세 번째 색상을 주려고합니다.하지만 ARGB 번호로 지정해야합니다. 걱정하지 않기를 바랍니다."

그래픽 디자이너 : "저는 매일 ARGB와 함께 일합니다 ..."

Black#FF000000
White#FFFFFFFF
Nothing#00000000

말. 위의 흑백은 완전히 불투명 한 색상입니다. 세 번째 색상 인 Nothing은 완전히 투명합니다. 다양한 비율로 혼합하면 흑백이 혼합되어 다양한 회색이되지만 아무것도 혼합하지 않아도 아무런 변화가 없습니다.


나는 진리표를 사용하는 것에 매우 관심이 있습니다. 다시 내 질문의 의미에 대한 내 눈을 뜨고 있습니다.
ThorSummoner

1

세 가지 가능한 상태에 고유 한 의미가있는 경우 해당 고유 한 의미에 적합한 것을 사용하십시오. 예를 들어 가능한 상태는 1, 2 또는 3이거나 100, 200 및 300 인 경우 정수를 사용하십시오. 가능한 상태가 yes, no 또는 unknown 인 경우 선택적 부울 또는 부울 오브젝트에 대한 포인터를 사용하여 값이 없거나 "yes"값 또는 "no"값을 가질 수 있습니다. 어떤 사람들은 그것을 좋아하지 않을 수도 있습니다.

정수를 가능한 상태로 해석하는 방법이 명백한 경우 정수를 사용할 수 있습니다. "less", "equal", "greater"상태 인 비교 함수가 -1, 0 및 +1을 사용할 수 있다고 가정하십시오. 어떤 사람들은 당신이 분명한 것을 분명하게 찾지 못할 수도 있습니다.

글자가 가능한 상태로 해석 될 수있는 명확한 방법이 있다면 문자를 사용할 수 있습니다. 예를 들어, 상태가 "빨간색", "녹색"또는 "파란색"인 경우 문자 'r', 'g'및 'b'를 사용할 수 있습니다. 다시, 당신에게 분명한 것은 ...

열거 형은 항상 가능합니다. 문자열은 항상 가능하지만 대부분의 언어에서 유형 검사가 손실됩니다.

어떤 사람들은 세 개의 부울 값을 사용하여 "상태 1에 있음", "상태 2에 있음", "상태 3에 있음"을 나타냅니다.

당신이 무엇을 하든지, 당신은 명백하고 이해하기 쉬운 것을 사용하려고 시도해야하며 갑자기 네 가지 상태가있는 경우 문제를 일으키지 않으며 컴파일러가 가능한 한 실수를 찾도록하십시오.


0

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.

마찬가지로 파이썬에서는 상수 세트 또는 클래스를 사용합니다 (클라이언트 코드에서 어떤 의미 / 동작이 필요한지에 따라 다름).

예를 들어 다음을 사용합니다.

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

세 가지 결과 중 하나를 반환하는 간단한 함수가있는 경우.

대신 tri-state boolean 논리가 필요한 전체 라이브러리를 가지고 있다면 값 유형을 클래스로 구현합니다.


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는 1 ~ 7 개의 요소로 튜플을 직접 지원합니다. 또한 Tuple <T1, T2, T3, T4, T5, T6, T7, TRest> 객체의 Rest 속성에 튜플 객체를 중첩하여 8 개 이상의 요소로 구성된 튜플을 만들 수 있습니다.
Adam Zuckerman

1
즉, 튜플은 모든 유형을 최대 8 개 (8 차원)까지 저장할 수 있습니다.
Adam Zuckerman


내 랭 -의 - 선택, 파이썬은 또한 튜플의 데이터 유형이 포함 독서의 비트 튜플 원 데이터에 적절한 지, 어쨌든 나에게 제안을. 또는 잠재적으로 튜플 인덱스의 값은 유스 케이스에 저장할 데이터이며 튜플은 상수와 비슷합니다. 사치품을 금지하는 제약 조건에 있지 않는 한 인덱스로 글로벌 또는 심지어 지역화 된 상수를 참조하는 것에 대한 것은 나에게 나쁜 습관처럼 보입니다.
ThorSummoner

2
튜플은 구조체와 같은 여러 요소를 동적으로 정의 할 수있는 데이터 유형입니다. 따라서 OP가 원하는 유형의 변수 3 개를 저장합니다. 그가 원하는 콘텐츠에 대한 제한을 제공하는 것은 아닙니다.
gbjbaanb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.