【发布时间】:2009-11-24 20:17:21
【问题描述】:
我在决定班级职责时遇到了问题。
我有 3 个 html 表单:
- 对于每个表单,都有一个 html 模板,其中包含一些文本和要包含的表单的标记
- 需要验证每个表单,如果出现错误,则需要重新显示模板和 (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 个子类,但每个子类会混合不同的职责。
你如何改进这一点,你能激发你的答案,即什么方法引导你得到答案?
编辑:虽然目前唯一的答案很有用,但很高兴看到一些同意它的人的投票,或者我想听到社区提供更好的解决方案。我是唯一一个赞成这个答案的人。这个问题可能需要更多的输入,所以请随时提供:-)
【问题讨论】:
-
一个可能有用也可能没有帮助的建议是改变问题。我注意到它只有 25 个视图。我认为部分原因是您选择的标签,部分原因是标题的措辞以及问题有点难以理解的事实。我的建议是添加标签以获得更多视图,如 oo 设计或类似的东西。还可以尝试制作一个更醒目的标题,例如:“我在尝试应用 SRP 时创建了太多类吗?”然后尝试将您的问题缩小到更小的尺寸,以便更多人阅读它。浓缩它需要一些工作,但这是值得的。
-
我的意思是重新发布问题,只是不同。
-
感谢您的建议。将以更有吸引力的方式重新发布。有点羞耻,因为问题应该是详细和集中的。感谢您的支持!
标签: design-patterns workflow single-responsibility-principle template-method-pattern