Разрешаем зависимости в классах

(навеянно gentoo)
Часто бывает ситуация, когда для работы класса нужно подгрузить другие классы или библиотеки. Обычно так и делаем: в конструкторе заргужаем и инициализируем если надо.

ИМХО, так не красиво. Получается засоряем конструктор. Хотя кому-как :)

Предлагаю свой метод “красивого”(для меня решения):
В базовом классе объявлем методы loadDependency() и initDependency(), а в конструкторе их вызываем.

(на примере моделей в codeIgniter-a)
[cc lang=”php”]
class MY_Model extends Model {
[…]
public function __construct() {
parent::__construct();
$this->loadDependency();
$this->initDependency();
}

/**
* Загружает необходимые зависимости
* (модели, плагины, хелперы, и т.д)
* При необходимости, потомок перезагружает метод
*/
protected function loadDependency() { }

/**
* Инициализирует загруженные зависимости
* (модели, плагины, хэлперы, и т.д)
* При необходимости, потомок перезагружает метод
*/
protected function initDependency() { }

[…]
}
[/cc]

А в наследниках, если это нужно, загружаем зависимости и инициализируем их, перегружая эти методы:
[cc lang=”php”]
class SomeModel extends MY_Model {
public function __construct() {
parent::__construct();
}

protected function loadDependency() {
parent::loadDependency();
$this->load->model(‘SomeModelAddon’);
$this->load->helper(‘SomeModelHelper’);
}

protected function initDependency() {
parent::initDependency();
$this->SomeModelAddon->someField = ‘someVal’;
}
}
[/cc]
Причём если целая иерархия наследований, то это заметно облегчает просмотр кода. Знаешь чётко где искать подгружаемый код и где он инициализируется.
В случае, если известно заранее что класс финальный(от него не будут наследоваться ничего) а в суперклассе методы пустые, можно убрать вызов методов у предка. И вообще аккуратно станет :)
Всё по полочкам.

“Просто железный порядок!” (с) Буринский А.А.