SRP применил к примеру рабочего процесса: как структурировать классы разумно
Вопрос
У меня есть проблема с принятием учебных обязанностей.
У меня 3 HTML-форма:
- Для каждой формы есть шаблон 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 классов.
Кроме того, вы хотите внедрить правильный контроль-форму-SUBClass и Emailform-Subclass в рабочий процесс, все они должны быть одинакового типа формы. Может быть, нам нужно создать для этого FormworkFlowFactory. Это добавляет 13 классы
Теперь у меня есть чувство, что делаю что -то ужасно неправильное. Если бы у меня было FormSubmitWorkFlow
Как класс метода шаблона, я мог бы просто создать 3 подкласса, но каждый подкласс будет смешивать разные обязанности.
Как вы могли бы улучшить это, и не могли бы вы мотивировать свой ответ, то есть какой метод приводит вас к вашему ответу?
редактировать: Хотя единственный текущий ответ полезен, было бы неплохо увидеть некоторые голоса от людей, которые согласны с этим, или я хотел бы услышать лучшие решения от сообщества. Я единственный, кто провели этот ответ. Этот вопрос может использовать больше ввода, поэтому не стесняйтесь предоставлять так :-)
Решение
Я не уверен, ответит ли это на ваш вопрос или нет, но, очевидно, цель SRP - написать ваш код, чтобы, если вам нужно что -то изменить, это только по одной причине. Например, если бы у вашего автомобиля был SRP, то не было бы класса, который регулировал температуру, а также ставит окна вверх и вниз. Это нарушит принцип. В этом случае вы, кажется, делаете это правильно. Да, это много классов, но альтернатива - большая путаница. Если бы не было способа создать один класс, который проверил бы формы (что действительно должно быть возможно в зависимости от того, какую проверку вам нужна).
Если вы создали класс проверки, где вы можете просто добавить цепочку ожидаемых значений и посмотреть, соответствуют ли они, у вас, вероятно, будет больше общих классов, но я думаю, что это будет гораздо менее связано. Дайте мне знать, правильно ли я вас понял или нет.