Kirill
8+ совершенно бессмысленно вообще везде, кроме энтитей
Kirill
а начиная с 8.4 вообще за гет/сет надо увольнять)
Роман
ну так я в сущностях и использую
Kirill
инкапсуляция - это предоставление пользователю того функционала, который определён в рамках указанной предметной области класса
Роман
да всегда рекомендуют делать через get/set
как будут выглядить запросы без этого?
Kirill
Kirill
если класс должен отвечать за хранение и передачу данных, то он и должен предоставлять функционал хранения и передачи данных, и ничего более
Kirill
это и есть инкапсуляция
Kirill
считай что SRP
Kirill
Kirill
куда?
Роман
обычный круд
Kirill
круд - это набор операций
Роман
я тебе говорю по умолчанию доктрина настроена так что не пропускает запросы без объявленых set/get
Kirill
запросы... ты про SQL? для чтения используется SELECT
Kirill
Роман
В Symfony (и в принципе в объектно-ориентированном программировании) использование методов get и set для доступа к данным сущностей является хорошей практикой, и вот почему:
Почему использовать get и set методы:
Инкапсуляция данных:
get и set методы обеспечивают контроль над тем, как данные сущности читаются и изменяются. Это позволяет скрыть внутреннюю реализацию и защитить данные от некорректного использования.
Валидация и логика:
В методах set можно встроить логику для валидации или преобразования данных перед их установкой. Это может включать проверку допустимых значений, преобразование форматов и т. д.
Согласованность данных:
С использованием get и set методов вы можете гарантировать, что данные всегда находятся в согласованном состоянии. Вы можете реализовать логику для поддержания целостности данных в одном месте, а не везде по коду.
Поддержка ORM и других библиотек:
В ORM, таких как Doctrine, методы get и set часто используются для взаимодействия с базой данных. Это позволяет ORM правильно обрабатывать данные и автоматически синхронизировать их с базой данных.
Упрощение тестирования:
Использование методов доступа упрощает тестирование, так как вы можете легко заменить реализацию геттеров и сеттеров или использовать моки.
Гибкость:
Если в будущем вам потребуется изменить логику доступа к данным, вы сможете это сделать, изменив только методы get и set, не затрагивая остальной код.
Роман
Важно помнить:
Автогенерация методов:
Некоторые фреймворки или инструменты могут автоматически генерировать методы доступа для ваших сущностей. В этом случае важно проверить, что автоматически сгенерированные методы соответствуют вашим требованиям.
Использование публичных свойств:
В некоторых случаях, если вы не планируете использовать сложную логику или валидацию, вы можете использовать публичные свойства. Однако это менее гибко и может привести к проблемам с инкапсуляцией.
Заключение
Использование методов get и set для доступа к данным сущностей является хорошей практикой, так как оно поддерживает принципы инкапсуляции, упрощает управление данными и способствует более чистому и поддерживаемому коду.
Kirill
1) get/set НЕ обеспечивают инкапсуляции данных, для контроля доступа за ними существуют атрибуты, модификаторы доступа и свойства
Kirill
2) В энтитю должны приходить уже корректные данные, никакой валидации делать там нельзя, максимум инварианты согласно контрактному программированию, а за валидацию отвечают соответсвующие слои
Kirill
инварианты так же могут быть частью свойства или быть определны типом на уровне стат анализа
Kirill
Дальше чушь написана, доктрине посрать на эти гет/сет
Kirill
С моками, согласен, что упрощает тестирование, т.к. позволяет поломать всё нахрен
Роман
наверно если все свойства сделать публичными
Kirill
с другой стороны а зачем пытаться сломать тот код, который и так не сломать, т.к. он контролируется?
Kirill
короче, это рекомендация легаси и идеальна для джунов
Kirill
ну и для тех, кто на пхп 5 сидит
Kirill
примерно как "не используй статик методы", для джунов отличная рекомендация
Роман
у вас на проекте код entity с публичными свойствами?
Kirill
ты код открывал, не?
Роман
я про коммерческий код
Kirill
там php 8.2, а в нём нет свойств
Kirill
так что контроль доступа согласно предметной области объектов
Роман
у кого как сделано, частая ли практика отказ от set/get или мне лид мне замечание скажет
Роман
Kirill
свойства в языке появились в php 8.4 только
Роман
бл
Роман
так не кто 8.4 не использует ещё
Kirill
ещё их называют "хуками"
Роман
в 8.2 твой код не сработает? без сетеров и гетеров?
Kirill
ну вот, а поля вполне себе делаю публичными когда надо)
Роман
я спросил есть ли на работе практика использования моделей без set/get , а просто публичные свойства
Kirill
так моделей вообще нет никаких
Роман
entity
Kirill
я так понимаю ты под свойствами подразумеваешь поля?
Kirill
есть такие
Роман
наверно
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
#[ORM\Column(type: 'bigint')]
private ?int $id = null;
Kirill
The Ant
Как нет? )
Роман
property
Kirill
свойство - это поле с поведением на установку и получение
Kirill
т.е. get/set методы - это эмуляция свойств в языках, где нет их
The Ant
Роман
ясно публичные поля используются для entity в проектах?
Kirill
The Ant
Иначе смысла просто нет. Зачем оно, если мы не сохраняем туда ничего?
Kirill
а нюанс в том, что свойства как раз можно делать публичными
Роман
меня тоже бесит этот переизбыток кода
Kirill
а с полями надо подумать где надо, а где нет
Роман
удалять или нет
Kirill
Иначе смысла просто нет. Зачем оно, если мы не сохраняем туда ничего?
/**
* @var PackageVersionsSet<PackageVersion>
* @readonly
*/
#[ORM\OneToMany(targetEntity: PackageVersion::class, mappedBy: 'package', cascade: ['ALL'], orphanRemoval: true)]
#[ORM\OrderBy(['version' => 'DESC', 'createdAt' => 'ASC'])]
public Collection $versions {
get => PackageVersionsSet::for($this->versions);
}
Kirill
вот жеж
Kirill
Kirill
проблема в том, что поля нельзя покрыть интерфейсами нормально
Роман
а зачем?
Kirill
Kirill
просто в пыхе поля и свойства почти синонимы, поэтому многие путаются
Роман
кто entity покрывает интерфейсами?
Kirill
а т.к. разговор как раз об отличиях, то следует не "ок я понял о чём ты", а определиться в терминах
Kirill
Kirill
это поле с гет + сет
Роман
так нужно или нет set/get или или и без них нормально работает с публичными полями
Роман
ну я же говорил значит в 8.4 наконец то добавили авто свойства из с#
The Ant
Там речь про структурное программирование. Структуры это не объекты, а просто скоуп переменных и функций для работы с ними. Поле в этом случае действительно просто переменная.
Kirill
как и в ЛЮБОМ языке)