0

私はツリー構造のストレージに取り組んでおり、現在トランザクション メソッドを使用してツリー構造を変更しています。コマンドパターンを使用するのが適切だといつも思っていました。ただし、小さな動作を変更しただけで気に入っています (挿入されたノードにあるトランザクション インスタンスを返す (属性を除く)):

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()...) のようなカーソルを提供しますが、これは避けられないと思います。それ以外の場合は、面倒な作業なしで移動することさえできます

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

しかし、私はコマンドパターンについて考えました

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

これはもう少し冗長ですが、オープン/クローズの原則を「サポート」するので、非常に便利です。

それで、あなたはどう思いますか?

4

1 に答える 1

1

ツリー構造は、巨大な複合オブジェクトのように説明できるように思えます。トランザクションの構築も扱っているので、Command パターンを使用するのが適切だと思いますが、可能であれば、コマンド パターンとビルダー パターンを一緒にマッシュするように、execute() 呼び出しを何らかのディレクターでラップすることを検討する必要があります。 .

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

void リターンはツリー構造である可能性があり、wtx パラメータはトランザクションおよび/またはツリー構造である可能性があることに注意してください。どのように実行したいかは必ずしもわかりません。Builder を使用するという考えは、基になる実装から Composite トランザクションの構築を抽象化することです。そうすれば、基になるコマンドを変更する必要がある場合に、変更を行い、アトミックにテストできるはずです。

于 2012-04-30T12:18:34.043 に答える