2016-12-16 3 views
0

スパゲッティのコードを想像してみてください。タスクは1から2、3から3などになるはずです。タスクが中断した場合は、プログラムを中止してください。私は手続き的な方法でこれを書くことができますが、このためのデザインパターンがあるかどうかを知りたいと思います。滝の処理を扱うデザインパターン

私はChain of Responsibilityを見ましたが、適合しません。私はすでにどのプロセスが各タスクを処理すべきかを知っています。マスター/ワーカーは、ステップごとに処理する必要があるため、いずれにも適合しません。

具体的な問題はユーザーがExcelファイルをアップロードし、ファイルをデータベースのテーブル構造と比較してデータベースを更新できるようにすることです。

手順は、次のようになります。

  1. ファイルをアップロード - そのファイルがアップロードされていることを確認し、そうでない場合、戻ります。
  2. ファイルがExcelファイルであることを確認します(存在しない場合)。
  3. ファイルがエラーの場合は、データテーブルに読み込まれます。
  4. データベースからdatatabeを取得します(エラーの場合)。
  5. 各データテーブルをそれぞれの2次元配列にロードします(エラーの場合は戻る)。
  6. エラーが発生した場合は、各配列の列数が同じかどうかを比較して戻ります。 などetc ...

これにデザインパターンを使用する方法はありますか?ありがとう。

+3

誰がデザインパターンを必要としますか?彼らについては何も神聖ではありません。要件を満たすために問題をコード化します。それは、それぞれが例外をスローして抜け出すことができる一連の変換のように思えます。私には明らかなラムダのような気がする。 – duffymo

+0

単純な 'goto'は修正されません。 – MickyD

+0

私にとって、JavaやC#などのオブジェクト指向言語は、データ処理には適していません。注:あなたの特定の問題に対する答えではなく、単なる注釈です。 –

答えて

0

そこ

bool DoTheWork(file) 
{ 
    if (!IsUploaded(file)) 
    return false; 
    if (!IsExcel(file)) 
    return false; 
    if (!WriteToDataTable(file)) 
    return false; 
    .... etc 
    return true; 
} 

この種の状況に対処するためのデザインパターンです。かなりよく知られています:Pipeline、またはMSDNはPipes and Filters Patternと呼んでいます。それは有名なGang of Four design patternsの一部ではなく、アーキテクチャパターンでもあることに注意してください。小さな独立した段階(またはフィルタ)を介して大量のデータ処理を行う場合にはほとんど使用されている

:このパターンは、アルゴリズムのために使用される

は、データは、タスクまたは段階の 配列流れます。場合

はPipelineProcessingパターンを使用する: 問題は、入力のシーケンスに、別個の段階にダウン を破壊することができるそれぞれが計算のシーケンスを、実行 から成るように、各 入力の計算順番に行う必要がありますが、 は、異なる入力の異なるステージの重複計算を という動機セクションの図に示すように可能です。

MSDN:

使用このパターン:

  • アプリケーションが必要とする処理を容易に別個、独立のステップのセットに分解することができます。
  • アプリケーションによって実行される処理ステップには、異なるスケーラビリティ要件があります。あなたは小さな独立した(したがって、より管理しやすい)の手順を通して、あなたのプロセスを実行することができ、このパターンを使用することにより

enter image description here

enter image description here

、多分そのうちのいくつかを並列化するため、より良いパフォーマンスに到達し、各ステップ(フィルタ)の実装が異なり、各ステップの失敗戦略や検証のようなものを使用して簡単にカスタマイズできます。

0

デザインパターンはうまく機能するパターンですが、必ずしも直感的に開発されているわけではありません。私が思うこの問題は、直感的な開発にあります。ここで

は擬似コードで

...私はそれを攻撃する方法です多分ネストされた関数すなわちの中でいくつかの点でキャッチいくつかのエラー...

bool WriteToDataTable(file) 
{ 
    try 
    { 
    // Details to write to your database 
    } 
    catch (e) 
    { 
    errorLogging(e); 
    return false; 
    } 
    return true; 
} 
+0

ありがとう、私は手続き的にそれを行う方法を知っています。私は起動するOOPパターンがあると思った。 –

関連する問題