2014-10-09 2 views
1

[Int, MyClass]의 Map을 인수로 취하는 메서드가 있습니다. 이런 식으로 뭔가 :스칼라 메서드 인수 : 컬렉션의 옵션 또는 기본값

MyMethod라는 (someMap : 맵 [INT, MyClass에])

그러나, someMap은 항상 존재 (스칼라 자바 세계와 없음에 널 (null))하지 않을 수 있습니다. 보기의 API 점에서이 방법의 더 나은 디자인은 다음 중 : MyMethod라는 (someMap : 옵션 [맵 [INT, MyClass에]] = 없음)

옵션에 포장

  1. 기본 빈 상태 (empty)의 맵을 정의 : MyMethod라는 (someMap : 맵 [INT, MyClass에] = Maps.empty가)

첫 번째 옵션은 우아한 외모, 그러나 그것은 하나가 추가 된 복잡성은 포장한다 지도 (if not (None))을 Some()에서 구현하고 구현 자 (implementor)에서 그것을 unwrap하기 위해 getOrElse를 수행해야한다. 첫 번째 옵션은 API 개체가 실제로 존재하지 않을 수도 있음을 나타냅니다. (없음)

두 번째 옵션에서는 래핑 (일부) 또는 래핑 해제 (unwrapping) 빈 컨테이너는 기존 Map 객체가 없을 때마다 인스턴스화되어야합니다.

또한 옵션 agains 1 : Option 자체가 0 또는 1 항목의 컨테이너이고 Map은 컨테이너 (컬렉션)입니다. 다른 컨테이너에 컨테이너를 포장하는 것이 좋은 디자인입니까?

API 디자인 관점에서 어느 것이 더 나은 접근 방법입니까?

답변

4

올바른 질문은 myMethodOption과 함께 작동하는 것이 맞습니까? myMethod의 관점에서

, 어쩌면 가 작동 할지도가없는 경우 myMethod를 호출하지 발신자의 Responsibility는 어떤 경우 Map 작동합니다.

반면에 myMethod이없는 경우는 Map이 없거나이 입력란이 비어 있고이 경우를 처리하는 책임이 있습니다.

올바른 답변은 없지만 올바른 인수는 메소드의 책임을 존중하는 것입니다. 목표는 당신의 기능과 수업 사이에 높은 결합력과 낮은 결합력을 갖는 것입니다.

+0

Jean에게 감사드립니다. 따라서 Map에 넣을 객체의 존재 여부는 데이터 기반이며 런타임으로 결정됩니다. 따라서 Option을 사용하면 API 사용자가 Maps가 None이 될 수 있음을 알 수 있습니다. 메소드 btw는 Map이없는 경우에는 다른 동작을 수행해야합니다. Option.foreach/maps가 처리합니다. – exifguy

3

Map.emptycheap operation이며, 그 결과는 불변이다. 따라서 실제로는 오버 헤드가 없습니다. 따라서 간단하게 포장하고 포장없이 Map을 요청하십시오.