繰り返しコードを整理する方法は?


11

私のチームは、1回限りのWebフォームをたくさん作成しています。これらのフォームのほとんどは、単に電子メールを送信するだけであり、いくつかは単純なデータベース書き込みを行います。

現在、各フォームはVisual Studio Team Foundation Serverの独自の個別のソリューションに存在しています。つまり、約100の異なるフォームプロジェクトがあるため、一貫性を維持することが難しくなります。各フォームはフィールドが異なるという点でユニークですが、それらはすべてほぼ同じことを行います。

私はこれらを何らかの形で凝縮したいと考えており、実際にいくつかのガイダンスを使用することができます。

  • すべてのフォームプロジェクトを含む1つのソリューションファイルを作成する必要がありますか?配管コードはそれほど多くありませんが、電子メールのフォーマットなどを支援するヘルパークラスをいくつか作成できます。プロジェクト間でCSS、JavaScript、コントロール、画像を共有できると非常に便利です。
  • 私たちがマイクロソフトのショップであることを考えると、この特定のシナリオでMVCのようなものをWebformsに移行することで具体的なメリットはありますか?私は全体としてMVCの概念で販売されていますが、そのフォームがすべて電子メールを送信する場合、15フィールドのデータ収集フォームをより効率的にまとめるのに役立ちますか?これについて考えさせられたフォームには、ユーザーの応答に基づいてフィールドを表示および非表示にするためのロジックが組み込まれており、MVCとjQueryを使用するのは効率的ではなかったようです。

2
ここでメタから移行されたものは何ですか?SOである必要があります。
ジョシュK

1
@Josh Stack Overflowは、コードの特定の問題に直接関連する質問用です。ここでは、プログラムとワークフローの設計がテーマになっています。

@Mark:理想的な「ベストプラクティス」ソリューションが簡単に得られるため、これはあまり主観的ではありません。私はMSの男ではないので、合併症が何であるかわかりませんが、これは主観的でない方法で最もよく答えられると推測するのは危険です。
ジョシュK

同意した。これはSOでクローズされます。
ウォルター

1
これは、すでにSOに頼まれました、ここで
ChrisF

回答:


3

テストなしで安全にリファクタリングすることは難しく、危険を伴います。

私が始めるだろう:

  • これらのフォームへのさまざまなタイプの入力と予想される出力をカバーするテストケースを作成します。これらのフォームのほとんどは機能が同じか、それに近いと感じるので、これは実際にはそれほど長くはかからないようです。

  • これらのテストケースを100個程度のフォームに対して実行します(コードカバレッジをオンに切り替えて、コードパスウェイをトレースします)。

その後、安全にリファクタリングできるものを確認することができます(例)。

  • コード重複検出ツールを実行します(.NETで何と呼ばれているか、JavaではCPDがあります)。13個の同一のフォームをすぐに削除します。テストを再実行します-イェーイ!これらはすべて、フォーム11を除き、OKなので、まだ削除できません。

  • すべてのローカルメールフォーマットコードを削除し、すべてのフォームで共通のメール処理モジュールを呼び出すようにします。テストを実行しますが、1つを除いてすべて合格します。hhmmmOK...。UTF-8文字、汎用モジュールで修正し、再度テストを実行します。

すすぎ、繰り返します。


2
+1 リファクタリングへのアプローチのヒントについては、Michael Feathersがレガシーコードで効果的に機能するamazon.com/dp/0131177052を参照してください。
マイケルブラウン

おっと良い参考-私はその本が好きです。
マルタインVerburg

0

提出部分を抽象化することをお勧めします。モデル/ビュー/コントローラーを使用して、フォームをビューに配置し、同じコントローラーを使用するようにします。このコントローラーは、デフォルトのアドレスにメールを送信するなどの一般的なアクションを実行するか、フォームデータを可能なコントローラーに転送します。そうすれば、新しいフォームを作成するために必要なことは、フォームを作成し、そのコントローラーに出力を送信することだけです。このアーキテクチャを単一のプロジェクトに含めることで、CSSとJavaScriptを共有できます。

メールのフォーマットを処理するために、一般的なフォーマッターを作成することから始めます。たとえば、フォーム要素の名前と値をリストするだけでなく、送信時間などのその他のmetdataタイプstufも作成します。 。次に、それ以上のカスタム処理が本当に必要な場合は、ファクトリを追加します。ファクトリはフォーマッタインターフェイスを返します。次に、ファクトリー内で、その特定のフォームのフォーマッターを検索するか、特定のフォームが存在しない場合は汎用のフォームを返します。この設計により、テスト用のモックフォーマッタを簡単に提供できるため、cntrollerのユニットテストが容易になります。

ちなみに、私はフォームからの引数としてメールアドレスを入れません。複数のアドレスに送信する必要がある場合は、すべてのフォームと送信先の電子メールを含むルックアップテーブルを用意することをお勧めします。これはXMLまたはコードで実装できます(両方を見てきましたが、どちらが良いかはわかりません)。これにより、スパマーがフォームページからメールアドレスを取得するのを防ぐことができます。


返信いただきありがとうございます。このアーキテクチャでは、送信される電子メールのフォーマットをどこで処理しますか?これを抽象化したいと思いますが、文字列ビルダーを作成し、静的テキストのブロックにフィールドをドロップすることなくフォーマットを行う方法を考えることはできません。これは各フォームに固有のようです。
ジョシュアール

また、別のドロップダウンでの選択に基づいてドロップダウンを作成するなどのフォームロジックの処理に関する推奨事項はありますか?MVCルートを使用した場合、jQueryが唯一のオプションですか?
ジョシュアール

@JoshEarl:私はフォーマッターのアイデアを編集しましたが、jQueryなどに関する提案はできません。複雑すぎる場合は、ページごとに1つのコントローラーを使用して、完全なMVCデザインを使用する必要があります。@Martijnが言ったように、ユニットテストは、要件が何であるかを正確に確認するのに役立ちます。私の設計では、フォーム間のかなりの類似性を想定しています。
マイケルK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.