MegaMufa
@MegaMufa

Как уменьшить размер модели?

Добрый день.

Есть у меня сайт на Yii, в нем модель User. Класс используется очень активно и сам постоянно изменяется.

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

Сначала я хотел сделать промежуточный класс между User и его предком и в него вынести геттеры и сеттеры. Но как то это не правильно. Вот сижу и думаю, может в поведение вынести некоторые методы?

Поделитесь, как вы боретесь в объемными классами?
  • Вопрос задан
  • 3069 просмотров
Решения вопроса 2
egor_nullptr
@egor_nullptr
Если не получается отделить часть методов в отдельный класс, то делите на трейты. Кому-то покажется что такой подход "некошерен", но с проблемой организации кода он справляется хорошо.
Ответ написан
Комментировать
Zhandos
@Zhandos
Трейты как выше уже писали использовать не логично - их применяют для реализации функционала используемого в нескольких классах.
Было бы логично уменьшить размер модели путём разбиение его функционала на под-модели в модулях.
Допустим есть базовая модель User всего приложения, содержит лишь нужный всем функционал, базовые правила валидации, связи, геттере-сеттеры и прочее. В модуле авторизации имеется своя модель User с нужным для этого модуля функционалом.
Конечно этот вариант проблемно реализовать на php < 5.3, т.к. с пространством имён такое проворачивать веселее, чем именовать модели прифексами, BaseUser, AuthUser и т.д.
Выше описанную методику мы используем при разработке проекта на Yii2.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Nokyta
Если в модели есть методы которые используются в формах (кастомные валидации при создание/редактирование пользователя), то имеет смысл вынести их в UserForm наследованный от CFormModel и будет использоваться для форм.
В поведение обычно выносятся методы которые используют две или более модели, т.е. методы для одной модели туда выносить бессмысленно.
Ответ написан
Комментировать
@Arik
Для трейтов пока рано, тем более yii 1 писали под 5.2 и неизвестно какой у вас стоит php.

Не очень yii знаю, но:
Можно сделать небольшой класс-помощник и вынести туда кишки ваших методов. Либо несколько таких помощников, если код можно разделить/сгруппировать по разным классам. Тогда класс User будет лишь переходником (так сказать роутером).
private $_helper;

    private function _getHelper()
        {
        if( !($this->_helper instanceof Helper_User) )
            {
            $this->_helper = new Helper_User();
            }

        return $this->_helper;
        }

    public function getData()
        {
        return $this->_getHelper()->getData();
        }

    public function setData($data)
        {
        return $this->_getHelper()->setData($data);
        }


Все приватные методы могут пойти сразу в этот класс-помощник. Кол-во публичных метод останется прежним, но не будут занимать столько места.
Ответ написан
Комментировать
Вместо трейтов в старом yii предполагалось использовать behavior
он одновременно является коллекцией ивентов
+
расширяет методы модели (т.е. публичные методы behavior доступны из модели по тому же имени)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы