2010-05-21 4 views
1

나는 수학과 같이 값의 간격에 대한 컨테이너 여야하는 클래스를 만들어야합니다. 이미 내부적으로 SortedSet을 사용할 것이라고 결정했습니다.SortedSet을 반환하는 메서드의 반환 유형을 결정하는 데 문제가 있습니다.

내가 구현해야하는 것 중 하나는 "간격의 모든 요소가있는 정렬 된 집합을 가져 오는"메서드입니다.

class Interval { 
    private SortedSet sortedSet = new something(); 

    ... 

    <<method that should return an ordered set of values>> 
} 

내 질문은 메소드의 반환 타입과 이름을 모두해야한다 무엇에 있습니다. 몇 가지 가설이 발생할 : 나는 내부적으로 SortedSet을 사용하고

  1. SortedSet getSortedElements();, 그래서 유형을 반환해야합니다. 방법의 이름에 그 의도를 기술해야합니다.
  2. SortedSet getElements(); 나는 내부적으로 SortedSet을 사용하고 있지만 메서드 이름에는 그 점을 명시하지 않아도됩니다. (이 점에서 큰 점은 없습니다).
  3. Set getElements(); 나는 항상 가장 기본적인 유형을 반환하려고 노력해야하므로 Set을 반환합니다. 방법의 계약과 정의에 따라 사람들은 이미 모든 요소가 순서에 있음을 알고 있습니다.
  4. Set getSortedElements(); 메소드 반환 유형에 대해서는 위와 동일합니다. 메서드 이름에 관해서는이 메서드가 반환 할 내용, 즉 정렬되는 요소 집합을 명확하게 설명하고 있습니다.

나는 4.을 사용하려고하지만 다른 것들도 괜찮아 보입니다. 분명한 승자가 있습니까? 왜?

+0

질문이 이해가 가지 않습니다. SortedSet은'public SortedSet subSet (E fromElement, E toElement)' – Pyrolistical

+0

Re로 이미 필요한 것을 구현합니다. 메소드의 이름 인 "Elements"가 너무 일반적입니다. 메소드 이름이 더 구체적이어야합니다. " 요소"... 특히 언젠가 다른 콜렉션을 클래스에 추가해야하는 경우 getElements가 모호 해집니다. – inor

답변

4

SortedSet은 요소가 정렬되는 계약 인터페이스입니다. 또한 Set에서 사용할 수없는 몇 가지 방법 (예 : first())을 노출합니다. 해당 계약을 준수하는 객체를 반환해야한다면 (예 : iterator()에서 주문한 값을 반환하는 경우) Sorted Set을 반환해야합니다. 그렇지 않은 경우 Set (또는 Collection)을 반환해야합니다.

결과를 사용하는 방법에 따라 반환 할 결과를 파악할 수 있습니다. "간격의 모든 요소가 포함 된 순서가 지정된 집합을 가져 오는 것"이 ​​무엇인지 먼저 생각한 다음 구현을 염려하십시오. SortedSet는 인터페이스이기 때문에 그런데

코드

private SortedSet sortedSet = new SortedSet(); 

는 불법입니다. 이것이 숙제이기 때문에 나는 그것이 문제인 이유를 알아 내기 위해 당신에게 맡길 것입니다.

+1

+1 반환 값 유형과 매개 변수 유형은 가능한 한 계약을 반영해야합니다. 그리고 매개 변수 유형을 덜 구체화하고 유형을보다 구체적으로 반환하는 것이 일반적으로 호출자에게 편리합니다. –

+0

네, 게시물을 쓰는 동안 TreeSet을 사용 하겠지만 "무언가"로 전환했습니다. –

1

나는 Set을 반환하는 것이 유지 보수를 위해 올바른 방법이라고 생각합니다. 그러나 메소드 이름이 마음에 들지 않습니다. 더 구체적인 설명이 필요하지 않은 이유는 무엇입니까?

Set getIntervalValues(); 

또는 그와 유사한 내용을 입력 해주세요.

+0

메소드 이름이 마음에 들었습니다. –

+0

메서드가 SortedSet를 반환 할 때 호출자가 Set를 더 편리하게 사용하는 이유는 무엇입니까? 반대라고 생각합니다. 호출자가 결과를 SortedSet으로 사용하려면 결과를 SortedSet에 할당하면됩니다. 그녀가 주문에 관심이 없다면 그 결과를 세트에 지정할 수 있습니다. 이제 메소드 반환 유형이 Set 인 경우 호출자가 SortedSet (예 : first() 등 호출)을 사용하여이를 형변환해야합니다 (보기 흉하고 위험한 것) - 구현자가 구현을 변경하기로 결정한 경우 정렬되지 않은 집합? – inor

+0

나는 방법의 이름에 관한 부분에 동의하기 때문에 +1을주었습니다. – inor

0

메서드가 SortedSet을 반환한다고 가정하면 메서드의 반환 형식이어야합니다. 호출 측은, 순서 붙일 지 어떤지에 응해, 결과를 SortedSet 또는 Set에 할당 할 수 있습니다. 메서드 javadoc 또는 name이 정렬 된 집합을 반환하지만 해당 메서드의 반환 형식이 Set 일 경우 (즉, 해당 서비스에 대해 100 달러를 지불하겠다고 배관공에게 말한 것과 같지만 계약서에 비용을 지불해야 함) "적어도 50 달러".

SortedSet을 반환함으로써
1) 귀하는 귀하의 고객에게 귀하가 소트 된 세트를 돌려주고 있음을 약속합니다. 고객의 코드를 깨지 않고 (컴파일하지 않음) 계약을 변경할 수 없습니다.
반환 값의 형태가 Set의 경우, javadoc의 클라이언트/호출 원에 대해서, 또는 메소드의 이름으로 무엇을 약속해도 상관 없습니다. 소트되어 있지 않은 세트를 돌려 주도록 (듯이), 언제라도 구현을 변경할 수 있습니다. . 반환 유형이 Set이고 호출자가 SortedSet 기능을 원하면 반환 된 값을 SortedSet (못생긴)로 캐스팅 할 수 있지만 정렬되지 않은 (여전히) Set을 반환하려는 경우 언젠가는 호출자 코드는 런타임에 중단됩니다 (고객에게 매우 위험합니다. 클라이언트 코드가 정상적으로 실행되고 있다고 가정하고 제공 한 라이브러리를 업그레이드하십시오 ...).
2) 발신자는 결과의 정렬 된 세트가 필요할 수 있습니다. Set를 반환하는 경우 결과를 다시 정렬하려는 유혹을받을 수 있습니다 (javadoc을 읽도록 요청 하시겠습니까?). SortedSet을 반환하면 다시 정렬 할 필요가 없다는 것을 알 수 있습니다.

관련 문제