2014-07-09 3 views
1

내 프로젝트에는 레이아웃, 그룹, 상자 및 기타 여러 개체가 있습니다.. 이러한 객체를 가져 와서 제거하고 컬렉션에 넣는 메소드가있는 목록이나 맵에 저장해야합니다. 개체의 각 종류 또는 컬렉션을 보유 할 수있는 단일 클래스의 컬렉션을 보유 별도의 클래스를 가지고개체 목록 또는지도를 어디에 저장해야합니까?

public class Layout { 
    private static Map<String, Layout> layouts = new HashMap<String, Layout>(); 
    /* 
    Other, non-static variables 
    */ 

    public static void addLayout(String name, Layout layout) { 
     layouts.put(name, layout); 
    } 

    public static Layout getLayout(String name) { 
     return layouts.get(name); 
    } 

    public static void removeLayout(String name) { 
     layouts.remove(name); 
    } 

    /* 
    Non-static methods for layout 
    */ 
} 

이 더 잘 될 것이다 : 나는 현재, 예를 들어 내가 가진, 연관된 클래스의 정적 메서드와 변수를 사용하고 있습니다 모든 물건들? 그렇다면이 수업에 어떤 종류의 이름을 사용합니까?

+0

응용 프로그램에 대해 더 알지 못해도 말하기 란 정말 불가능합니다. OO 디자인에 대해 더 알아야합니다 ... – djechlin

+1

왜 정적을 사용하고 있습니까? –

+0

OO 디자인에 대해 배우고, 함께 놀고, 무엇이 떠오르는 지 알아볼 수있는 기회. 당신은 그 과정에서 좋은 것을 배울 것입니다. 또한이 맵을 가진 클래스를 만들려면 몇몇 이름은'LayoutManager','LayoutConfiguration','LayoutFactory' (http://en.wikipedia.org/wiki/Factory_method_pattern)입니다. 그냥 몇 가지 생각. 그 이름은 클래스가 무엇을하는지 반영해야합니다. 'Layout'이 무엇을 말하기 힘든지 모르겠다. –

답변

2

솔루션의 장점은 모든 클래스가 하나의 클래스에 포함되어 더 이상 종속성이 필요 없다는 것입니다. 그러나 정적 메서드를 사용하면 정적 메서드를 사용하여 구현을 테스트하기가 어려워집니다. 나는 하나의 클래스를 모두 사용하지 않고 의존성 자석을 만들 것입니다.

더 나은 방법은 레이아웃 저장 및 검색을위한 LayoutRepository와 같은 각 클래스에 대한 리포지토리를 만드는 것입니다. 응용 프로그램이 커지면 Spring과 같은 컨테이너에서 구현되는 종속성 주입과 함께 사용하는 것이 가장 좋습니다.

가장 간단한 것이 일반적인 구현 :

public class Repository<E> { 

    private final Map<String,E> elements = new HashMap<>(); 

    public void add(String name, E element) { 
    elements.put(name, element); 
    } 

    public E get(String name) { 
    return elements.get(name); 
    } 

    public void remove(String name) { 
    elements.remove(name); 
    } 
} 

그래서 당신은 저장소에 클래스에서 분리 된 저장소의 구현이있다. 코드를 사용하지 않고 파일이나 데이터베이스를 사용하여 기능을 간단하게 다시 구현할 수 있습니다.

단위 테스트의 경우 저장소를 모의 해보면 올바르게 사용되었는지 확인할 수 있습니다.

클래스 생성 등. 레이아웃은 유효한 상태를 보장해야하며, 빌더는 좋은 개선이 될 것입니다. 또 다른 옵션은 팩토리를 사용하여 인스턴스 생성을 제어하는 ​​것입니다. 둘 다 요소 클래스 및 생성자와 동일한 패키지에 배치되어야하며 더 이상 public이 아니어야합니다.