1

我在决定班级责任时遇到了问题。
我有 3 个 html 表单:

  1. 对于每个表单,都有一个 html 模板,其中包含一些文本和要包含的表单的标记
  2. 每个表单都需要验证,如果有错误,则需要重新显示 (1) 中的模板和表单,以及一些错误消息。只有一些字段在不同的表单中是通用的。
  3. 如果没有错误,则需要邮寄结果消息。每个表单都有一个结果邮件模板。

我发现很难为这个问题决定一个好的班级计划。一种可能性是按功能分离类

  • 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 个),我需要一个

  1. CheckForm,
  2. EmailForm
  3. DisplayForm班级。

3*3 = 9 个类 + 3 个基类 = 12 个类。
此外,您想将正确的 CheckForm-subclass 和 EmailForm-subclass 注入工作流程,它们都需要具有相同的表单类型。也许我们需要为此创建一个 FormWorkFlowFactory。这样一共有13 个类。

现在我觉得我做错了可怕的事情。如果我有FormSubmitWorkFlow一个模板方法类,我可以创建 3 个子类,但每个子类会混合不同的职责。

你如何改进这一点,你能激发你的答案,即什么方法引导你得到答案?


编辑:虽然当前唯一的答案很有用,但很高兴看到同意它的人的一些投票,或者我想听到社区提供更好的解决方案。我是唯一一个赞成这个答案的人。这个问题可以使用更多的输入,所以请随时提供:-)

4

1 回答 1

1

我不确定这是否会回答您的问题,但显然 SRP 的目标是编写您的代码,以便如果您必须更改某些内容,那只是出于一个原因。就像如果你的车有 SRP,那么就不会有调节温度和上下车窗的课程。那将违反原则。在这种情况下,您似乎做得对。是的,有很多课程,但另一种选择是很多混乱。除非有一种方法可以创建一个可以验证表单的类(这实际上应该是可能的,具体取决于您需要哪种验证)。

如果您创建了一个验证类,您可以在其中添加一系列预期值并查看它们是否匹配,那么您可能会有更多的整体类,但我认为它的耦合度会低得多。让我知道我是否理解正确。

于 2009-11-25T07:50:43.020 回答