2010-06-02 2 views
3

공간 데이터 구조를 작성 중이며 최상의 NODE 구현이 무엇인지 의심 스럽습니다. 내 디자인에 따르면 나는 추상 노드 엔티티와 그것을 상속하는 세 가지 클래스를 가지고있다 : EMPTYNODE, FULLNODE, INTERNALNODE.개념 상속 구현

첫 번째 데이터에는 특별한 데이터가 없습니다.

두 번째 요소에는 일반 요소에 대한 참조가 1 개 있습니다.

세 번째 노드에는 다른 노드에 대한 참조가 두 개 있습니다.

나는 (내가 이미 코딩 한)이 상황을 구현하는 몇 가지 방법을 찾았지만 무엇이 최선인지 결정할 수는 없다.

private static class Node { 
    private Elem elem = null; 
    private Node left = null, right = null; 
    public Elem getElem() { 
     assert isFull(); 
     return elem; 
    } 

    public boolean isEmpty() { 
     return elem == null && left == null; 
    } 

    public boolean isFull() { 
     return elem != null; 
    } 


    public boolean isInternal() { 
     return elem == null && left != null; 
    } 
} 

두 번째 솔루션은 클래스 곳에 모든 클래스 제공하여 명시 적 분열을 작성하는 것입니다 : 내가 찾은

첫 번째 솔루션은 잠재적으로 이러한 방법으로 모든 작업을 수행하는 하나의 클래스 노드를 사용하는 것입니다 그것의 방법 만. 분명히 이런 식으로 우리는 노드 객체에 대해 여러 캐스트를 수행해야 할 의무가 있습니다.

private static abstract class Node { 

    public abstract boolean isEmpty(); 

    public abstract boolean isFull(); 

    public abstract boolean isInternal(); 

} 


private static class FullNode extends Node{ 

    private ITriangle elem; 

    @Override 
    public boolean isEmpty() { 
     return false; 
    } 

    @Override 
    public final boolean isFull() { 
     return true; 
    } 

    @Override 
    public final boolean isInternal() { 
     return false; 
    } 

    public Elem getElem() { 
     return elem; 
    } 
} 

세 번째 솔루션은 모든 클래스가 모든 방법을 제공 할 수 있도록 상속을 사용하는 것입니다,하지만 개체 유형해야한다 "IsEmpty 함수()"와 유사한 방법으로 수표. 잘못된 호출의 경우 우리는 예외를 throw합니다.

private static abstract class Node { 

    public abstract boolean isEmpty(); 

    public abstract boolean isFull(); 

    public abstract boolean isInternal(); 

    public abstract Elem getElem(); 

} 


private static class Empty extends Node{ 

    @Override 
    public boolean isEmpty() { 
     return true; 
    } 

    @Override 
    public final boolean isFull() { 
     return false; 
    } 

    @Override 
    public final boolean isInternal() { 
     return false; 
    } 

    @Override 
    public Elem getElem() { 
     throw new AssertionError(); 
    } 
} 

이러한 세 가지 해결책에 대해 어떻게 생각하십니까?

어느 것을 사용 하시겠습니까?

어떤 아이디어라도 감사하겠습니다.

답변

1

대답은 노드 사용 방법에 따라 달라집니다. 일단 노드가 만들어지면 빈에서 내부로 전체를 변경해야합니까, 아니면 불변입니까? 당신은 당신이 변경 가능한 노드를 원한다면 내가 옵션 1

로 가고 싶어 다음 변경 내부 상태를 예상하는 경우 다음 내가 옵션 3 가고 싶어 노드가 불변 인 경우 주어진 옵션에서

어디에서 동작이 바뀌는 지 Node 클래스를 사용하여 상태를 유지하는 열거 형을 사용하여 데이터를 보관하면 Node는 구현을위한 적절한 열거에 위임하게됩니다. 예를 들면 다음과 같습니다.

public class Node { 

    private enum NodeState { 
     /* each state overrides specific methods to implement custom behaviour */ 
     FULL { public boolean isFull() { return true; } }, 
     INTERNAL { public boolean isInternal() { return true; } }, 
     EMPTY { public boolean isEmpty() { return true; } }; 

     /* the default behaviour */ 
     public boolean isFull() { return false; } 
     public boolean isEmpty() { return false; } 
     public boolean isInternal() { return false; } 
    } 

    private NodeState state = NodeState.EMPTY; 
    private Elem  elem = null; 
    private Node  left = null, right = null; 

    public Elem getElem() { 
     assert isFull(); 
     return elem; 
    } 

    /* TODO: constructors/mutators implement state changes go here */ 

    public boolean isEmpty() { 
     return state.isEmpty(); 
    } 

    public boolean isFull() { 
     return state.isFull(); 
    } 

    public boolean isInternal() { 
     return state.isInternal(); 
    } 
} 

class Elem { 
    /* implementation of this class */ 
} 
+0

내 경우에는 변경해야하며 실제로 옵션 1은 세 가지 중에서 가장 효율적입니다 (시간과 공간 모두에서). 도움 주셔서 감사합니다. – TheSENDER

+0

저는 이론적 인 관점에서이 문제에 대해 생각하고 있습니다. 상태 패턴 사용은 어떻게됩니까? – TheSENDER

+0

네, 그게 내가 바꿀 수있는 노드에 대한 제 의견에서 표현하려고했던 것입니다. enum을 사용하여 상태 패턴을 구현하는 예제를 추가했습니다. 허용 할 변경 내용을 잘 모르는 상태에서 값을 변경하고 상태를 변경하는 비트가 없습니다. – BenM