2012-04-30 4 views
0

저는 트리 구조의 저장소에서 작업하고 있으며 현재 트랜잭션 구조를 사용하여 트리 구조를 수정하고 있습니다. 나는 항상 Command Pattern을 사용하는 것이 적절하다고 생각했다. 그러나 난 그냥 작은 동작을 변경하고 난 (() 속성을 제외하고 삽입 된 노드에있는 트랜잭션 인스턴스를 반환)을 좋아한다 :API 디자인/명령 패턴 대 "일반 구현"

wtx.insertText(EInsert.ASRIGHTSIBLING, "value").insertElement(EInsert.ASRIGHTSIBLING, new QName("bla").insertElement(EInsert.ASFIRSTCHILD, new QName("blubb")).insertAttribute(new QName("foo"), "bar").insertAttribute(new QName("bar"), "foo")); 

을 나는이 방법은 아주 좋은 작업을 체인 생각하지만, 우리의 트랜잭션을 제공 현재 트랜잭션 인스턴스 대신 부울 값을 반환하는 트리 (moveTo(long), moveToParent(),......)의 메서드와 같은 커서가 있지만이 방법을 피할 수는 없다고 생각합니다. 내가 조금 더 장황

new InsertText(EInsert.ASRIGHTSIBLING, "value").execute(wtx); 
new InsertElement(EInsert.ASRIGHTSIBLING, new QName("bla")).execute(wtx); 
... 

만 아니라, 그것은 것 "지원"오픈 될 것이라고 명령 패턴에 대해 생각하지만 그렇지 않으면 우리는 성가신

wtx.method();wtx.method();wtx.method(); 

없이 간 이동을 할도 수/정말 좋은 폐쇄 원칙.

그래서 어떻게 생각하십니까?

답변

1

나에게 나무 구조는 마치 거대한 합성물처럼 묘사 될 수 있다고 들린다. 또한 트랜잭션을 작성하기 때문에 Command 패턴을 사용하는 것이 적절할 것이라고 생각하지만 가능하다면 명령 및 빌더 패턴을 함께 뭉개 버릴 수 있도록 가능한 한 일종의 디렉터에서 execute() 호출을 래핑하는 것을 고려해야합니다 . 당신이 그것을하고 싶은 얼마나 반드시 확실하지 않다,

public void directorMethod(Object wtx) { 
    InsertText(EInsert.ASRIGHTSIBLING, "value").execute(wtx); 
    InsertText(EInsert.ASRIGHTSIBLING, "blah").execute(wtx); 
} 

주, 무효 리턴은 트리 구조가 될 수 있고 WTX 매개 변수는 거래 및/또는 트리 구조가 될 수 있습니다. 빌더를 사용하는 아이디어는 기본 구현에서 Composite 트랜잭션을 추상화하는 것입니다. 기본 명령을 변경해야한다면 그렇게 할 수 있어야하며 원자 적으로 테스트 할 수 있어야합니다.

+0

"빌더 사용의 아이디어는 기본 구현에서 복합 트랜잭션 빌드를 추상화하는 것입니다." 트리 구조 자체는 거대한 복합 객체입니다 ("포인터"포함). 노력할만한 가치가 있는지 확신 할 수 없습니다. 우리는 내부적으로 메소드를 자주 사용했기 때문에 많은 코드를 다시 작성해야합니다. 그러나 운좋게도 우리는 지금 현재 외부 사용자가 없습니다 ;-) 그래서 나는 거의 모든 것을 바꿀 수 있고 깨끗한 멋진 API를 제공하고자합니다. – Johannes

+0

BTW : 일반적으로 XML 문서에서 가져온 일종의 가져 오기를 사용하고 Java API 또는 어쩌면 XQuery 업데이트 등으로 일부 변경을 수행 할 수 있습니다. – Johannes

+0

@Johannes - 복합체는 일반적으로 빌더를 사용하여 작성됩니다. 따라서 트리 구조가 문서 또는 단일 데이터 소스가 아닌 복합 객체로 간주되는 한 고려해 볼 가치가 있습니다. 아이디어는 적절한 구성을 보장 할 수 있도록 감독관에게 구성을 추상화하는 것입니다. – Joe