Trilean (True, False, ??)의 사용을 보시겠습니까?


22

때로는 true 또는 false를 반환 해야하는 함수가 있습니다. 그러나 때로는 세 가지 가능한 값이 더 의미가 있습니다.

일부 언어에서는 이러한 경우가 정수 또는 예외로 처리됩니다.

예를 들어 18 세 이상인 사용자의 나이를 처리하려고합니다. 그리고 당신은 이와 같은 기능을 가지고 있습니다.

if(user.isAdult(country_code)){
     //Go On
}else{
     // Block access or do nothing
}

그러나 어떤 경우에는 앱 빌드 방법에 따라 생일 필드가 불완전한 경우를 볼 수 있습니다. 그런 다음이 함수는 결정되지 않은 것을 반환해야합니다.

switch(user.isAdult()){
    case true:
        // go on
        break;
    case undetermined:
        //Inform user birthday is incomplete
    case false:
        //Block access
}

내가 말했듯이 Exceptions와 Int로 처리 할 수는 있지만, 가정에서 정의 한 상수를 사용하는 대신 언어에 참, 거짓, 결정되지 않은 것을 포함시키는 것이 매우 섹시합니다.


15

2
@Anna Lear : 젠장, 넌 날 이겼어. ^^
gablin

3
gablin : 젠장, 당신은 Anna에 대해 불평하기 위해 나를 이겼습니다.
user281377

1
어, 나도 T, F, FNF를 받고 싶었다! 주먹 떨림
Mike M.

4
@gablin, @ammoQ, @Mike M .: 죄송합니다. :)
Adam Lear

답변:


33

언어에 따라 열거 형, 정수, 기호 (예 : Lisp, Ruby), nullable 형식 (불확정 상태로 null 사용), 옵션 형식 (예 : ML) 또는 이와 유사한 구문으로 처리 할 수 ​​있습니다.

따라서 귀하의 모범과 근거가 건전하지만 개발해야 할 언어 기능의 우선 순위 목록에있는 것을 볼 수 없습니다.


C / C ++의 null은 false와 같습니다. 이 경우 -1을 반환해야합니다. 나는 결정되지 않은 상태가 자주 발생한다고 생각하지만이 구문이 실제로 존재하지 않기 때문에 항상 다르게 취급됩니다. Java에서 부울 함수는 부울 함수에 대해 true 또는 false 이외의 것을 리턴 할 수 없습니다. 따라서 다른 유형을 사용하고 반환 된 값을 잘 문서화해야합니다.
Loïc Faure-Lacroix

@Sybiam- 적절한 다른 유형을 사용하는 데 아무런 문제가 없습니다 . 내가 말했듯이 삼항 유형에 대한 논쟁을 볼 수는 있지만 곧 기존 언어에 추가되는 것을 볼 수는 없습니다.
ChrisF

6
@Sybiam : Java에서는 부울을 반환 할 수 있습니다 null. C / C ++에서는 열거 형을 반환 할 수 있습니다.
Macneil

이건 광기 야!
Loïc Faure-Lacroix

2
@Macneil 스파르타?
syockit

5

이것이 필요한 경우를 보지 못했습니다. 제시 한 예에서 해당 필드가 필요한 경우 다른 곳에서 유효성을 검사해야합니다. isAdult()본질적으로 2- 상태 방법입니다 : 당신은 또는 당신이 아닙니다. 처리 할 수없는 데이터가 발생하면 아무것도하지 않아도됩니다. 예를 들어 :

switch(user.isAdult()){
   case true:
      // go on
      break;
   default:
      // Block access.
}

2
데이터가 유효하지 않은 경우 사용자에게 새로운 연령을 입력하도록 요청하지 않는 미성년자와 다른 데이터를 수정하도록 요청할 수 있습니다. 이것은 두 가지 행동입니다. 예를 들어 일부 소셜 사이트에서는 프라이버시를 위해 불완전한 생일을 입력 할 수 있습니다.
Loïc Faure-Lacroix

