Задать вопрос

Как прекратить создавать объекты классов?

Здравствуйте, решил все-таки научиться хоть немного программировать по-взрослому, и вот.. имею проект в разработке, везде присутствует следующий код в классах. Мне не комфортно, что приходится создавать объект в __construct, чтобы пользоваться им в классе.
class TaskKey_Model
{
    private $database;
    private $user;
    private $task;

    public function __construct()
    {
        $this->database = new Database();
        $this->user = new User_Model();
        $this->task = new Task_Model();
        ..... и так далее
    }
}

Очевидно, что Database() можно вынести в отдельную модель, типа ActiveRecord, и просто наследовать её, а как тогда поступить с User_Model и прочим? Как не объявлять его постоянно? (перевести все в activerecord и вызывать статично, да?) а какие еще есть варианты
  • Вопрос задан
  • 1173 просмотра
Подписаться 10 Средний Комментировать
Решения вопроса 3
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Очевидно, что Database() можно вынести в отдельную модель, типа ActiveRecord,

Она у вас и так вынесена, в класс Database.

и просто наследовать её

А вот этого делать не стоит. От слова совсем.

Есть такая штука, Dependency Injection (DI). Почитайте. Возможно, не сразу вкурите. Но это необходимо понять и научиться с этим работать.

Должно быть как - у вас есть контейнер, который знает все ваши классы / сервисы (они регистрируются в него или с помощью Service Locator подтягиваются). Он же (контейнер) держит в себе инстансы этих классов - при первом вызове класса он инициализируется 1 раз и сохраняется в контейнере. При последующих обращениях контейнер возвращает уже существующий инстанс. Инициализацию сервисов в конструкторах делать не надо, это жестко связывает ваш код и ведет в никуда. Зависимости надо подкидывать через конструктор, параметрами.
Ответ написан
@Vasiliy_M
Очевидно, что Database() можно вынести в отдельную модель, типа ActiveRecord
объект для работы с СУБД никоим образом не относится к паттерну AR. AR не должна наследоваться от объекта СУБД.

и просто наследовать её
https://refactoring.guru/ru/replace-inheritance-wi...

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

Здравствуйте, решил все-таки научиться хоть немного программировать по-взрослому
прочти хотя бы 1/3 этой книги
Ответ написан
Комментировать
qonand
@qonand
Software Engineer
Проблема Вашего кода это сильная связанность со всеми вытекающими. В такой ситуации как минимум стоит применить SOLID-принципы, как максимум - переработать архитектуру приложения (но тут конечно все зависит от масштаба проекта).

Рекомендую почитать:
Robert Martin - Agile Software Development, Principles, Patterns and Practices
Martin Fowler - Patterns of Enterprise Application Architecture
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@artem78
Можно использовать шаблон Registry.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы