1

クラスの責任を決めるのに問題があります。
私は3つのhtmlフォームを持っています:

  1. フォームごとに、含まれるフォームのテキストとマーカーを含むhtmlテンプレートがあります。
  2. エラーが発生した場合は、各フォームを検証する必要があります。テンプレートと(1)のフォームを、いくつかのエラーメッセージとともに再表示する必要があります。一部のフィールドのみが、さまざまなフォームに共通しています。
  3. エラーがない場合は、結果メッセージをメールで送信する必要があります。フォームごとに結果メールテンプレートがあります。

この問題に適したクラススキームを決定するのは非常に難しいと思います。1つの可能性は、機能によってクラスを分離することです

  • CheckFormData:フォームデータのチェック
  • DisplayForm:エラーの有無にかかわらずフォームを表示します(またはこれも分離しますか?)
  • EmailForm:emailform。

これについてはよくわかりません。ある特定の形式の分野に関する知識は、さまざまなクラスに分散しています。

いくつかのワークフローがあります。多分私はワークフロークラスも持っているべきです:

class FormSubmitWorkFlow
{
   function start() 
   {
     $this->displayForm->render();
   }

   function processFormData($data)
   {
      $this->checkForm->setData($data);
      if (!$this->checkForm->isValid())    {

         $errors = $this->checkForm->getErrors();
         $this->displayForm->setData($data)->setErrors($errors)->render();
      } else {
         $this->emailForm->setData($data)->email();
      }
   }

   function setDisplayForm(DisplayForm $df)
   {
      $this->displayForm = $df;
   }

   function setCheckForm(CheckForm $cf)
   {
      $this->checkForm = $cf;
   }

   function setEmailForm(CheckForm $ef)
   {
      $this->emailForm = $ef;
   }
}

フォームタイプごとに(3つあることを忘れないでください)、

  1. CheckForm
  2. EmailForm
  3. DisplayFormクラス。

3 * 3=9クラス+3基本クラス=12クラス。
また、適切なCheckForm-subclassとEmailForm-subclassをワークフローに挿入する必要があります。これらはすべて、同じフォームタイプである必要があります。たぶん、このためにFormWorkFlowFactoryを作成する必要があります。これにより、最大13のクラスが追加されます。

今、私はひどく間違ったことをしていると感じました。テンプレートメソッドクラスとして持っていた場合FormSubmitWorkFlow、3つのサブクラスを作成することもできますが、各サブクラスは異なる責任を混合します。

これをどのように改善できますか。また、答えをやる気にさせることができますか。つまり、どの方法で答えを導き出すことができますか。


編集:現在の唯一の答えは有用ですが、それに同意する人々からの投票を見るのはいいことです。あるいは、コミュニティからより良い解決策を聞きたいです。この答えに賛成したのは私だけです。この質問はより多くの入力を使用する可能性があるので、遠慮なく提供してください:-)

4

1 に答える 1

1

これがあなたの質問に答えるかどうかはわかりませんが、明らかに SRP の目標は、何かを変更する必要がある場合に、それが 1 つの理由だけで済むようにコードを作成することです。あなたの車にSRPがあれば、温度を調整し、窓を上げ下げするクラスはありません. それは原則に反します。この場合、あなたはそれを正しくやっているようです。はい、それは多くのクラスですが、代替手段は多くの混乱です。フォームを検証する単一のクラスを作成できる方法がない限り (必要な検証の種類によっては、実際に可能になるはずです)。

一連の期待値を追加してそれらが一致するかどうかを確認できる検証クラスを作成した場合、おそらく全体的なクラスが増えるでしょうが、結合ははるかに少なくなると思います。私があなたを正しく理解したかどうか教えてください。

于 2009-11-25T07:50:43.020 に答える