0

短縮版:

複数のオブジェクトにまたがる複雑な操作の結果をどのように収集しますか?

長いバージョン:

あるシステムから別のシステムに顧客の注文をプッシュするデータ交換システムを開発しています。これは API を介して行われますが、残念ながら、注文が正常に転送されたと報告される前に、12 の個別のステップを順番に正常に完了する必要があります。

各ステップはコードの個々の単位に分割できますが、分割することもできますが、各ステップは順番に完了する必要があり、一部のステップは前のステップの結果に依存します。

この特定の問題に適した適切な設計パターンまたはパターンの組み合わせはありますか? 各ステップが前のステップに依存している場合、前のステップの結果を認識させる最善の方法は何ですか。

コンポジット/マクロ コマンドの設計、または OrderPush プロセスを有限ステート マシンとしてモデル化することを考えていましたが、よりシンプルに保ちたいと考えていました。

これはシステム設計に関する質問なので、API とは何か、またはどのように機能するかについて詳しく説明する必要はありません。正しい方向に向けられることを期待しているだけです。

このプロセスは、ローカル システムから関連データを読み取り、XMLRPC を介してリモート システムにプッシュすることです。

手順は次のとおりです。

  • 顧客の作成
  • 注文の作成 (ヘッダー レコード)
  • 注文明細の作成
  • 注文の確認 (これにより請求書が作成されます)
  • 請求書を探す
  • 請求書の確認
  • 支払いの作成
  • ジャーナル アイテムの検索 (ジャーナル アイテムは請求書に関連付けられているため、支払明細行を請求書に関連付けることができます)
  • 支払ラインの作成
  • お支払いの確認

各ステップは、成功または失敗する単一の XMLRPC 呼び出しです。そして、これがその核心です。顧客の作成に失敗した場合、他の手順はどれも機能しません。同様に、注文の作成に失敗した場合、他のステップが失敗するか、または結合できなくなります (つまり、前のステップが失敗した場合は、明らかに実行を停止する必要があります)。

それで、誰かが何かヒントを得ましたか?

4

3 に答える 3

1

あなたが実際に説明したことは、何かを成し遂げるためのアルゴリズムです。これらのステップの順序が非常に重要であるが、実装が異なる場合がある場合は、ステップが静的である (つまり、順序が同じである必要がある)テンプレート メソッドになる可能性がありますが、実装は異なる場合があります。

コマンド パターンコンポジットを見て、process() などの 1 つのステップとして実行できる個別のステップのツリーを構成する必要があります。また、フローの途中で失敗した場合に重要な元に戻すコマンドを確認することもできます。

于 2013-07-29T09:51:00.633 に答える
1

興味のある人のために、私はついに自分のニーズに合ったデザインパターンに出くわしました.

私の質問は、次のように簡単に要約できます。

複数のオブジェクトにまたがる複雑な操作の結果をどのように収集しますか?

(私は今質問を編集しました)

その答えは、Collecting Parameter Design Pattern でした。 http://source Making.com/implementation-patterns/collecting-parameter

それほど複雑な概念ではありませんが、PHP の世界にはそれほど多くの例はありません。本当に常識ですが、それがすべてのデザインパターンであると思います。

私がそれを解決した方法は、単一の操作を抽象化する Command Pattern を使用してそれぞれの個別の操作を実装し、共通のインターフェイス (つまり、「process()」または「run()」メソッド) を使用して呼び出すことができるようにすることでした。

独自の process() メソッドで呼び出すことができる操作が 12 個あるので、それらを順番にトリガーし、各操作の結果を記録するだけの一般的なオブジェクト (わかりやすくするために CollectingParameter と呼びます) を渡します (したがって、 CollectingParameter オブジェクトは、各 process() メソッドによって返される必要があります)。CollectingParameter オブジェクトは次の操作に渡され、前の操作で必要なすべての結果にアクセスできます。

$operationList = array(new CreateCustomer, new CreateOrder, new CreateOrderLines ... etc)
$collectingParameter = new CollectingParameter;
foreach($operationList as $operation) {
    $collectingParameter = $operation->process($collectingParameter);
}

エラーはログに記録され、さまざまなプロセス メソッド内で処理されます。これにより、process() メソッドは操作の結果ではなく、CollectingParameter オブジェクトを自由に返すことができます。

于 2013-07-29T09:31:27.767 に答える
0

これをどのように行うかは、失敗した時点で停止する必要があるかどうか、または一部が失敗した場合にロット全体をキャンセルするかどうかによって異なります.

前者の場合は簡単です。各ステップでテストを行い、失敗した場合はエラー レポートを生成します。

後者は少し難しく、使用しているデータベースに依存します。INNODB モードの Mysql では、一連のトランザクションを開始する前に auto_commit をオフにし、成功した場合は最後にコミットするか、失敗した場合はトランザクションをロールバックして、トランザクションを使用できます。

使用したいデータベースとアクセスについてもう少し情報を提供すると、より多くのヘルプが得られる場合があります。私は自分のコードに mysqli と mysql を使用しています。これは、複数のデータベース テーブルにまたがる情報を持つユーザーを作成するときに便利です。

于 2013-07-18T10:23:29.357 に答える