@topuserman

Что делать если в класса сущности много свойств?

У некоторых сущностей, может быть до 20 десятков свойств, которые передаются через конструктор.
Разделить сущность на несколько мелких сущностей не получится.

Какие есть варианты упрощения ? чтобы при создании объекта не передавать кучу параметров в конструкторе.

И также сразу второй вопрос: можно ли в классе-сущности создать метод, который будет создать свой объект:

например так (чтобы каждый раз не писать код создания объекта):

public static function create(int $id): self {
     $order = App\Data\Order::getById($id);
     $user = App\Data\User::getById($order->getUserId());
     return new self($order->getId(), ... $user->getOtherData(), ..);
}
  • Вопрос задан
  • 268 просмотров
Решения вопроса 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Разделить сущность на несколько мелких сущностей не получится.

Это тебе только так кажется.

Пора открывать для себя ООП, а конкретно - такие понятия как композиция и агрегация.
Сущность, у которой все свойств 20 задаются через конструктор - это уже большой красный звонок.
Если ты посмотришь внимательно, то эти свойства прекрасно группируются по какому-либо признаку, и некоторые из них могут принадлежать другому, служебному классу.
Сгруппировав параметры таким образом, ты не только уменьшишь количество параметров, но и сделаешь небольшой шажок к нормальному коду от классического спагетти

Вот очень хороший доклад от Дмитрия Елисеева (который, на мой взгляд, является на данный момент лучшим в России популяризатором ООП в РНР). Видео стоит посмотреть целиком, но конкретный ответ на твой вопрос начинается на 27 минуте: https://youtu.be/6tL1XOywgUc?t=1653
Ответ написан
Комментировать
Wolfnsex
@Wolfnsex Куратор тега PHP
Если не хочешь быть первым - не вставай в очередь!
Какие есть варианты упрощения ? чтобы при создании объекта не передавать кучу параметров в конструкторе.
На вскидку, вариантов несколько:
1. Передавать не 20 десятков свойств, а именованный массив, например так:
__construct($array) { ... }

new MyClass([
    'property1' => 'value1',
    'property2' => 'value2',
    'property2' => 'value3',
]);


А в самом классе соотв. заполнять те поля которые не переданы - значениями по умолчанию (если это допустимо), так будет несколько более читабельно.

2. Либо же, если проблема конкретно в конструкторе - можно передавать эти значения через другой метод, не конструктор.

3. Или, можно где-то сохранять эти значения (в конфиге, в БД, в сессии, где-то-ещё) и при создании экземпляра нужного класса - доставать их оттуда (такая практика встречается довольно часто).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Kirill-Gorelov
С ума с IT
https://refactoring.guru/ru/design-patterns/builder - как одно из решений
Ответ написан
Комментировать
@necrodeflorator
тот метод, что вы написали(create) - называется фабричный метод, ЕМНИП. Вполне рабочее решение, для скрипта "на коленке".

Можно так же почитать про другие порождающие паттерны проектирования, возможно поможет понять суть
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
11 мая 2024, в 00:19
1000 руб./за проект
10 мая 2024, в 23:51
30000 руб./за проект
10 мая 2024, в 23:33
2500 руб./за проект