가독성을 높이기 위해 간단한 클래스로 컬렉션을 감싸는 것이 과잉입니까? 구현 된 이유 입니다. 코드의 가독성을 높이기 위해

다음과 같은지도가 있습니다.

Map<Double, List<SoundEvent>> soundEventCells = new HashMap<Double, List<SoundEvent>>();

이는 값 (시점)을 해당 ‘셀’에 HashMap매핑 double합니다 SoundEvent. 각 ‘셀’에는 여러 개의을 포함 할 수 있습니다 SoundEvent. 그것이 그것이 List<SoundEvent>정확히 그것이 기 때문에 그것이 로 구현 된 이유 입니다.

코드의 가독성을 높이기 위해 매우 간단한 정적 내부 클래스를 구현하는 방법을 생각했습니다.

private static class SoundEventCell {
    private List<SoundEvent> soundEvents = new ArrayList<SoundEvent>();
    public void addEvent(SoundEvent event){
        soundEvents.add(event);
    }
    public int getSize(){
        return soundEvents.size();
    }
    public SoundEvent getEvent(int index){
        return soundEvents.get(index);
    }
    // .. remove() method unneeded
}

그리고지도 선언 (및 다른 많은 코드)보다 예를 들어 다음과 같습니다.

Map<Double, SoundEventCell> soundEventCells = new HashMap<Double, SoundEventCell>();

이것은 과잉입니까? 프로젝트에서이 작업을 수행 하시겠습니까?



답변

전혀 과잉이 아닙니다. “HashMap을 사용할 수 있습니다”로 시작하지 말고 필요한 작업으로 시작하십시오. 때로는 HashMap이 필요한 것입니다.
귀하의 경우에는 그렇지 않은 것 같습니다. 아마 당신이하고 싶은 것은 다음과 같습니다 :

public class EventsByTime {
    public EventsByTime addEvent(double time, SoundEvent e);
    public List<SoundEvent> getEvents(double time);
    // ... more methods specific to your use ...
}

당신은 분명히 이것을 말하는 많은 코드를 원하지 않습니다 :

List<SoundEvent> events = eventMap.get(time);
if (events == null) {
   events = new ArrayList<SoundEvent>();
   eventMap.put(time, events);
}

아니면 Guava Multimap 구현 중 하나를 사용할 수도 있습니다 .


답변

일부 영역에서는 가독성을 높이는 데 도움이 될 수 있지만 문제가 복잡해질 수도 있습니다. 나는 처음 읽을 때 새로운 래퍼가 내가 알아야 할 행동이있을 수 있음을 암시하므로 유창성을 위해 컬렉션을 감싸거나 확장하는 것을 개인적으로 멀리합니다. 그것을 서프라이즈 서프라이즈의 그늘이라고 생각하십시오.

인터페이스 구현을 고수한다는 것은 인터페이스에 대해서만 걱정할 필요가 있음을 의미합니다. 물론 구체적인 구현에는 추가 동작이 포함될 수 있지만 걱정할 필요는 없습니다. 따라서 누군가의 코드를 통해 길을 찾으려 할 때 가독성을 위해 일반 인터페이스를 선호합니다.

반면에, 당신이 사용 사례 발견하는 경우 않는 추가 행동에서 혜택을, 당신은 전체 깃털 클래스를 생성하여 코드를 개선하기위한 인수가 있습니다.


답변

랩핑은 작성하기로 결정한 메소드로만 기능을 제한하며, 기본적으로 코드를 증가시키지 않습니다. 최소한 다음을 시도합니다.

private static class SoundEventCell : List<SoundEvent>
{
}

여전히 예제에서 코드를 작성할 수 있습니다.

Map<Double, SoundEventCell> soundEventCells = new HashMap<Double, SoundEventCell>();

즉, 목록 자체에 필요한 기능이있을 때만이 작업을 수행했습니다. 그러나 나는 당신의 방법이 이것에 과잉 일 것이라고 생각합니다. List의 메소드 대부분에 대한 액세스를 제한하려는 이유가없는 한.


답변

또 다른 해결책은 목록을 공개하는 단일 메소드로 랩퍼 클래스를 정의하는 것입니다.

private static class SoundEventCell
{
    private List<SoundEvent> events;

    public SoundEventCell(List<SoundEvent> events)
    {
        this.events = events;
    }

    public List<SoundEvent> getEvents()
    {
        return events;
    }
}

이것은 최소한의 코드로 잘 명명 된 클래스를 제공하지만 캡슐화를 제공하여 클래스를 불변으로 만들 수 있습니다 (예 : 생성자에서 방어 적 복사를 수행 Collections.unmodifiableList하고 접근 자에서 사용 ).

(이 목록은 실제로에만이 클래스에서 사용되는 경우, 난 당신을 대체 할 더 잘 할 거라고 생각 Map<Double, List<SoundEvent>>로모그래퍼 Multimap<Double, SoundEvent>( 문서 가 종종 널 (null) 검사 논리와 오류를 많이 절약 할).)