Мой мозг начинает болеть, поэтому я решил спросить здесь.
У меня есть объект данных, сотрудник.У меня есть менеджер EmployeeManager, который обрабатывает доступ к базе данных и другие вещи.Прямо сейчас у меня есть большой блок проверки в EmployeeManager, но мне было интересно, могу ли я перенести часть этого в сеттеры.
Например, сейчас у меня есть;
public function getSSN($bFormatted = true) {
return ($bFormatted) ? $this->format_ssn($this->SSN) : $this->SSN;
}
public function setSSN($s, $bValidate = false)
{
// If we're validating user entry, save a copy.
// Either way, store a trimmed version.
if ($bValidate): $this->SSNToValidate = $s; endif;
$this->SSN = str_replace('-', '', $s);
}
public function getSSNToValidate() { return $this->SSNToValidate; }
Что это делает:
* Когда вы устанавливаете SSN, если он выполняется системой (например, из базы данных), тогда он делает setSSN('123456789', false)
, потому что SSN хранятся в базе данных без черточек.
*Когда вы устанавливаете SSN из пользовательского ввода, он просто setSSN('123-45-6789')
затем не только обрезает тире, но и сохраняет необработанную версию для проверки (потому что я хочу проверить на основе формата)
* Когда вы получаете SSN,если запрашивается форматирование (и оно всегда выполняется, кроме случаев, когда вы выполняете запись в базу данных), оно форматирует его на основе другой функции в классе Employee.
Поэтому мой вопрос таков: возможно, я могу добавить проверку всеттер здесь, вместо того чтобы полагаться на монолитную функцию проверки в классе Manager?Поскольку я начинаю сталкиваться с ошибками, возникающими во всем приложении, на данный момент я решил перейти к центральному статическому классу Error Handler, а не каждому менеджеру поддерживать свой собственный список ошибок.
И из-за этого я мог бы легко добавить обработку ошибок к этому:
public function setSSN($s, $bFromUser = false)
{
if ($bFromUser && !$this->validateSSN($s))
{
ErrorHandler::add(array('ssn' => 'Invalid SSN entered'));
}
else
{
$this->SSN = str_replace('-', '', $s);
}
}
Поэтому я предполагаю, что мой вопрос таков: имеет ли это смысл или я теряю себя, перенося валидацию из менеджера (быть выполненным по требованию или непосредственно перед записью в базу данных) к объекту (для выполнения при записи)?
Это в целом универсально, я просто использую SSN в качестве хорошего примера.