2012-04-30 9 views
0

私はツリー構造のストレージで作業していますが、現在はトランザクションメソッドを使用してツリー構造を変更しています。私はいつもコマンドパターンの使用が適切だと思っていました。しかし、私はほんの少しの行動を変えて、私は(()属性を除いて挿入されたノードに配置されたトランザクションのインスタンスを返す)それが好き: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()moveToFirstChild() ...)の現在のトランザクションインスタンスの代わりにブール値を返すカーソルのようなメソッドがありますが、これは避けることはできません。私は少しより冗長ですが、まあ、それは「サポート」オープンでしょう

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パラメータは、トランザクションおよび/またはツリー構造とすることができ、私は必ずしもあなたがそれをしたいと思うかどうかはわかりません。 Builderを使用するアイデアは、基礎となる実装からCompositeトランザクションの構築を抽象化することです。このようにして、基礎となるコマンドを変更する必要がある場合は、それを実行して原子的にテストすることができます。

+0

「ビルダーを使用するという考えは、基礎となる実装から複合トランザクションの構築を抽象化することでしょうか?」木構造自体は巨大な複合オブジェクト( "ポインタ"を持つ)です。努力する価値があるかどうかはわかりません。私たちは内部的にこのメソッドを頻繁に使用していますので、コードを書き直す必要があります。しかし幸運にも私たちには今のところ外部ユーザーがいません;-)だから私は事実上何かを変えることができ、きれいでいいAPI​​を提供したいと思います。 – Johannes

+0

ところで:通常は、XML文書などから何らかのインポートを行い、Java APIやXQuery Updateなどで多少の変更を加えます。 – Johannes

+0

@Johannes - コンポジットは一般的にビルダーを使用して構築されます。したがって、ツリー構造がドキュメントまたは単一のデータソースではなく複合オブジェクトとして表示される限り、考慮する価値があります。アイデアは、あなたが適切な創造が保証されるように監督に建設を抽象化することです。 – Joe

関連する問題