Разгрузка конструктора, внешняя настройка объекта

Поговорим о правильном написание ООП кода, а именно о разгрузке конструктора и внешней настройки объекта.

Классы писать исключительно так, чтобы всё используемое в них было заключено в них, т.е. не было никаких внешних обращений и зависимостей. Классы должны быть полностью автономны в этом плане.

Не запускать всю работу класса в конструкторе и не передавать в конструктор слишком много. Лучше выполнять всю работу в отдельном методе, который надо будет отдельно вызвать. Нужно это для того, чтобы можно было предварительно настроить объект после его создания. Поэтому конструктор не загружаем работой и не запускаем в нём работу автоматически иначе у нас не будет способа нормально настроить объект, а передавать в конструктор большое количество параметров неудобно. Это мешает масштабированности класса, ведь неизвестно сколько в будущем в него всего добавится, что нужно будет предварительно настраивать. Придётся постоянно расширять список аргументов конструктора. Это очень неудобно, поэтому конструктор не загружаем функционалом. В нём пишем самый минимум, а лучшее вообще оставлять его пустым, а всю работу выполнять в отдельном методе класса, который можно вызвать в любое время после создания объекта и его длительной настройки. А то, когда мы засовываемым весь функционал в конструктор и там же делаем всю работу, получается, что нам лень написать ещё одну строку вызова метода для основной работы класса, а от этого очень сильно страдает масштабируемость.

Примеры

Неправильное решение:

class CSpeaker {
	public function say($sWord, $bExclamation = false) {
        echo $sWord;
        if ($bExclamation) {
            echo '!';
        }
	}
    public function __construct($sWord, $bExclamation = false) {
        $this->say($sWord, $bExclamation);
    }
}
$oCSpeaker = new CSpeaker('World', true);

При расширении класса придётся добавлять в конструктор аргументы и много кода. Есть вещи, которые для объекта надо задать только после его создания.

Правильное решение:

class CSpeaker {
    public $sWord;
    public $bExclamation;
	public function say() {
        echo $sWord;
        if ($bExclamation) {
            echo '!';
        }
	}
}
$oCSpeaker = new CSpeaker();
$oCSpeaker->sWord = 'World';
$oCSpeaker->bExclamation = true;
$oCSpeaker->say();

Создали объект класса. Настроили его как надо и вызывали метод для работы.