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 доступны из модели по тому же имени)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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