2016-10-27 2 views
1

아래의 유사 코드와 비슷한 작업을 수행하려고합니다. 중첩 된 클래스를 사용하기위한 규칙이나 모범 사례에 위배 되는가?외부 클래스 내에서 여러 목록을 보유하는 정적 중첩 캐쉬

public class Foo{ 
    private list1, list2; 

    Bar bar = new Bar(list1, list2); 
    // use bar.listA, bar.listB, bar.listC, 
    //bar.listD, bar.listE 

    private static class Bar{ 
    private list1, list2; 
    private listA, listB, listC, listD, listE; 

    private Bar(list1, list2) { 
     this.list1 = list1; 
     this.list2 = list2; 
     //logic to split list1 and list2 into 5 lists: listA, listB, listC, listD, listE. 
     //initialize the 5 lists 
    } 
    } 
} 

나는 논리적으로 하나 개의 장소에서 사용되는 클래스를 그룹화하는 방법은 오라클에 의해 언급 된 이유로 중첩 된 클래스를

  • 그것은 캡슐화
  • 증가시킨다 or the reasons mentioned by Oracle:

    • 그것이 사용하고
    • 더 읽기 쉽고 유지할 수있는 코드
    • 그리고 이유 mentioned here

    외부 클래스 멤버에 직접 액세스 할 필요가 없기 때문에 중첩 클래스를 정적으로 만들고 있습니다.

    편집 : 더 구체적으로하기 위해 내 마음 속에 몇 가지 질문이 있습니다. 중첩 된 클래스 대신 ENUM을 사용해야합니까? 중첩 클래스의 5 목록에 getters/setter를 사용해야합니까? 중첩 된 클래스의 생성자가 분할 논리를 넣을 올바른 위치입니까? 중첩 클래스의 private 멤버를 외부 클래스에서 직접 참조 할 수 있습니까?

    +0

    그런 추상적 인 디자인에 대해서는 추론하기가 어렵습니다. 현실 세계의 어떤 문제를 해결하려고하십니까? – plalx

    +0

    2 개의 목록이 바깥 쪽 인스턴스로 전달되면, 난 단지 5 개의 목록으로 나누고 바깥 쪽 인스턴스에서만 핸들을 사용하는 우아한 방법이 필요합니다. 그것의 단지 데이터 변환 프로세스. – Gadam

    +0

    그저 그렇다면 외부 클래스에서 기능적 솔루션을 구현할 것이고 중첩 클래스 나 OO 디자인 형태로 신경 쓰지 않을 것입니다. 그러한 목록에 대해 특별한 행동을 취하지 않는 한 그렇습니다. 분할 논리는 어떻게 사용되며, 어떻게 사용됩니까? 일부 동작은 일부 목록에만 적용됩니까? – plalx

    답변

    1

    list1 및 list2에는 '이벤트가 있습니다. 당신이 그들의 부작용에 대한 생성자를 사용하지 않아야 일반적인 경험 그리고 사건의 '종류'에 따라, 나는 5 개 목록 음

    로를 분할 .

    따라서 Foo 내에서 groupEvents 기능을 선택하는 것이 좋습니다. 그룹화 논리가 상당히 복잡하면 GroupedEvents 인스턴스 또는 Map<EventType, List<Event>>과 같은 값을 반환하는 EventGrouper 상태 비 저장 서비스를 가질 수 있습니다.

    예.

    public class Foo { 
        private GroupedEvents groupedEvents; 
    
        public Foo(List<Event> list1, List<Event> list2) { 
         this.groupedEvents = groupEvents(list1, list2); 
        } 
    
        private GroupedEvents groupEvents(List<Event> list1, List<Event> list2) { 
         Map<EventType, List<Event>> eventsByType = //perform grouping 
         return new GroupedEvents(eventsByType); 
        } 
    } 
    

    논리 당신이 중첩 여부 중 하나 인 무 EventGrouper 클래스에 groupEvents 기능을 이동할 수만큼 복잡하다면

    . 디자인의 중요한 측면은 EventGrouper이 생성자 내부에서 그룹화를 수행하지 않아야한다는 것입니다.

    지금 나는 당신이 말하는 것을 들었다. 그럼 지금은 생성자에서 그룹화를하고있는 것은 Foo입니까? 우리가 문제를 체인에서 밀어 붙이지 않았습니까? 글쎄, 그룹화가 Foo의 생성 중에 발생하는 것은 사실이지만, Foo 객체의 클라이언트는 그룹화 부작용에 대해서만 Foo 인스턴스를 인스턴스화하지 않습니다. (잘하면 그렇지 않습니다.) 그룹화는 Foo의 초기화 프로세스의 일부로 구현 세부 사항이되며 클라이언트는 이러한 그룹화가 발생했는지조차 모를 수도 있습니다.

    +0

    'Map >'대신에'GroupedEvents'를 사용하면 5 개의 개인 목록 만 멤버로 가질 수 있습니다. 맞습니까? Foo 내에서만 사용되기 때문에 중첩 된 정적 클래스로 만들 수 있습니까? – Gadam

    +0

    @ 가디언 (Gadam) 5 가지 유형의 이벤트 만있는 경우 5 개의 목록을 가질 수 있지만 특정 유형의 이벤트를 내부적으로 검색하기 위해'eventsOfType (EventType type) '과 같은 기능을 단순히 갖고 있다면 더 유연 할 것입니다 그들을지도에 저장하십시오. 예, 클래스는 원하는 경우 중첩 될 수 있지만 중첩되어 있으므로 단위 테스트가 가능합니다. – plalx

    관련 문제