Исходный код
$this->oPostTest->recipients = trim($this->oPostTest->recipients);
$this->oPostTest->recipients = trim($this->oPostTest->recipients, ';');
$this->oPostTest->recipients = str_replace(' ', ';', $this->oPostTest->recipients);
$this->oPostTest->recipients = str_replace(';;', ';', $this->oPostTest->recipients);
Что не так в исходном коде
Первая проблема в исходном коде: обработка списка получателей привязана к конкретному полю $this->oPostTest->recipients
. Решение: обработка списка получателей должна быть оформлена в виде обработки абстрактной строки, без привязки к месту хранения этого списка, то есть к полю $this->oPostTest->recipients
.
Вторая: исходный код погружается напозволительно глубоко в детали устройства объекта $this->oPostTest
, с которым в данный момент работает. Решение: вызов обработчика списка получателей нужно поручить тому объекту, который этот список хранит, то есть $this->oPostTest
. Пока не очень ясно, в какой момент должна происходить обработка: при записи нового значения в поле recipients
, или же в момент использования.
К слову, и весь остальной алгоритм, касающийся формирования письма, должен быть перенесён в соответствующий класс.
Пример рефакторинга исходного кода
class Post {
private $recipients = '';
public function __construct($recipents) {
$this->recipients = Post::normalizeRecipients($recipients);
}
static protected function normalizeRecipients($recipients) {
$recipients = trim($recipients);
$recipients = trim($recipients, ';');
$recipients = str_replace(' ', ';', $recipients);
$recipients = str_replace(';;', ';', $recipients);
return $recipients;
}
}
Теория
- Запах «завистливые функции»
- Рефакторинг «извлечение функции»
- Рефакторинг «перемещение метода»