SRP施加到工作流实例:如何构建在一个合理的方式中的类(SRP applied to a workf

2019-09-27 03:41发布

我有决定有关类责任的问题。
我有3 HTML的形式:

  1. 每种形式存在要被包括含有用于某些形式的文本和标记物的HTML模板
  2. 每个窗体需要被验证,如果有错误的模板,并从(1)需要重新显示的形式,连同一些错误消息。 只有某些领域是跨越不同形式普遍。
  3. 如果没有错误,需要邮寄的结果消息。 对于每个窗体有一个结果邮件模板。

我觉得很难对这一问题的好方案类决定。 一种可能性是通过功能分离的类

  • 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子类和EmailForm子类注入到工作流程中,他们都需要是相同的形式类型。 也许我们需要为此创建FormWorkFlowFactory。 这就增加了13个班。

现在,我得到了我做可怕的错误的感觉。 如果我有FormSubmitWorkFlow作为模板方法的类,我可以创建3个亚类,但每个子类会混合不同的责任。

你怎么能改善这一点,你可以激励你的答案,即什么方法引导你到你的答案?


编辑 :尽管目前唯一的答案是非常有用的,它会很高兴看到来自与它同意一些人的投票,或者我想听到来自社会各界更好的解决方案。 我是谁upvoted这个答案只有一个。 这个问题可以用更多的投入,所以觉得免费提供这样:-)

Answer 1:

我不知道这是否会回答你的问题或没有,但显然SRP的目标是编写代码,这样,如果你要改变的东西,它是只有一个原因。 就像如果你的车有SRP那么就不会是调节温度,也把窗户上下的一类。 这将违反原则。 在这种情况下,你似乎是这样做的权利。 是的,它有很多类,但另一种方法是有很多的困惑。 除非是你可以创建一个类,将验证形式(这确实应该取决于你需要什么样的验证是可能的)的方式。

如果你创建了一个验证类,你可以只添加预期值链,看看他们是否匹配,那么你很可能有更多的总类,但我认为,这将是远不如再加。 让我知道如果我正确或不理解你。



文章来源: SRP applied to a workflow example: how to structure the classes in a sensible way