null
사용법은 응용 프로그램 / 언어에 따라 다름
궁극적 null
으로 유효한 응용 프로그램 값 으로 사용할지 여부 는 응용 프로그램 및 프로그래밍 언어 / 인터페이스 / 에지에 따라 결정됩니다.
기본적으로 고유 한 값 클래스가있는 경우 고유 한 유형을 사용하는 것이 좋습니다. null
인터페이스에서 허용하고 표시하려는 속성의 클래스가 두 개만있는 경우 옵션이 될 수 있습니다. 인터페이스 나 형식에서 허용하는 경우 속성을 생략해도됩니다. 새로운 집계 유형 (클래스, 객체, 메시지 유형)이 다른 옵션 일 수 있습니다.
문자열 예제의 경우 이것이 프로그래밍 언어 인 경우 몇 가지 질문을합니다.
- 향후 유형의 값을 추가 할 계획입니까? 그렇다면
Option
인터페이스 디자인에 더 좋을 것입니다.
- 소비자 통화의 유효성을 언제 확인해야합니까? 정적으로? 동적으로? 전에? 후? 조금도? 프로그래밍 언어에서 지원하는 경우 유효성 검사를 위해 작성해야하는 코드 양을 피할 수 있으므로 정적 입력의 이점을 사용하십시오.
Option
문자열이 null이 아닌 경우이 경우를 가장 잘 채울 수 있습니다. 그러나 null
어쨌든 사용자 입력에서 문자열 값 을 확인해야 할 것이므로 첫 번째 질문 줄로 다시 돌아 가야 할 것입니다. 얼마나 많은 유형의 값을 나타내고 싶습니까?
- 가
null
내 프로그램 언어의 프로그래머 오류를 나타내는? 불행하게도, null
일부 언어에서 초기화되지 않은 (또는 명시 적으로 초기화되지 않은) 포인터 또는 참조의 기본값이 종종 있습니다. 가 null
기본 값으로 허용되는 값으로? 그것은이다 안전 기본 값으로? 때때로 null
할당 해제 된 값을 나타냅니다. 인터페이스 소비자에게 프로그램에서 이러한 잠재적 메모리 관리 또는 초기화 문제에 대한 표시를 제공해야합니까? 그러한 문제에 직면했을 때 그러한 통화의 실패 모드는 무엇입니까? 호출자가 광산과 동일한 프로세스 또는 스레드에있어 그러한 오류가 내 응용 프로그램에 높은 위험을 줄 수 있습니까?
이러한 질문에 대한 답변에 따라 null
인터페이스에 적합한 지 여부를 결정할 수 있습니다.
실시 예 1
- 어플리케이션은 안전에 중요합니다
- 시작시 일부 유형의 힙 초기화를 사용하고
null
있으며 문자열에 공간을 할당하지 못한 경우 다시 전달 될 수있는 문자열 값입니다.
- 그러한 문자열이 인터페이스에 부딪 칠 가능성이 있습니다.
답 : null
아마 적절하지 않습니다
이론적 근거 : null
이 경우 실제로 두 가지 유형의 값을 나타내는 데 사용됩니다. 첫 번째는 인터페이스 사용자가 설정하고자하는 기본값 일 수 있습니다. 불행하게도, 두 번째 값은 시스템이 올바르게 작동하지 않음을 나타내는 플래그입니다. 이러한 경우 가능한 한 안전하게 (시스템에 의미가있는) 실패하려고합니다.
실시 예 2
char *
멤버 가있는 C 구조체를 사용하고 있습니다.
- 시스템은 힙 할당을 사용하지 않으며 MISRA 검사를 사용하고 있습니다.
- 인터페이스는이 구조체를 포인터로 받아들이고 구조체가 가리 키지 않는지 확인합니다.
NULL
char *
API 멤버 의 기본 및 안전한 값은 단일 값으로 표시 될 수 있습니다.NULL
- 사용자의 구조체 초기화시
char *
멤버를 명시 적으로 초기화하지 않을 가능성을 사용자에게 제공하려고합니다 .
답 : NULL
적절할 수 있습니다
근거 : 구조체가 NULL
검사를 통과 했지만 초기화되지 않은 경우는 거의 없습니다 . 그러나 구조체 값에 대한 체크섬 및 / 또는 구조체 주소의 범위 확인이 없으면 API가이를 설명하지 못할 수 있습니다. MISRA-C 린 터는 초기화 전에 구조체 사용을 플래그 지정하여 API 사용자를 도울 수 있습니다. 그러나 char *
멤버의 경우 구조체에 대한 포인터가 초기화 된 구조체를 가리키는 경우 NULL
구조체 초기화 프로그램에서 지정되지 않은 멤버의 기본값입니다. 따라서 애플리케이션에서 구조체 멤버 NULL
의 안전한 기본값으로 사용될 수 있습니다 char *
.
직렬화 인터페이스에있는 경우 문자열에서 null을 사용할지 여부에 대해 다음과 같은 질문을합니다.
- 가
null
잠재적 인 클라이언트 측 오류를 나타내는? JavaScript의 JSON null
의 경우 할당 실패를 나타내는 데 반드시 필요한 것은 아니므 로 아마도 아니요 입니다. JavaScript에서는 문제가있는 참조에서 객체가 없음을 명시 적으로 나타내는 데 사용됩니다. 그러나 JSON null
을 기본 null
유형에 매핑하는 비 JavaScript 파서 및 직렬 변환기가 있습니다 . 이 경우 null
특정 언어, 파서 및 시리얼 라이저 조합에 기본 사용법이 적합한 지 여부에 대한 논의를 요구합니다 .
- 속성 값이 명시 적으로 없으면 단일 속성 값 이상에 영향을 줍니까? 때로는 a
null
는 실제로 새 메시지 유형이 있음을 나타냅니다. 직렬화 형식의 소비자가 완전히 다른 메시지 유형을 지정하는 것이 더 깨끗할 수 있습니다. 이를 통해 유효성 검사 및 응용 프로그램 논리가 웹 인터페이스가 제공하는 두 가지 메시지를 명확하게 분리 할 수 있습니다.
일반적인 조언
null
이를 지원하지 않는 에지 또는 인터페이스의 값이 될 수 없습니다. 속성 값 (예 : JSON)을 입력 할 때 본질적으로 매우 느슨한 것을 사용하는 경우 가능한 경우 소비자 엣지 소프트웨어 (예 : JSON 스키마 ) 에서 스키마 또는 유효성 검사를 시도하십시오 . 프로그래밍 언어 API 인 경우 가능한 경우 (입력을 통해) 또는 런타임에 감지 할 수있을 정도로 크게 ( 사용자 인터페이스에 대한 방어 프로그래밍 ) 사용자 입력을 정적으로 확인합니다 . 중요하게도, 가장자리를 문서화하거나 정의하여 다음과 같은 의문의 여지가 없습니다.
- 특정 속성이 허용하는 유형의 가치
- 주어진 속성에 유효한 값 범위
- 집계 유형을 구성하는 방법 집계 유형에는 어떤 속성이 있어야합니까?
- 컨테이너 유형 인 경우 컨테이너가 보유 할 수있는 항목 수와 컨테이너가 보유하는 값의 유형은 무엇입니까?
- 컨테이너 또는 집계 유형의 속성 또는 인스턴스가 반환되는 순서는 무엇입니까?
- 특정 값을 설정하면 어떤 부작용이 발생하며 해당 값을 읽을 때의 부작용은 무엇입니까?