2011-03-25 5 views
0

인터페이스를 구현하는 추상 클래스가 있습니다. 그런 다음이 추상 클래스를 확장하는 여러 클래스가 있습니다.이 추상 클래스는 일부 오브젝트의 계층 구조와 동일한 추상 클래스를 확장하는 하나 이상의 오브젝트 목록으로 구성되며 일부 레벨에 대해 반복됩니다. 본질적으로구성된 단일 항목 인스턴스의 단일 항목 컬렉션 적용

public interface Bar 

public abstract class BarImpl implements Bar 

public class Foo extends BarImpl { 

    private String value1; 
    private String value2; 
    private List<Foo2> fooSubs; 

    public List<Foo2> getFooSubs() { 
    return fooSubs; 
    } 
} 

public class Foo2 extends BarImpl { 
    private String value3; 
    private String value4; 
    private List<Foo3> fooSubs; 

    public List<Foo3> getFooSubs() { 
    return fooSubs; 
    } 
} 

...etc... 

해당 데이터는 사실 익숙한 사람들을위한 X12 건강 관리 청구 데이터입니다. X12 파일을 구성하는 다양한 루프에 해당하는 루프 인터페이스를 정의했습니다.

내 문제는 - 하나의 트랜잭션을 설명 할 수 있어야합니다. 이론적으로는 동일한 객체 또는 해당 객체의 래퍼를 사용합니다. 특정 깊이의 경우 각 객체 목록의 크기는 1입니다.

처음에는 BarImpl 추상 클래스에 부울 값 singleTransaction을 추가했습니다. 그런 다음 각 클래스를 확장하면 addFoo 메소드가 객체가 단일 항목을 넘어서서 커지지 않았는지 확인합니다. FooSingle로 변환하기 전에 나는 또한 확인할 것입니다.

public void addFoo(Foo foo) throws FooException { 
    if (singleTransaction && fooSubs.size() >= 1) 
     throw new FooException(); 
    else 
     fooSubs.add(foo); 
} 

이미 채워진 List가 할당되지 않도록 setFoo 메소드도 제거해야합니다. 아마 그냥 마지막으로 ...

이 문제는 합리적인 방법으로 보입니까? 그런 다음 단일 경로가 계층 구조 아래에 있는지 확인하고 부울을 필터링 한 후 지정된 클래스에 대해 하나의 개체 당 목록 만 있다고 가정 할 수있는 SingleBarImpl 클래스를 가질 수있었습니다. 이렇게하면 더 이상 여러 목록 항목에 대해 걱정할 필요가 없으므로 계층 구조에 대한 액세스를 단순화 할 수 있습니다.

이 질문을하는 이유는 매우 추한 것입니다. 대안을 찾으려면 무엇을해야하는지 잘 모르겠습니다. 그래서 나는 숨어있는 것을 멈추고, 계정을 만들고, 거기에 던지기로 결정했습니다. 그래서 ... 어떤 아이디어? 훨씬 더 우아하게 만드는 디자인 패턴을 놓치고 있습니까?

답변

0

저는 X12 건강 관리 클레임 데이터에 익숙하지 않아 도메인을 제대로 모델링 할 수 없지만 GOF composite pattern을 사용하려는 것처럼 들립니다. "Leaf"구현 클래스가 "singleTransaction"플래그를 쉽게 대체 할 수 있습니다.

+0

실제로 현재 수행중인 작업과 거의 비슷합니다. 특정 노드에 매달려있는 노드 수/노드를 제한하는 효과적인 방법을 찾고있었습니다. 지금은 ArrayList를 서브 클래스 화하고 선택적 maxSize 값을 가져 와서 최종적으로 만들었습니다. 그래서 "단일 트랜잭션"을 만들면 최대 크기가 1 인 노드를 만들고 크기를 늘리려는 사람에 대해 걱정할 필요가 없습니다. 나는 여전히 추한 것 같지만 일하는 것 같다. 누군가가 더 좋은 아이디어를 가지고 있지 않으면. – Jafoy

관련 문제