질문이 "단일 int를 반환하는 메소드에서 두 개의 관련되지 않은 정보를 어떻게 반환합니까? 반환 값을 확인하고 싶지 않으며 null이 잘못되어 사용하지 마십시오."
전달하고자하는 것을 살펴 보자. 왜 int를 줄 수 없는지에 대한 int 또는 non-int 이론적 근거 를 전달하고 있습니다. 이 질문은 두 가지 이유 만있을 것이라고 주장하지만 열거 형을 만든 사람은 누구나 목록이 커질 것임을 알고 있습니다. 다른 근거를 지정하는 범위는 의미가 있습니다.
처음에는 예외를 던지는 경우가 좋은 것처럼 보입니다.
호출자에게 리턴 타입이 아닌 특별한 것을 말하고 싶을 때 예외는 종종 적절한 시스템입니다 : 예외는 단지 오류 상태만을위한 것이 아니며, 당신이 왜 할 수 있는지 설명하기 위해 많은 맥락과 근거를 반환 할 수있게합니다. 오늘은 아니야
그리고 이것은 유일하게 보장 된 유효한 정수를 반환 할 수있게하는 유일한 시스템이며, int를 취하는 모든 int 연산자와 메소드는 null 또는 매직 값과 같은 유효하지 않은 값을 확인할 필요없이이 메소드의 반환 값을 수락 할 수 있습니다.
그러나 이름에서 알 수 있듯이 이것이 정상적인 비즈니스 과정이 아닌 예외적 인 경우 예외는 실제로 유효한 솔루션 일뿐 입니다.
그리고 try / catch와 handler는 null check와 같은 수준의 상용구입니다.
발신자가 try / catch를 포함하지 않으면 발신자의 발신자 등이 있어야합니다.
순진한 두 번째 단계는 "측정입니다. 음의 거리 측정은 가능하지 않습니다."라고 말합니다. 따라서 일부 측정 Y의 경우 다음에 대한 const를 가질 수 있습니다.
- -1 = 알 수 없음
- -2 = 측정 불가,
- -3 = 답변 거부
- -4 = 알지만 기밀
- -5 = 달의 위상에 따라 달라집니다 (표 5a 참조).
- -6 = 4 차원, 제목에 주어진 측정,
- -7 = 파일 시스템 읽기 오류
- -8 = 나중에 사용하기 위해 예약 됨
- -9 = 사각 / 입방체이므로 Y는 X와 같습니다.
- -10 = 모니터 화면이므로 X, Y 측정을 사용하지 않습니다. 화면 대각선으로 X를 사용합니다.
- -11 = 영수증 뒷면에 측정 값을 기록하고 판독 할 수 없었지만 5 또는 17이라고 생각합니다.
- -12 = ... 아이디어를 얻었습니다.
이것은 많은 오래된 C 시스템과 int에 대한 진정한 제약이있는 현대 시스템에서도 수행되는 방식이며 어떤 유형의 구조체 또는 모나드로 래핑 할 수 없습니다.
측정 값이 음수이면 데이터 유형을 더 크게 만들고 (예 : long int) 매직 값을 int 범위보다 높게 설정하고 디버거에 명확하게 표시되는 일부 값으로 시작하는 것이 이상적입니다.
하지만 마법의 숫자 만 사용하는 것이 아니라 별도의 변수로 사용하는 것이 좋습니다. 예를 들어 엄격한 타이핑, 유지 관리 및 기대치 준수.
세 번째 시도에서, 우리는 비 -int 값을 갖는 것이 일반적인 비즈니스 과정 인 경우를 살펴 봅니다. 예를 들어, 이러한 값의 모음에 정수가 아닌 여러 항목이 포함될 수 있습니다. 이는 예외 처리기가 잘못된 접근 방법 일 수 있음을 의미합니다.
이 경우 int와 이론적 근거를 전달하는 구조에 적합합니다. 다시 말하지만,이 이론적 근거는 위와 같은 구성 요소 일 수 있지만, 둘 다 동일한 int로 유지하는 대신 구조의 별개의 부분으로 저장합니다. 처음에는 이론적 근거가 설정되면 int가 설정되지 않을 것이라는 규칙이 있습니다. 그러나 우리는 더 이상이 규칙에 묶이지 않습니다. 필요한 경우 유효한 숫자에 대한 근거도 제공 할 수 있습니다.
어느 쪽이든, 당신이 그것을 호출 할 때마다 int가 유효한지 확인하기 위해 이론적 근거를 테스트하기 위해 상용구가 필요합니다. 이유가 가능하다면 int 부분을 꺼내서 사용하십시오.
여기서는 "null을 사용하지 마십시오"에 대한 추론을 조사해야합니다.
예외와 마찬가지로 null은 예외적 인 상태를 나타냅니다.
호출자가이 메소드를 호출하고 구조의 "합리적"부분을 완전히 무시하고 오류 처리없이 숫자를 예상하고 0을 얻으면 0을 숫자로 처리하여 잘못 처리합니다. 마법의 숫자를 얻으면 그 숫자를 숫자로 취급하고 잘못합니다. 그러나 null을 얻으면 제대로 수행되므로 넘어 집니다.
따라서이 메소드를 호출 할 때마다 반환 값을 확인해야하지만 대역 내 또는 대역 외에서 시도 / 캐치, "합리적"구성 요소에 대한 구조 확인, int 확인과 같은 유효하지 않은 값을 처리해야합니다. 마법의 숫자 또는 null에 대한 int 확인 ...
유효하지 않은 int와 "My dog가이 측정 값을 먹었습니다"와 같은 이론적 근거를 포함 할 수있는 출력의 곱셈을 처리하는 대안은 해당 구조에 대한 곱셈 연산자를 오버로드하는 것입니다.
... 그리고이 데이터에 적용될 수있는 응용 프로그램의 다른 모든 연산자를 오버로드하십시오.
... 그리고 int가 걸릴 수있는 모든 메소드를 오버로드하십시오.
... 그리고 모든 오버로드 에는 여전히 유효하지 않은 정수에 대한 검사 가 포함되어 있어야합니다. 따라서이 한 메소드의 반환 유형을 호출 할 때 항상 유효한 정수 인 것처럼 처리 할 수 있습니다.
따라서 원래 전제는 여러 가지면에서 거짓입니다.
- 유효하지 않은 값이 있으면 값을 처리하는 코드의 어느 시점에서나 유효하지 않은 값을 확인하지 않아도됩니다.
- int 이외의 것을 반환하면 int를 반환하지 않으므로 int처럼 취급 할 수 없습니다. 연산자 오버로드를 사용하면 가장 할 수 있습니다 .
- 마법의 숫자 (NULL, NAN, Inf ... 포함)가있는 정수는 더 이상 정수가 아니며 가난한 사람의 구조체입니다.
- null을 피하면 코드가 더 강력 해지지 않으며 int의 문제를 숨기거나 복잡한 예외 처리 구조로 옮길 수 있습니다.