特定のパターンを念頭に置いてAPIを設計していますが、このパターンに名前があるかどうかはわかりません。GoF(Gang of Four)のコマンドパターンに似ていますが、正確ではありません。
私が見つけた簡単な例の1つは、EclipseでIProject
、状態を変更するプロジェクトのメソッドを呼び出すのではなく、次の3ステップのプロセスでプロジェクト()を操作する場合です。
- その状態を記述子オブジェクト(
IProjectDescription
)に抽出します。getDescription
- 記述子にプロパティを設定します。例えば
setName
- 記述子を元のプロジェクトに適用し直す
setDescription
一般的な原則は、相互依存する可能性のある多くのプロパティを持つフレームワークの一部として複雑なオブジェクトを持ち、そのオブジェクトを一度に1つのプロパティで直接操作するのではなく、プロパティを単純なデータオブジェクトに抽出し、それを操作することです。 、そしてそれを適用し直します。
データオブジェクトがコマンドのようにすべての変更をカプセル化するという点で、コマンドパターンの属性の一部がありますが、実際にはコマンドではありません。オブジェクトに対して実行しないため、単なる表現です。オブジェクトの状態。
また、トランザクションAPIのいくつかの属性があり、set...
呼び出しで1回のヒットですべての変更を行うことにより、いずれかのプロパティの変更が失敗した場合に変更全体を効果的に「ロールバック」できます。しかし、それはアプローチの利点ですが、それは実際にはその主な目的ではありません。さらに、APIにトランザクションメソッドを追加するだけで、このアプローチなしでトランザクションの性質を実現できます(commit
andなどrollback
)
このパターンには、悪用したい2つの利点があります。ただし、上記の日食の例では悪用されていません。
実装が変更されている間、基になるオブジェクトの意味のある状態を表すことができます。これは、さまざまなタイプの表現から状態をアップグレードまたはコピーする場合に役立ちます。APIの新しいバージョンをリリースすると、古いFoo1のまったく新しい形式であるオブジェクトFoo2を作成しますが、どちらも基本的なプロパティは同じです。Foo1をFoo2にアップグレードするために、これらのプロパティをFooStateとして抽出できます。foo2.setFooState(foo1.getFooState)はそれと同じくらい簡単です。プロパティが解釈および表現される方法はFoosにカプセル化されており、まったく異なる場合があります。
単純なデータオブジェクトを使用して、基になるオブジェクトの状態を永続化して送信できます。オブジェクト自体の永続化ははるかに複雑になります。したがって、Fooの状態をFooStateとして抽出し、それを単純なXMLドキュメントとして永続化してから、後で「ロード」して適用することにより、新しいオブジェクトに適用できます。または、FooStateをJSONオブジェクトとしてWebサービスに送信することもできますが、Foo自体は大きすぎて複雑すぎて送信できません。(または、サービス呼び出しの両端のオブジェクトは、Foo1とFoo2のように完全に異なります)
とにかく、 Gang of Fourのデザインパターンでも、Martin Fowlerの包括的な「bliki」でも、このパターンの名前や例はどこにも見つかりません。