Пример рефакторинга «перемещение метода» при подготовке списка получателей письма


Исходный код

$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;
    }
}

Теория