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


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.