Создание объектов с большим количеством полей

Yoskaldyr

"Спамер"
Партнер клуба
Создам как еще одну тему :)
Кто и как создает объекты с большим количеством полей, чтобы было и удобно создавать и автокомплит и удобно потом читать и править в будущем :)
Иногда надо создавать объекты с большим количеством предопределенных полей и желательно чтобы на выходе объект был валидным.

Например через конструктор, все поля через параметры - автокомлит есть, первоначально написание просто и удобно, но чтение полученного списка - вообще не айс + легко при дальнейших правках набочить. (да новые плюшки сторма с отображением названия для параметра помогают, но отображаются не всегда)
Через передачу параметров массивом: чтение зачет, но никакого автокомплита + легко набочить с именами ключей при правке.
Создание пустого объекта и потом руками прописывать все поля построчно: все в принципе норм, и создание и чтение и правка, но очень легко добиться невалидного состояния объекта.

P.S. Я понимаю что тут бы идеально зашли именованные параметры у функций и методов, но нет их в php :(
 

fixxxer

К.О.
Партнер клуба
Часто можно выделить особые случаи (скажем, пользователь по емейлу-паролю или по внешнему SSO ID), в таких случаях делаю именованные конструкторы.

А вообще в PhpStorm это не то чтобы проблема - все видно. Если уж совсем напрягает, в каких-то случаях можно сделать фабрику с fluent билдером. Можно даже заморочиться и написать кодогенератор таких фабрик. Мне именованных конструкторов хватает.

Невалидный объект, конечно, создаваться не должен, это худший из вариантов.
 

Adelf

Administrator
Команда форума
Класс с большим количеством полей - это запашок :)
Первое, что можно замутить это VO. Вместо кучи полей country, city, street, etc. - одно поле Address.

Плюс надо смотреть на действия над ним. Редко бывает такое, чтобы все поля(когда их много) участвовали во всех действиях. По участию полей в действиях можно найти некие группировки полей, и вынести эти группировки в отдельные классы.
 

Yoskaldyr

"Спамер"
Партнер клуба
Часто можно выделить особые случаи
особые случаи почти всегда имеют свои именованные конструкторы, так что с ними как раз нет проблем.
А вообще в PhpStorm это не то чтобы проблема - все видно
Видно не всегда, все зависит от того что передается в функцию, если скаляр, то инлайново отобразит название параметра, если переменная, то нет.

Класс с большим количеством полей - это запашок
Это понятно, но часто это когда куча каких-то равноценных метрик, куча таймстампов, или булевых значений и это все никак не сгруппировать, т.к. все равноценное.

Еще бредоидея: держать 2 типа классов с одинаковыми полями, отдельный класс для не валидного объекта, который генерится по тупому прописыванием полей построчно для того чтобы его передавать на конструктор валидного (ну и понятно что везде в коде использовать класс валидных объектов)

С другой стороны не было бы проблем если бы был какой-то автокомплит для ключей массивов по заданной схеме.
 

Adelf

Administrator
Команда форума
Переходи на C# :)

C#:
public class Foo
{
    public string test { get; set; }
    public string test2 { get; set; }
    public string test3 { get; set; }
}

var foo = new Foo()
    {
        test = "bar",
        test2 = "bar",
        test3 = "bar",
    };
 

Yoskaldyr

"Спамер"
Партнер клуба
о, еще одна бредоидея: в качестве параметра в конструктор передавать кложуру где в теле прописывать все параметры, но блин как-то трешово....
 

Yoskaldyr

"Спамер"
Партнер клуба
бредоидея номер 3: использовать анонимные классы со схемой в интерфейсе. можно комбинировать с бредоидеей номер 1:
Еще бредоидея: держать 2 типа классов с одинаковыми полями, отдельный класс для не валидного объекта
Тогда будет всего 1 основной класс и 1 интерфейс схемы и самая короткая запись и самая адекватная читаемость.
 

Yoskaldyr

"Спамер"
Партнер клуба
@fixxxer тоже вариант :)
правда спрятали настройку знатно...

это конечно в разы удобнее, но не помогает когда надо смотреть в изменения в гитлабе и других подобных системах :(
 

fixxxer

К.О.
Партнер клуба
Это да. Я при нетривиальных code review обычно клонирую веточку, открываю в PhpStorm-е, и смотрю параллельно в нем и в браузере.

Вообще у JetBrains есть какая-то штука, в которой можно ревьюить в вебе чуть ли не со всеми фичами IDE. Попробовать, что ли.

UPD: https://www.jetbrains.com/upsource/
 

fixxxer

К.О.
Партнер клуба
Да фиг его знает, во всех продуктах JetBrains обычно миллион настроек. :) Надо пробовать.

Ну и я это уже скорее "вообще" - code review нетривиальных PR без возможности "попрыгать" по коду делать довольно сложно, не имея параллельно открытой IDE. Upsource вроде как именно для решения этой проблемы и разработан.
 

Yoskaldyr

"Спамер"
Партнер клуба
кстати другой пример
что делать если есть базовый ValueObject/Entity с заданным набором полей, который может расширяться (добавлять поля, методы) через AOP другими модулями (данный движок форума - типичный пример).
Т.е. вариант с параметрами конструктора тогда уже не вариант, как тогда тогда создавать объекты?
 

Superman

Новичок
Dear solid programmers!
Please allow me to interrupt you all.
What is named constructor, what is valid/invalid object, and what is method's named parameters?
Thank you and may God bless you!
 

Yoskaldyr

"Спамер"
Партнер клуба
Насчет своего последнего вопроса есть идея разбить на пары классов и как вараинт использовать анонимные классы, хотя конечно стремновато выглядит, зато автокомплит присутствует.

Для примера пусть будет Item
Есть базовый класс "схемы" ItemSchema, и основной класс Item, которые могут расширяться сторонними модулями через AOP.
На вход конструктора Item передавать только ItemSchema. Как именно создавать объект ItemSchema уже не важно, т.к. валидность данных для этого объекта не критична. А если ItemSchema сделать абстрактным, то передавать в конструктор анонимный класс отнаследованный от ItemSchema.

Т.е. ItemSchema чисто для данных и данные там могут быть невалидные, валидность проверяется в конструкторе Item.
 

Yoskaldyr

"Спамер"
Партнер клуба
Судя по всему всем пофиг или вопрос не о чем :)

Тогда такой вопрос, кто-то в реальных проектах AOP юзал? С какими подводными камнями сталкивались со стороны PHP?
 

Yoskaldyr

"Спамер"
Партнер клуба
Да зло :(
Но пришло же из кровавого ява энтерпрайза не просто так. Нужен когда есть монолит который нельзя трогать (сторонний закрытый продукт), а как-то расширять надо.
 

Yoskaldyr

"Спамер"
Партнер клуба
Вообще как еще можно расширить какой-либо готовый продукт без AOP? Даже если там есть события, то в их всегда не хватает если надо расширять какую-то часть, где их нет.
 
Сверху