2
다른 영역 / 코드 섹션에서 유효성 검사를 수행해야한다고 생각합니다. 먼저 데이터를 검증 한 후 조작하십시오.
Michael K

1
@Sybiam : 일반적으로 응용 프로그램은 필요할 때 우연히 데이터를 요구하지 않습니다. .isAdult()실제로 원하는 경우 사용자 에게 쿼리 할 수 있으며 더 잘 작동합니다.
David Thornley

5

참, 거짓, 알 수 없음

예 아니요 어쩌면

C #에서는 nullable bool을 사용할 수 있습니다 (지금 공포에서 반동 할 수 있습니다)

MS-SQL에서는 널 입력 가능 비트 필드 (ditto)를 사용할 수 있습니다.


2
널 입력 가능 부울의 문제점은 널 (null)이 없다는 것입니다. 대부분의 사람들 (포함 된)은 3 값 논리에 대해 아무것도 모르기 때문입니다. 초보자를위한 다음 중 하나 : scientopia.org/blogs/goodmath/2010/08/24/…
Frank Shearar

참 / 거짓 / 없음
Lennart Regebro

2
재밌는 것은 많은 사람들이 이진, 8 진 및 16 진을 이해하지만 3 진 주위에 마음을 감쌀 수는 없다는 것입니다. 왜 그런가요? 세 가지 가치 논리 문제를 해결할 것입니다.
Michael K

5
대부분의 사람들은 단지의 두려움이 있습니다 unknown.
dan04

2

C ++에서는 bool반환되지 않는 유형 으로 처리 하거나 예외를 처리하여 처리 할 수 ​​있습니다 . 3 값 반환 유형을 원하면을 사용하십시오 enum. 섹시하지는 않지만 작동하며, 나머지 사람들을 위해 언어를 엉망으로 만들지 않고 할 수있는 것이 더 중요합니다.

bool수 문제가 발생할 것 세 가지 값. 세 가지 값 중 하나가 bool foo; ... if (foo)...있다고 가정하면 어떻게 처리 foo합니까? bool변수 중 하나가 항상 정확 foo하고 !foo사실 과 같은 장점이 있습니다 . 프로그램에 대한 추론에 도움이됩니다.

사람들이 수치를 얻을 수있을 때 수치 처리에서 무엇을하는지 확인하십시오 NaN. 복잡합니다. 오히려 일반적인 부울 처리를 위해 처리하지 않아도됩니다.

.isAdult()불충분 한 정보를 처리 하려면 내부적으로 처리 한 다음 true또는 을 반환하십시오 false. 그렇지 않으면 사용할 때마다 다른 작업을 수행하기 전에 리턴 코드를 확인하고 처리 할 방법을 찾아야합니다. 그것은 함수가 실제로 이름이 말한 것을 수행했는지 확인하기 위해 문서를 확인해야한다는 것을 의미하며, 가독성을 위해 재앙이 될 것입니다.


2

아이디어는 매우 유용합니다. Fuzzy Logic 이라는 불확실성을 다루는 전 분야가 있습니다 .

다행히 프로그래머에게는 표준 언어 기능으로 퍼지 로직을 구현할 수 있습니다.

예를 들어, 당신이 준 경우에, 불확실한 정보는 사용자에게 질문함으로써 쉽게 결정될 수 있습니다. 따라서 당신과 같은 3 주 열거 형은 잘 작동합니다.

불확실한 다른 모든 방법이 있습니다. 이러한 질문에는 다음이 포함됩니다.

  • 내일 비가 올까요? 그것은 아직 일어나지 않았으므로 아무도 알 수 없습니다. 그러나 당신은 교육받은 추측을하고 확률을 줄 수 있습니다.
  • 별 베타 Pictoris의 태양계에서 행성에 다세포 생명체가 있습니까? 예 또는 아니오라는 정답이 있지만 현재 그 사실을 알 수는 없습니다.

