SRP应用于工作流程的例子:如何结构的课程中的一个明智的方式
题
我有一个问题与决定有关的类的责任。
我有3html形式:
- 对于每种形式有html模板含有的一些文本和标记的形式将包括
- 每一种形式需要进行验证,如果有错误的模板和形式(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人)我需要一个
CheckForm
,EmailForm
和DisplayForm
类。
3*3=9类+3的基类=12课程。
还有,要注射正确的CheckForm-subclass和EmailForm-子类的成的工作流程,他们所有需要的相同形式类型。也许我们需要建立一个FormWorkFlowFactory这一点。这些加起来 13 课程。
现在我感觉我是在做的事情可怕的错误。如果我有 FormSubmitWorkFlow
作为一个模板的方法类,我可能只是建立3个子类,但每一个亚类将混合不同的职责。
你怎么改进这个,你能不能激发你的答案,即什么方法你会导致你的答案吗?
编辑:虽然目前唯一的答案是有用的,它将很高兴看到,某些选民,从人同意,或者我想听到更好的解决方案,从社区。我是唯一一个投赞成票这个答案。这个问题可以使用更多的投入,以便随时提供所:-)
解决方案
我不确定这是否会回答你的问题或者没有,但是很明显的目标SRP是来写你的代码所以,如果你已经改变的东西,就只有一个原因.如果你的车已计划然后就不会有一类调整的温度,也把窗户上下。这将违反该原则。在这种情况下你似乎是这样做是正确的。是的这是一个很大的类别,但可替代的是一个很大的混乱。除非有一种方法,你可以创建一个单一的类会验证的形式(这真的应该尽可能取决于什么样的核查需要).
如果你创造了一个核查类在这里你可能只是增添一个链的预期值并看看他们是否匹配然后你可能会有更多的总体课程,但我认为,这将是迄今为止小耦合。让我知道如果我理解正确与否。