Модуль user, прошу оценить

Обсуждаем, как правильно строить приложения
Ответить
dimagml
Сообщения: 4
Зарегистрирован: 2017.01.17, 14:12

Модуль user, прошу оценить

Сообщение dimagml »

Доброго времени суток!
Прошу оценить правильность подходов проектирования данного модуля. Точнее рефакторинга, т. к. после очередной итерации внесения пачки изменений в старый проект стало ясно, что без продуманной архитектуры на длительно существующих проектах жить нельзя, и что толстые модели это хорошо пока они не начинают занимать по 1К строк, и складывание всего и все в before... after... очень плохая идея. Хочется выработать компромисс между строгими принципами слоистой архитектуры, и AR = БД + форма + логика.
yii2-user
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Модуль user, прошу оценить

Сообщение samdark »

Не правильные они. Зашито всё намертво начиная от хранилища и схемы для юзера и заканчивая невозможностью прицепить свою identity.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Модуль user, прошу оценить

Сообщение ElisDN »

dimagml писал(а): 2017.01.17, 14:24и что толстые модели это хорошо пока они не начинают занимать по 1К строк
И Вы решили эти 1к строк перенести в UserService, заодно все методы сделав статическими?
dimagml
Сообщения: 4
Зарегистрирован: 2017.01.17, 14:12

Re: Модуль user, прошу оценить

Сообщение dimagml »

samdark писал(а): 2017.01.18, 01:20 Не правильные они. Зашито всё намертво начиная от хранилища и схемы для юзера и заканчивая невозможностью прицепить свою identity.
А если так? cfcbdf7 Можно ещё User в конструкторе сервиса заменить интерфейсом, как и PasswordHelper в методах.
ElisDN писал(а): 2017.01.18, 08:30
dimagml писал(а): 2017.01.17, 14:24и что толстые модели это хорошо пока они не начинают занимать по 1К строк
И Вы решили эти 1к строк перенести в UserService, заодно все методы сделав статическими?
Не совсем, часть вынести в сторонние классы, когда кода станет слишком много и будет что вынести (в новом коммите вынес работу с паролем в PasswordHelper).
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Модуль user, прошу оценить

Сообщение ElisDN »

dimagml писал(а): 2017.01.18, 13:28Не совсем, часть вынести в сторонние классы, когда кода станет слишком много и будет что вынести.
Если было весьма странно:

Код: Выделить всё

class UserService
{
    protected $userModel;

    public static function getUserById($id)
    {
        $model = User::findOne($id);
        if ($model === null) {
            throw new UserNotFoundException();
        }
        $instance = new self();
        $instance->userModel = $model;

        return $instance;
    }

    public function delete() {
        $this->userModel->delete();
    }
}
с полуиммутабельным классом, то стало ещё хуже с изменяемым полусинглтоном:

Код: Выделить всё

class UserService
{
    protected $userModel;

    public function __construct(User $user) {
        $this->userModel = $user;
    }
    
    public function getUserById($id) {
        $userModel = $this->userModel;
        $model = $userModel::findOne($id);
        if ($model === null) {
            throw new UserNotFoundException();
        }
        $this->userModel = $model;

        return $this;
    }
    
    public function delete() {
        $this->userModel->delete();
    }
}
Чем Вас не устроил классический вариант:

Код: Выделить всё

class UserService
{
    private $userClass;

    public function __construct($userClass) {
        $this->userClass = $userClass;
    }
    
    public function getUserById($id) {
        return $this->getUser(['id' => $id]);
    }
    
    public function getUserByName($name) {
        return $this->getUser(['username' => $name]);
    }
    
    public function delete($id) {
        $this->getUser(['id' => $id])->delete();
    }   
    
    private function getUser(array $criteria) {
        $class = $this->userClass;
        if (!$model = $class::findOne($criteria)) {
            throw new UserNotFoundException();
        }
        return $model;
    }    
}
с последующим вынесением выборок getUser* в UserRepository?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Модуль user, прошу оценить

Сообщение samdark »

А если так?
А что принципиально поменялось?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Модуль user, прошу оценить

Сообщение samdark »

Если вы хотите сделать действительно универсальный модуль, то он не должен знать о модели User, её полях или её хранении вообще ничего. Он должен требовать, объявляя интерефейсы, а не работать с чем есть.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Модуль user, прошу оценить

Сообщение anton_z »

ElisDN писал(а): 2017.01.18, 15:12 с последующим вынесением выборок getUser* в UserRepository
И еще не использовать в качестве бизнес-модели AR
dimagml
Сообщения: 4
Зарегистрирован: 2017.01.17, 14:12

Re: Модуль user, прошу оценить

Сообщение dimagml »

Всем спасибо, буду думать...
Хотелось в первую очередь разнести задачи выполняемые в модуле по разным классам максимально разгрузив AR (не отказываюсь от неё) и модели для форм, и изолировать Identity от User.