0.0 (false)에서 1.0 (true) 범위의 확률을 사용하고 부동 소수점 수학을 적용하면 이러한 많은 문제를 처리 할 수 ​​있습니다.

David E. Shaw라는 컴퓨터 화학자와 컴퓨터 과학자는 이런 종류의 것을 월스트리트에 적용했으며 현재 약 25 억 달러에 달합니다. 예, 유용합니다. :-)


1

몇 년 전에 저는 가치에 대한 믿음을 부여하기 위해 나온 알고리즘 중 일부를 가지고 놀았습니다. 재미있었습니다. 궁극적으로 내가 얻은 것은 부울이 종종 적합하다는 것입니다. 실제로 이것은 참 / 거짓 / 기타 값이어야합니다. 실험에서 당시의 "최고의"코드로 이어지는 것 같습니다. 나는 그 이후로 다른 사람들이하는 일을 간절히 바꿨고, 우리가 똑같은 방식으로 일을 끝내면 내부적으로 얼마나 간단한 지 생각합니다 ... :-)


0

그러나 정수를 사용하여 스위치를 임의로 처리하면 Case 또는 Switch 문이 제대로 작동합니다.

또한 Ruby에서는 일부 상황에서 'nil'이 false로 반환되지만 항등 연산자를 사용하면을 nil == false반환 false하므로 루비 nil를 사용 하여 삼항 논리를 처리 할 수 있습니다 .


0

귀하의 경우에 또 다른 옵션은 "문의하지 말고"교장을 적용하여 통제를 뒤집고 (성인, 두뇌 차단이라는 단어에 대해 미안함)으로 변경하는 것입니다.

user.isAdult(new OnlyAllowAdultsToLogin())

OnlyAllowAdultsToLoginStrategy인터페이스를 구현하는 곳 :

interface UserAdultnessPolicy
{
   void userIsAdult();
   void userIsChild();
   void userAdultnessIsUnknown();
}

무엇을 void userIsAdult()합니까? 아마도 당신은 의미 bool userIsAdult()?
Timwi

0

아들은 이와 유사한 테스트를 효율적으로 구현하는 방법을 묻고있었습니다. 테스트되는 플래그는 true / false 일 뿐이지 만 matchkeys에는 세 가지 상태가 있습니다 (true 여야 함, false이거나 상관 없음). 물론 이것은 2 비트 데이터 구조와 약간의 비트 twiddling으로 구현할 수 있지만 코드를 보는 것만으로는 목적을 쉽게 식별 할 수 없으므로 이러한 종류의 코드는 실제로 주석 처리해야합니다.


0

C는이 기능을 대부분의 라이브러리 함수에서 구현했습니다. 예를 들어 strcmp는 2 개의 문자열을 비교하고 동일한 경우 0을 반환하고, 첫 번째가 2보다 큰 경우 1 (즉, 양의 정수), 두 번째가 첫 번째보다 큰 경우 -1 (즉, 음의 정수)을 반환합니다. .

+ / 0 /-다른 곳에서도 동일한 접근 방식을 트라이 상태로 사용할 수 있습니다. 또한 false이고 다른 값이 true이면 0을 알고 있으면 값에 대해 부울 논리를 수행 할 수 있습니다.


0

C ++의 경우 Boost는 실제로 다음과 같이 설명 된 Tribool을 구현합니다 .

tribool 클래스는 내장 bool 유형과 유사하지만 3- 상태 부울 논리에 사용됩니다. 세 가지 상태는 true, false 및 불확정이며, 처음 두 상태는 C ++ bool 유형의 상태와 동일하며 마지막 상태는 알 수없는 부울 값을 나타냅니다 (true 또는 false 일 수 있음).


-1

VB6 확인란에는이 기능이 있습니다. 확인란 값은 0 = 끄기, 1 = 켜기, 2 = 회색으로 표시 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.