5

特定のパターンを念頭に置いてAPIを設計していますが、このパターンに名前があるかどうかはわかりません。GoF(Gang of Four)のコマンドパターンに似ていますが、正確ではありません。

私が見つけた簡単な例の1つは、EclipseでIProject、状態を変更するプロジェクトのメソッドを呼び出すのではなく、次の3ステップのプロセスでプロジェクト()を操作する場合です。

  1. その状態を記述子オブジェクト(IProjectDescription)に抽出します。getDescription
  2. 記述子にプロパティを設定します。例えばsetName
  3. 記述子を元のプロジェクトに適用し直すsetDescription

一般的な原則は、相互依存する可能性のある多くのプロパティを持つフレームワークの一部として複雑なオブジェクトを持ち、そのオブジェクトを一度に1つのプロパティで直接操作するのではなく、プロパティを単純なデータオブジェクトに抽出し、それを操作することです。 、そしてそれを適用し直します。

データオブジェクトがコマンドのようにすべての変更をカプセル化するという点で、コマンドパターンの属性の一部がありますが、実際にはコマンドではありません。オブジェクトに対して実行しないため、単なる表現です。オブジェクトの状態。

また、トランザクションAPIのいくつかの属性があり、set...呼び出しで1回のヒットですべての変更を行うことにより、いずれかのプロパティの変更が失敗した場合に変更全体を効果的に「ロールバック」できます。しかし、それはアプローチの利点ですが、それは実際にはその主な目的ではありません。さらに、APIにトランザクションメソッドを追加するだけで、このアプローチなしでトランザクションの性質を実現できます(commitandなどrollback

このパターンには、悪用したい2つの利点があります。ただし、上記の日食の例では悪用されていません。

  1. 実装が変更されている間、基になるオブジェクトの意味のある状態を表すことができます。これは、さまざまなタイプの表現から状態をアップグレードまたはコピーする場合に役立ちます。APIの新しいバージョンをリリースすると、古いFoo1のまったく新しい形式であるオブジェクトFoo2を作成しますが、どちらも基本的なプロパティは同じです。Foo1をFoo2にアップグレードするために、これらのプロパティをFooStateとして抽出できます。foo2.setFooState(foo1.getFooState)はそれと同じくらい簡単です。プロパティが解釈および表現される方法はFoosにカプセル化されており、まったく異なる場合があります。

  2. 単純なデータオブジェクトを使用して、基になるオブジェクトの状態を永続化して送信できます。オブジェクト自体の永続化ははるかに複雑になります。したがって、Fooの状態をFooStateとして抽出し、それを単純なXMLドキュメントとして永続化してから、後で「ロード」して適用することにより、新しいオブジェクトに適用できます。または、FooStateをJSONオブジェクトとしてWebサービスに送信することもできますが、Foo自体は大きすぎて複雑すぎて送信できません。(または、サービス呼び出しの両端のオブジェクトは、Foo1とFoo2のように完全に異なります)

とにかく、 Gang of Fourのデザインパターンでも、Martin Fowlerの包括的な「bliki」でも、このパターンの名前や例はどこにも見つかりません。

4

2 に答える 2

3

MartinFowlerが著書「PrinciplesofEnterpriseApplication Architecture 」で説明しているデータ転送オブジェクト(DTO)は、ポイント2で説明した目的のためのようです。

DTOは、それが表すより複雑なドメインモデルのかなり単純な抽出です。

Fowlerは、DTOをアセンブラーと組み合わせて使用​​することで、DTOを、それが表すことになっている実際のドメインオブジェクトから独立させることができると説明しています。アセンブラは、ドメインオブジェクトからDTOを作成する方法、およびその逆の方法を知っています。また、DTOは、その状態を永続化/送信するためにシリアル化可能である必要があると述べています。ポイント2で説明したことは、この説明と一致しているようです。

ポイント1で説明したことは、意図された目的ではないようですが、このパターンを使用して確実に達成できるようです。

彼の本のパターンカタログを読んだのか、それとも本自体を読んだのかはわかりません。本自体はこれをはるかに詳細に説明しています。

また、オラクルからの転送オブジェクト定義を確認することもできます。ファウラーは、ここで彼がDTOと表現していると述べています。

于 2013-02-01T01:04:13.097 に答える
2

すべてのデザインが単一のデザインパターンとして文書化されているわけではありません。実際、ほとんどのシステムデザインは複数のパターンの組み合わせです。

ただし、IProjectDescriptionで実行していることの一部はMementoを使用していますが、多形のバリエーションのようです。パターンカタログに表示されるパターンは、最終結果ではなく、重要な開始点に絞り込まれていると考えてください。パターンは、本質的に拡張および結合されることになっています。

コマンドパターンは、コミットとロールバック(実行/元に戻す)を提供し、そのようにMementoと組み合わせるのは非常に一般的なアプローチです。同じことが、HttpRequestとHttpResponseを使用するJavaサーブレットAPIでも見られます。

于 2013-01-25T14:08:50.610 に答える