[oop] null 잘못된 디자인을 반환합니까? [닫은]

메서드에서 반환 된 null 값을 확인하는 것이 나쁜 디자인이라는 일부 목소리가 들렸습니다. 이에 대한 몇 가지 이유를 듣고 싶습니다.

의사 코드 :

variable x = object.method()
if (x is null) do something



답변

null을 반환하지 않는 이유는 확인하지 않아도되므로 코드가 반환 값에 따라 다른 경로따를 필요가 없다는 것 입니다. 널 오브젝트 패턴 을 확인하고 싶을 수도 있습니다. 대한 자세한 정보를 제공 .

예를 들어, 컬렉션을 반환하는 Java에서 메소드를 정의하려는 경우 일반적으로 Collections.emptyList()클라이언트 코드가 더 깨끗하다는 의미에서 null 대신 빈 컬렉션을 반환하는 것을 선호합니다 . 예 :

Collection<? extends Item> c = getItems(); // Will never return null.

for (Item item : c) { // Will not enter the loop if c is empty.
  // Process item.
}

…보다 깨끗한 것 :

Collection<? extends Item> c = getItems(); // Could potentially return null.

// Two possible code paths now so harder to test.
if (c != null) {
  for (Item item : c) {
    // Process item.
  }
}


답변

그 이유가 있습니다.

로버트 마틴 클린 코드 그는 널 (null)을 반환하는 것은 나쁜 대신 반환 할 수 있습니다 디자인, 말, 빈 배열이라고 씁니다. 예상 결과가 배열이므로 왜 안됩니까? 추가 조건없이 결과를 반복 할 수 있습니다. 정수이면 해시, 빈 해시이면 0이면 충분합니다. 기타

전제는 문제를 즉시 처리하도록 호출 코드를 강요하지 않는 것입니다. 호출 코드는 그들 자신과 관련이 없을 수도 있습니다. 그렇기 때문에 많은 경우에 예외가 nil보다 낫습니다.


답변

null을 반환하는 좋은 사용법 :

  • null이 유효한 기능적 결과 인 경우 : 예를 들면 다음과 같습니다. FindFirstObjectThatNeedsProcessing ()은 찾을 수없는 경우 null을 반환 할 수 있으며 호출자는 그에 따라 확인해야합니다.

나쁜 용도 : 다음과 같은 예외적 인 상황을 대체하거나 숨기려고합니다.

  • catch (…) 및 null을 반환
  • API 종속성 초기화 실패
  • 디스크 공간 부족
  • 유효하지 않은 입력 매개 변수 (프로그래밍 오류, 호출자가 입력을 삭제해야 함)
  • 기타

이러한 경우에 예외를 던지는 것이 더 적합합니다.

  • null 반환 값은 의미있는 오류 정보를 제공하지 않습니다.
  • 즉시 발신자는 오류 상태를 처리 할 수 ​​없습니다.
  • 발신자가 null 결과를 확인한다고 보장 할 수 없습니다

그러나 다음과 같은 정상적인 프로그램 작동 조건을 처리하는 데 예외를 사용해서는 안됩니다.

  • 잘못된 사용자 이름 / 비밀번호 (또는 사용자 제공 입력)
  • 속보 루프 또는 로컬이 아닌 고 토스

답변

예, 객체 지향 세계에서 NULL을 반환하는 것은 끔찍한 디자인 입니다. 간단히 말해서 NULL 사용법은 다음과 같습니다.

  • 임시 오류 처리 (예외 대신)
  • 모호한 의미
  • 빠른 실패 대신 느리게
  • 객체 사고 대신 컴퓨터 사고
  • 변경 가능하고 불완전한 객체

: 자세한 설명이 블로그 게시물 확인 http://www.yegor256.com/2014/05/13/why-null-is-bad.html을 . 나의 책에서 더 많은 것은 우아한 객체들 , 섹션 4.1.


답변

이것이 나쁜 디자인이라고 누가 말합니까?

null 검사는 일반적인 관행이며 권장되는 경우도 있습니다. 필요하지 않을 때 예외를 throw하는 것보다 오류를 정상적으로 처리하는 것이 좋습니다.


답변

지금까지 말씀하신 내용에 의하면 충분한 정보가 없다고 생각합니다.

CreateWidget () 메소드에서 null을 반환하는 것은 좋지 않은 것 같습니다.

FindFooInBar () 메서드에서 null을 반환하는 것이 좋습니다.


답변

발명가 10 억 달러의 실수 라고 말합니다 !