Ещё вопрос, есть достаточно большая AR модель с большим числом полей, пользовательскую валидацию хочется сделать отдельно, в отельной модели. Есть ли какой-то механизм упрощающий задачу, долго будет перечислять все поля класса новой модели вручную, DinamicModel вроде подходит, можно ей передать в конструктор attributes AR модели, но может есть что-то ещё?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Модуль user, прошу оценить

Сообщение rak »

dimagml писал(а): 2017.01.18, 23:54 Ещё вопрос, есть достаточно большая AR модель с большим числом полей, пользовательскую валидацию хочется сделать отдельно, в отельной модели. Есть ли какой-то механизм упрощающий задачу, долго будет перечислять все поля класса новой модели вручную, DinamicModel вроде подходит, можно ей передать в конструктор attributes AR модели, но может есть что-то ещё?
если задача просто уменьшить кол-во кода в одной модели для лучшей читаемости кода, то можно валидацию вынести в трейт, например
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Модуль user, прошу оценить

Сообщение anton_z »

dimagml писал(а): 2017.01.18, 23:54 Всем спасибо, буду думать...
Хотелось в первую очередь разнести задачи выполняемые в модуле по разным классам максимально разгрузив AR (не отказываюсь от неё) и модели для форм, и изолировать Identity от User.

Ещё вопрос, есть достаточно большая AR модель с большим числом полей, пользовательскую валидацию хочется сделать отдельно, в отельной модели. Есть ли какой-то механизм упрощающий задачу, долго будет перечислять все поля класса новой модели вручную, DinamicModel вроде подходит, можно ей передать в конструктор attributes AR модели, но может есть что-то ещё?
Да, так как у вас этот маппинг будет в слое контроллеров-форм, а не в домене, там можно не бояться добавлять зависимости и использовать всякие dynamic models. hydrators, mappers.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Модуль user, прошу оценить

Сообщение anton_z »

dimagml писал(а): 2017.01.18, 23:54 Всем спасибо, буду думать...
Хотелось в первую очередь разнести задачи выполняемые в модуле по разным классам максимально разгрузив AR (не отказываюсь от неё) и модели для форм, и изолировать Identity от User.
Если не откажешься от использования AR в качестве Entity - не получишь независимости от структуры БД и типа БД, а еще практически лишишься возможности тестировать свой код без БД. Тут надо приоритеты для себя расставить. От чего хочешь изолироваться в своем коде, если желание есть написать универсальный модуль, тогда абстрагируемся почти от всего.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Модуль user, прошу оценить

Сообщение zelenin »

Мне кажется, ТС не особо понимает, что вообще есть независимый модуль и плюсы и причины слоистой архитектуры. Он представил обычный yii-модуль с обычными yii-классами, распиханными по папочкам, назвал это архитектурой. А комментирующие не поняли это и советуют ему все исправить как "взрослому".
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Модуль user, прошу оценить

Сообщение samdark »

Да. Эта тема уже неоднократно поднималась: http://rmcreative.ru/blog/post/moduli-yii
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Модуль user, прошу оценить

Сообщение maleks »

Гложет подозрение что ТС не спрашивал ни о каком "универсальном" или "независимом" модуле, а о вполне конкретном, под определенное приложение (namespace app\modules\user;) и о том как его улучшить по гибкости к будущим изменениям.
Yii2 universal module sceleton - for basic and advanced templates
dimagml
Сообщения: 4
Зарегистрирован: 2017.01.17, 14:12

Re: Модуль user, прошу оценить

Сообщение dimagml »

maleks писал(а): 2017.01.20, 17:28 Гложет подозрение что ТС не спрашивал ни о каком "универсальном" или "независимом" модуле, а о вполне конкретном, под определенное приложение (namespace app\modules\user;) и о том как его улучшить по гибкости к будущим изменениям.
Да, именно так.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Модуль user, прошу оценить

Сообщение zelenin »

dimagml писал(а): 2017.01.20, 17:34Да, именно так.
тогда ответ: без разницы. какую философию исповедуете, так и делайте. если какие-то сущности вводятся для определенной цели - это одно. если вопрос "как по папкам распихать", то ответ - "по вкусу".
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Модуль user, прошу оценить

Сообщение anton_z »

dimagml писал(а): 2017.01.20, 17:34
maleks писал(а): 2017.01.20, 17:28 Гложет подозрение что ТС не спрашивал ни о каком "универсальном" или "независимом" модуле, а о вполне конкретном, под определенное приложение (namespace app\modules\user;) и о том как его улучшить по гибкости к будущим изменениям.
Да, именно так.
Зачем тогда вообще на модули разделять.
dimagml писал(а): 2017.01.20, 17:34 стало ясно, что без продуманной архитектуры на длительно существующих проектах жить нельзя
Утверждения противоречат друг другу.
Ответить