인수가 필요하거나 필요하지 않은 것을 알고있는 경우에 선택 사항을 메소드 인수로 사용하지 않는 이유가 있습니까?


11

Java 8에서는 Option / Optional 사용에 대한 기사가 점점 더 많이 나왔습니다. 나는 그들이 무엇을 대표하려고하는지 이해하고 있으며, 그것들의 많은 예가 반환으로 사용되는 것을 본다. 그러나 내가 보지 못하는 것은 기본 / 선택적 매개 변수에 대한 구문이없는 언어에서 메소드 / 함수 인수로 사용된다는 것입니다.

Optional인수가 필요하거나 필요하지 않은 것을 알고있는 경우 메소드 인수 로 사용하지 않을 이유 가 있습니까? 내가 생각할 수있는 예는 다음과 같습니다.

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)

이것은 Haskell에서 일반적으로 사용되는 것으로, 기본 주장이 없습니다 (고통).
Daniel Gratzer

관련 스택 오버플로 질문에 대한 답변 을 참조하십시오 . 간단히 말해서, Optional기본적으로 없을 수있는 반환 값을위한 것입니다. 물론 다른 용도도 가능하지만 번거롭고 스타일이 좋지 않을 수 있습니다.
스튜어트 마크 2

답변:


6

한 가지 이유는 개념적으로,이다 firstName, middleName그리고 lastName논리적으로있는 하나 개의 인수가 아닌 세. 그것들은 더 큰 전체의 모든 부분이며, 거의 항상 함께지나 갔다고 상상할 수 있습니다. 기능적 언어에서는 튜플 또는 레코드로 전달 될 수 있습니다. Java에는 이러한 기능이 없기 때문에 Name 클래스로 집계 될 수 있습니다. 전체 이름을 가져오고 리턴하는 함수를 작성해야하는 경우 집계하지 않고는 기능을 수행 할 수 없습니다. 결국 하나의 값만 리턴 할 수 있습니다.

값이 선택적이고 더 큰 전체의 일부가 아닌 경우가 종종 발생하지 않을 수도 있습니다. 함수 작업을 수행 하기 위해 특정 값이 필요한 경우 해당 함수 는을 허용하지 않아야합니다 Optional. 값을 반환하지 않을 수있는 작업을 연결해야하는 Nothing경우 도중에 함수가 실패하면 중단 되고에 대한 호출을 체인화 할 수 flatMap있으며 예외로 실패하려는 경우 get()모든 단계에서 또는 체인의 끝.

값이 실제로 선택적이고 함수가 존재 또는 부재에 따라 두 가지 다른 일을하는 경우, 함수가 각각 하나의 작업을 수행하는 두 개의 작은 함수의 래퍼가 아니며 특정 결정 조합이 매우 일반적이지 않으면 코드 냄새가납니다.

나는 그것이 상대적으로 드문 유스 케이스이기 때문에 그것이 잘못되었다고 생각하지 않습니다.


5

기본 인수를 지원하지 않는 언어는 많지 않으므로 일반적인 사용법은 아닙니다. 나는 개인적으로 당신의 사용법이 끔찍하지 않다고 생각하지만 관용적 인 Java는 아닙니다. Java는 의도적으로 오버로드를 강제로 사용하기 위해 기본 인수를 가지고 있지 않으므로 컴파일러 if는 함수 내부에 명령문 을 요구하는 대신 인수를 검사하는 이점 이 있습니다.

다시 말해, 두 가지 버전의 쿼리를 만들 것입니다. 하나는 중간 이름이고 다른 하나는없는 것입니다. 간결하게 그렇게 할 수 있다면 옵션을 사용하는 것이 좋습니다. 어쨌든 두 개의 별도 기능으로 원할 정도로 장황하다면 오버로드를 사용하여 관용적으로 만들 수 있습니다.

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