LINUX.ORG.RU

Меня печалит жава

 ,


0

4

Наткнулся на такой код в спринге:

PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
map.from(settings::readTimeout).asInt(Duration::toMillis).to(this::setReadTimeout);
map.from(settings::connectTimeout).asInt(Duration::toMillis).to(this::setConnectTimeout);

Пришлось его скопипастить, потому, что при всей его гибкости как-то не очень он гибкий оказался там, где мне надо. Долго вкуривал, что тут написано, в итоге переписал по-простому:

if (settings.readTimeout() != null) {
  setReadTimeout(settings.readTimeout());
}
if (settings.connectTimeout() != null) {
  setConnectTimeout(settings.connectTimeout());
}

Да, я понимаю, что тут два раза вызывается геттер settings.xxx и это чисто теоретически может привести к багу… Но по-моему это мелочь. А то, что код нечитаемый получился сверху, это вообще не мелочь.

Что за моду притащили в жаву? Никогда же такого не было, писали просто и понятно. Кому это надо? Вы тоже выпендриваетесь, пытаясь в одну строчку засунуть побольше токенов?

★★★

Ответ на: комментарий от Nervous

Надо шире смотреть, чем на этот хелловорлд.

Method chaining итп(напр лямбда лямбдой погоняет) это попытка сделать некий DSL, специфичный для API конкретного фреймворка. Выглядит это как говно, но по-другому сделать то нельзя.

Та же самая история например с C#, в частности WPF или Avalonia, в котором есть DependencyProperty/ReactiveProperty. Которые несут бойлерплейт и сракотан. В PostSharp в принципе, они абстрагируются синтаксически, но там примерно те же проблемы что с Lombok.

В частности поэтому в дотнете или в жабе так любят XML/XAML/JSON и так далее - потому что в рамках самих языков, DSL практически нереален, и будет выглядеть вон как в примере у ТС. Но тут неизвестно что хуже, потому что внешний DSL на этом вот, это же неотлаживаемая херота, итд.

lovesan ★★
()
Ответ на: комментарий от Nervous

Но в первом надо ещё и разучивать очередной неповторимый и уникальный интерфейс очередного неповторимого и уникального PropertyMapper.

Как бы разработчики Spring в первую очередь его для себя сделали, и сами же им в своём продукте пользуются.

На кой они тут нужны-то — достать из мапы два ключа и передать их на вход двум функциям?

Основной смысл — отсекать null. Здесь уже предложили варианты: или ифом в стри строки или городить Optional с лямбдой.

static_lab ★★★★★
()
Ответ на: комментарий от FishHook

давайте посмотрим в пример кода без ООП

Чувак, это же цюлиньсяо. Меня его манера изъясняться на русском языке-то не перестаёт мрачно удивлять, не то что на петоне.

def chekMEK

Ухх!

nm, unk = buildDSmakingCake

Эх харрашо!

def run_run

Бегите, глупцы (тм).

Nervous ★★★★★
()

тут два раза вызывается геттер settings.xxx и это чисто теоретически может привести к багу

А что мешает результат в переменную положить?

Nervous ★★★★★
()
Ответ на: комментарий от lovesan

Ловите наркомана

А если подумать? Не разочаровывайте меня, снова.

Чтобы понять что там происходит, представьте null, подумайте какие проверки и преобразования выпадают на его жизненном пути в этом куске кода, почувствуйте что с ним происходит, будьте null-ом, Lovesan!

(вот это по-наркомански, почувствуйте разницу)

Obezyan
()

если я верно понял что там вообще написано… такого рода штуки я лично в с++ пишу без наворотов

типа

int some_var = settings.get_int("setting_name", default_value);

то есть если сеттинги не находят сеттинг типа integer с таким именем, он просто возвращает default_value.

не надо себе жизнь усложнять-то.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)

Вы тоже выпендриваетесь, пытаясь в одну строчку засунуть побольше токенов?

У меня такое было года в 23, писал много мелких библиотечных функций, чтобы собственно прикладной код был экстремально коротким. Если паттерн из 2-3 строчек повторялся несколько раз, это уже было поводом засунуть его куда-нибудь в отдельную функцию, пусть даже с кучей параметров.

Потом я повзрослел, и читаемость кода у меня вышла на первое место. Прикольно, если, как ты пишешь, разработчики Java движутся в обратную сторону.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)