Как стать автором
Обновить

Комментарии 8

Спасибо, что в современном мире есть именованные аргументы
Именованные аргументы — лишь частный (и очень простой случай) билдера.
По большому счету все это сделано только для того, чтобы не запутаться в порядке инициализации компонент и большом количестве аргументов. Если все имена аргументов самого класса и его компонентов — именованные, никаких проблем — все четко просто и понятно написано.
Я понимаю, что можно извращаться в толковании инициализации, добавлять лямбды, отдельный билдер для каждого аргумента, потом еще написать функции вроде initAfter/initBefore, но все это в конечном случае именованием аргументов решается проще, понятнее и эффективнее.
Просто для размышления — пример последнего листинга может и выглядит эффектно, но ни одного желания понять, что там внутри происходит и как оно работает, не вызывает.
Вроде бы задачка плевая была, а решаем ее, стреляя из пушки по воробьям.
>По большому счету все это сделано только для того, чтобы не запутаться в порядке инициализации компонент и большом количестве аргументов.
Ну может и так быть, наверное даже в большинстве случаев, но это не единственное назначение билдера. Сложный билдер не сводится только к аргументам, а точнее он может билдить разные типы результата в зависимости от их наличия. Ну т.е. к конструктору с дефолтными аргументами он сводится только в этом простейшем случае.

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

ну т.е. вот у меня в проекте скажем Spark, там ровно такое:

spark.read.csv()… и дальше разные параметры чтения из CSV, типа разделителя и т.п.
spark.read.jdbc()… и параметры JDBC соединения, совершенно другие
spark.read.xyz()… — и эти обработчики кстати можно загружать динамически, т.е. это runtime плагины. Но те что известны компилятору — на те будет подсказка в IDE.
Вот да, мне тоже только это на ум пришло. Но опять же, для этого лучше использовать билдеры с анонимными функциями, как например здесь
ktor.io/docs/client.html#features
По сути вместо иницализации класса мы вызываем одноименный метод, куда передаем лямбду, которая в свою очередь относится к пространству билдера. Короче сводим функциональную реализацию к декларативной, где вложенности вызовов порождают необходимые пространства.
Ну яж не про реализацию говорил, а скорее про назначение. А реализации да, есть гораздо более приятные, чем тут описана, а уж особенно если на более гибких языках (в груви билдеры тоже сильно удобнее Java).

Жесть какой бейлерплейт и говнокодище, а все потому что именованных аргументов нет...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий