0

Robert Rossney の「維持しなければならなかった最も不健全なプログラムは何ですか?」というエントリを読んでいました。(あなたが維持しなければならなかった最も不健全なプログラムは何ですか? )で見つけました。
このアプリは、着信 POST 要求を取得する HTTPListener オブジェクトで構成されています。ヘッダーの情報に基づいて、要求の本文を SQL Server に渡し、適切なトランザクションを実行します。
リクエストは次のようになります。

<InvoiceCreate Control="389>
  <Invoice>
    <CustomerNumber>5555</CustomerNumber>
    <Total>300.00</Total>
    <RushOrder>1</RushOrder>
  </Invoice>
</InvoiceCreate>

HTTPListener オブジェクトによって受信されたら、ストアド プロシージャを介して SQL Server の組み込み XML 処理機能を使用して、Invoice テーブルに対して必要な INSERT を実行します。

  INSERT INTO Invoice (InvoiceNumber, CustomerNumber, Total, RushOrder)
  SELECT @NEW_INVOICE_NUMBER,  
         @XML.value('(InvoiceCreate/Invoice/CustomerNumber)[1]', 'varchar(10)'),
         @XML.value('(InvoiceCreate/Invoice/Total)[1]', 'varchar(10)'),
         @XML.value('(InvoiceCreate/Invoice/Total)[1]', 'varchar(10)')  

次に、同じストアド プロシージャで別の SELECT ステートメントを使用して、Invoices テーブルに挿入された新しい請求書番号の値を返します。

SELECT @NEW_INVOICE_NUMBER FOR XML PATH 'InvoiceCreateAck'  

次に、生成された XML を C# の SQL データ リーダー オブジェクトを使用して読み取り、それを HTTPListener オブジェクトの応答として使用します。

私の問題は、Robert が確かに正しいことに気付いていることです。アプリケーション ロジックはすべてストアド プロシージャ内に存在するため、ストアド プロシージャ内で多くのエラー チェック (つまり、顧客番号と送り状番号の値の検証) を行う必要があります。

私はまだ中級レベルの開発者なので、改善を目指しています。元の投稿と私の現在のアーキテクチャを考えると、アプリケーションを改善するために別の方法で何ができたでしょうか? 参照できるパターンやベスト プラクティスはありますか? どのようなアプローチをとったでしょうか?世界中の「不健全なプログラミング」の量を減らすために自分の役割を果たしたいので、私はどんな批判にもオープンです。

4

1 に答える 1

0

特定のパターンについてはわかりませんが、レイヤーを定義してそれに固執する必要があります。ここではレイヤーを非常に大まかに使用しています。XML を解析する必要があるレイヤーが 1 つあります。HTTP リクエストを読み取るレイヤーが 1 つあります。データ アクセスを行う 1 つのレイヤーがあります。C# を使用している場合、これらはおそらく 3 つの別個のクラスです。

私はストアドプロシージャでそれをしません。私の経験からすると、データベースを変更すると、このようなことを行うと、ほぼ完全に書き直すことになります。テストも本当に難しいです。

データ アクセスには、引き続きストアド プロシージャを使用できます。個人的には、C# を使用して単純な挿入ステートメントを作成するだけです。ビジネスロジックをストアドプロシージャから除外するように努めます。後で移植するのがはるかに簡単になるため、ビジネス ロジックを保持し、C# で解析します。

幸運を!

于 2012-07-05T03:41:00.293 に答える