ワークフローに適用されるSRP例:賢明な方法でクラスを構成する方法
質問
階級の責任について決定することに問題があります。
私は3つのHTML形式を持っています:
- 各フォームには、いくつかのテキストを含むHTMLテンプレートと、含まれるフォームのマーカーがあります
- エラーがある場合は、各フォームを検証する必要があります。テンプレートと(1)のフォームは、いくつかのエラーメッセージとともに再表示する必要があります。さまざまな形式で一般的なフィールドの一部のみがあります。
- エラーがない場合は、結果メッセージを郵送する必要があります。各フォームには、結果のメールテンプレートがあります。
この問題の良いクラススキームを決定するのは非常に難しいと思います。 1つの可能性は、機能によってクラスを分離することです
- CheckFormData:フォームデータを確認します
- displayform:エラーのある/なしでフォームを表示します(またはこれも分離しますか?)
- 電子メールフォーム:電子メールフォーム。
私はこれについて不確かです。特定の形式のフィールドに関する知識は、さまざまなクラスに分散しています。
いくつかのワークフローがあります。たぶん私もワークフロークラスを持っている必要があります:
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つがあります)私は必要です
CheckForm
,EmailForm
とDisplayForm
クラス。
3*3 = 9クラス + 3ベースクラス= 12クラス。
また、適切なCheckform-SubClassとEmailForm-SubClassをワークフローに注入する必要があります。それらはすべて同じフォームタイプである必要があります。たぶん、これのためにFormworkFlowFactoryを作成する必要があります。これはになります 13 クラス。
今、私は恐ろしく間違ったことをしていると感じました。もしわたしが持っていたら FormSubmitWorkFlow
テンプレートメソッドクラスとして、3つのサブクラスを作成することができましたが、各サブクラスは異なる責任を組み合わせます。
どうすればこれを改善できますか、そしてあなたの答えをやる気にさせることができますか?つまり、どの方法であなたの答えにつながりますか?
編集: :現在の答えは有用ですが、同意する人々からの投票を見るのはいいことです。または、コミュニティからより良い解決策を聞きたいです。この答えを支持したのは私だけです。この質問はより多くの入力を使用する可能性があるので、お気軽に提供してください:-)
解決
これがあなたの質問に答えるかどうかはわかりませんが、明らかにSRPの目標はあなたのコードを書くことです。あなたの車にSRPがあった場合と同様に、温度を調整し、窓を上下に置くクラスはありません。それは原則に違反します。この場合、あなたはそれを正しくやっているようです。はい、それはたくさんのクラスですが、代替案は多くの混乱です。フォームを検証する単一のクラスを作成できる方法がない限り(これは、必要な検証の種類に応じて実際に可能です)。
期待値のチェーンを追加してそれらが一致するかどうかを確認できる検証クラスを作成した場合、おそらく全体的なクラスが増えるでしょうが、結合がはるかに少ないと思います。私があなたを正しく理解しているかどうかを教えてください。