Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Новые веяния / 25 сообщений из 79, страница 1 из 4
16.07.2020, 10:35
    #39980292
xerxf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
Последнее время делаю довольно много code review и замечаю такую вещь - пошло прямо таки какое то повальное увлечение переусложнением кода. Что это - не понимание сути и попытка впихнуть везде, где только можно свежеполученные знания или реальная необходимость, которой я никак не могу проникнуться?
Как пример:
Есть некая функция. которая что то там делает, но основная логика скрыта в вызываемой библиотечной функции. Эта библиотечная функция синхронизированна. И возвращает список. причём эта библиотечная функция в классе-синглтоне.
По логике программы эта функция должна вызываться в цикле несколько раз с разными параметрами. Программист оборачивает функцию в Future, внутри результаты работы библиотечной функции пишет в потокобезопасную коллекцию(причём над коллекцией он тоже сделал обёртку-синглтон), и все эти фьчерсы засылает в CompletableFuture.allOf. А по whenComplete выбирает данные из потокобезопасной коллекции и что то с ними делает. Вопрос - а зачем так сложно? всё равно же всё споткнётся на синхронизированном методе ( а там кроме него по сути и нет ничего) и будет выполняться фактически последовательно, без всякого парралелилизма?
Или ещё - функция возвращает строку. Эта строка передаётся в другую функцию. Другая функция этой строке что то там ищет. Всё. Зачем первая функция строку оборачивает в Option ? Не, я всё понимаю - функциональщина, защита от null и всё такое.. Но как бы любые лишние телодижения - это лишние тормоза и каждая лишняя строчка - это потенциальный источник проблем (все мы человеки - чем больше напишешь, тем больше вероятость ошибки) зачем это всё? особенно если первая функция гарантированно возвращает не null
Или ещё - есть некие действия, которые нужно делать в отдельном потоке. Данные для них приходят периодичеки. Для каждой приходящей порции данных создаётся свой поток, в нём по каким то условиям стартуют ещё потоки, там создаются какие то фьючерсы, а потом это всё долго и мучительно синхронизируется.... Но там всё что надо - это чтобы данные обрабатывались НЕ в основном потоке. И абсолютно наплевать, в одном потоке они обработаются или в 10.. После того, как все эти сложности повыкидывал - необходимость в синхронизации вообще отпала. и работать всё стало в разы стабильнее. Опять таки - что это было ? непонимание потоков автором или я опять что то не понимаю в современном стиле программирования на java ? А то я когда то на плюсах начинал - может такое отношение ко всем этим наворотам это просто издержки моего прошлого ?
...
Рейтинг: 0 / 0
16.07.2020, 11:05
    #39980309
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
xerxf,

чет у вас в достаточно тяжелой форме все проходит. Я только замечал повальное стремление заменить все подряд на java.util.function.*, чтобы потом невозможно было найти реализацию. А так ваш коллега скорее всего имеет опыт разработки на JS - там только так и пишут.
...
Рейтинг: 0 / 0
16.07.2020, 11:11
    #39980312
xerxf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
Андрей Панфилов,

Да, реализацию найти тоже проблематично. Обёртка над обёрткой, а там функциональщина..
Просто ыглядит красиво, солидно, модно, стильно, молодёжно. Я бы тупо написал вызов функции в цикле с накоплением результата. А там накручено - выглядит уж больно солидно
Я писал на js - стиль может и похож, но не помню бесмысленного на мой взгляд переусложнения.
Я пытаюсь понять - оно бессмысленно только на мой взгляд или одно из двух...
...
Рейтинг: 0 / 0
16.07.2020, 11:45
    #39980344
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
xerxf
Последнее время делаю довольно много code review и замечаю такую вещь - пошло прямо таки какое то повальное увлечение переусложнением кода.


Как начал программировать не один так и замечаю.
Не от языка это зависит. Да и не новое это.
Просто умение писать кратко и понятно- это нечастое и очень ценное умение.
...
Рейтинг: 0 / 0
16.07.2020, 12:11
    #39980368
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
Это пока всего лишь твои слова, которым мы можем либо доверять либо нет. Тут говорится 50\50, не видя кода сложно сказать прав ты или нет, всегда есть вероятность что ты реально чего-то не понимаешь. Но для этого и есть code review - чтобы задавать вопросы а почему так а не эдак? Странным выглядит твой вопрос тут а не в PR.
Что касается вопросов
1) А вдруг реализация библиотечной функции изменится, либо вы ее вообще выкинете и перепишете на свое, забыв про синхронизацию?
2) А может все-таки там нулл возможен? Либо вторая функция используется в нескольких местах, и в каком то месте туда реально может придти опшионал?
3) Ну тут вообще нифига непонятно, ты тесты многопоточные написал что реализация корректна до твоих изменений и после?
...
Рейтинг: 0 / 0
16.07.2020, 12:46
    #39980394
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
забыл ник
Это пока всего лишь твои слова, которым мы можем либо доверять либо нет. Тут говорится 50\50

+1
...
Рейтинг: 0 / 0
16.07.2020, 13:18
    #39980417
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
xerxf
Андрей Панфилов,

Да, реализацию найти тоже проблематично. Обёртка над обёрткой, а там функциональщина..
Просто ыглядит красиво, солидно, модно, стильно, молодёжно. Я бы тупо написал вызов функции в цикле с накоплением результата. А там накручено - выглядит уж больно солидно
Я писал на js - стиль может и похож, но не помню бесмысленного на мой взгляд переусложнения.
Я пытаюсь понять - оно бессмысленно только на мой взгляд или одно из двух...

вызов функции в цикле с накоплением. какой то прошлый век )) функциональщина и проще и понятнее ведь? в разумных пределах разумеется.
...
Рейтинг: 0 / 0
16.07.2020, 13:20
    #39980420
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
хотя на ней все шизанулись. смотрю ваки скалы. всем подавай катс и зио. причем по зио опыт 3 года минимум. Типа если ты не пишешь на зио - ты ничтожество. и да. 3 года. не меньше. с учетом того что этому "фреймворку" год от силы. всем подавай самое новое.
...
Рейтинг: 0 / 0
16.07.2020, 13:22
    #39980422
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
забыл ник

А вдруг реализация библиотечной функции изменится, либо вы ее вообще выкинете и перепишете на свое, забыв про синхронизацию?

Аргумент просто пи....ц какой-то
Если бы, да кабы
А если в функции вызовут System.exec( "halt"); ? Что делать? Все пропало!

Чувствую, что CompletableFuture там недостаточно. Код говно. Обязательно нужно не забыть обернуть еще в HaltFuture, OutOfMemoryFuture и в другие такие же полезные классы. Только этим путем проект еще можно спасти!
...
Рейтинг: 0 / 0
16.07.2020, 13:47
    #39980439
nnalogovik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
забыл ник

1) А вдруг реализация библиотечной функции изменится, либо вы ее вообще выкинете и перепишете на свое, забыв про синхронизацию?


А вдруг в проект придет сумасшедший блатной кодер - который удалит весь код
...
Рейтинг: 0 / 0
16.07.2020, 14:00
    #39980457
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
и пошел спор о сферических конях в вакууме. пусть ТС запостит код, тогда и поговорим о вариантах
...
Рейтинг: 0 / 0
16.07.2020, 14:52
    #39980489
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
Появились конструкции, которые могут помочь сделать код ассинхронным, многопоточным, быстрым и более устойчивым к ошибкам.
Но автоматически, сам собой, код все равно таким не станет . Для ассинхроннсоти все равно нужно продумывать, как осмысленно разруливать коллезии. Для ускорения все равно нужно профайлить и разбираться где и почему затыки.

А в реальной жизни происходит подмена понятий, люди начинают считать, что если они запихнут эти конструкции куда нужно и куда не нужно, то код станет таким сам собой , волшебным образом.
Если у нас в коде CompletableFuture - значит, sic!, код ассинхронный, многопоточный и быстрый по определение!
Если у нас в коде Option - значит ошибок у нас нет! мы же все пишем в соответствии с мировыми практиками.

Если весь проект набит CompletableFuture, Option, но почему-то затыкается на 600 инсертах в секунду, то это PostgreSQL виноват ))) и нужно добавить ака, кафку и редиса для большей асинхронности и скорости )))
/тут смайлики! все совпадения с какими нибудь темами на форуме совершенно случайны/
...
Рейтинг: 0 / 0
16.07.2020, 15:33
    #39980511
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
Leonid Kudryavtsev
забыл ник

А вдруг реализация библиотечной функции изменится, либо вы ее вообще выкинете и перепишете на свое, забыв про синхронизацию?

Аргумент просто пи....ц какой-то
Если бы, да кабы
А если в функции вызовут System.exec( "halt"); ? Что делать? Все пропало!

Чувствую, что CompletableFuture там недостаточно. Код говно. Обязательно нужно не забыть обернуть еще в HaltFuture, OutOfMemoryFuture и в другие такие же полезные классы. Только этим путем проект еще можно спасти!

Аргумент в том, что мы не знаем код, что не мешает делать выводы о праивльности\неправильности. Я конечно не против ваших фантазий, только при чем они к тому что я написал?
...
Рейтинг: 0 / 0
16.07.2020, 15:35
    #39980512
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
nnalogovik
забыл ник

1) А вдруг реализация библиотечной функции изменится, либо вы ее вообще выкинете и перепишете на свое, забыв про синхронизацию?


А вдруг в проект придет сумасшедший блатной кодер - который удалит весь код

Складывается впечатление что я должен обьяснить код, который не писал. Наверное ты видел тот код?
...
Рейтинг: 0 / 0
16.07.2020, 15:39
    #39980513
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
Leonid Kudryavtsev
Появились конструкции, которые могут помочь сделать код ассинхронным, многопоточным, быстрым и более устойчивым к ошибкам.
Но автоматически, сам собой, код все равно таким не станет . Для ассинхроннсоти все равно нужно продумывать, как осмысленно разруливать коллезии. Для ускорения все равно нужно профайлить и разбираться где и почему затыки.

А в реальной жизни происходит подмена понятий, люди начинают считать, что если они запихнут эти конструкции куда нужно и куда не нужно, то код станет таким сам собой , волшебным образом.
Если у нас в коде CompletableFuture - значит, sic!, код ассинхронный, многопоточный и быстрый по определение!
Если у нас в коде Option - значит ошибок у нас нет! мы же все пишем в соответствии с мировыми практиками.

Если весь проект набит CompletableFuture, Option, но почему-то затыкается на 600 инсертах в секунду, то это PostgreSQL виноват ))) и нужно добавить ака, кафку и редиса для большей асинхронности и скорости )))
/тут смайлики! все совпадения с какими нибудь темами на форуме совершенно случайны/

Это все правильно. Вопрос в том, какая ситуация соотвествует действительности
1) Все написано правильно, просто ТС в силу отсутствия знаний не понимает почему написано именно так и делает поспешные выводы
2) Все действительно плохо и код ужасный.
Не видя кода отличить 1 от 2 не имеется практической возможности.
Можно конечно дальше сотрясать форум возмущением, только это имеет мало смысла
...
Рейтинг: 0 / 0
16.07.2020, 15:54
    #39980522
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
Даже имея код, делать какие-то выводы нельзя

В команде должен быть обшепринятый стиль работы более-менее удобный, понятный и принятый всеми (или общепринятый пофигизм, что тоже является стилем)

С одной стороны:
Если кто-то новый пришел в команду и еще не вписался в данный стиль - на коде review его должны поправить
Если он так и не смог вписаться, а его коллегам такой стиль удобен - он будет создавать проблемы окружающим, рано или поздно его пошлют нафиг )))

С другой стороны:
Если правила в данной компании не устраивают, будь это зарплата, качество кофе и печенюшек в офисе, дресс код или идиотские требования к коду - нужно искать новое место работы
Можно попытаться быть д'Артаньяном и что-то менять в мире вокруг себя, можно тихо смириться и попытаться быть как все, можно поискать другое место.

IMHO & AFAIK
...
Рейтинг: 0 / 0
16.07.2020, 16:34
    #39980545
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
Zzz79
на счет этих Completeble фьюч согласен - везде напичкано
на код смотришь ничего не понятно - по полдня тратишь на поиски правды)

Ну это эпичный пример неуклюжей попытки пропихнуть функциональный концепт из скалы в java, не понимая что лучше чем портировать часть решения - не портировать ничего. С опшинал примерно тоже самое.
А теперь попробую рассказать откуда у этого все ноги растут. Все эти Completable Future - это по сути колббаки или continuation. В скале и ФП есть такое понятие как монада. И вот там Future образует монаду(контекст continuation) которым легко и удобно пользоваться, который по сути всю асинхронность и сложность коллбэков превращает в зрительно императивный код.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
val getEmployee(id: Int) = Future(DB.load)
val getDepartment(emp: Employee) = Future(Db.load)
val getBonus(dep: department) = Future(DB.load)

val result: Future[Bonus] = for { // тут мы как бы входим в контекст Future, то есть убираем этот враппер
  e <- getEmployee(1) -- тут работаем с энтити типами, никаких future
  d <- getDepartment(e)
  b <- getBonus(d)
} yield b //Обратно запаковываем во future


Тут все элегантно и красиво в отличие от java-ского
future.thenAsync().orElseThrow бла бла
...
Рейтинг: 0 / 0
16.07.2020, 18:49
    #39980596
nnalogovik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
забыл ник
nnalogovik
пропущено...


А вдруг в проект придет сумасшедший блатной кодер - который удалит весь код

Складывается впечатление что я должен обьяснить код, который не писал. Наверное ты видел тот код?


Да не меня просто всегда впечатляли придирки к коду типа


"А что если придет джун - и не поймет тут эту функцию, напишет вот так и тогда все ляжет"
...
Рейтинг: 0 / 0
16.07.2020, 18:57
    #39980598
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
nnalogovik
забыл ник
пропущено...

Складывается впечатление что я должен обьяснить код, который не писал. Наверное ты видел тот код?


Да не меня просто всегда впечатляли придирки к коду типа


"А что если придет джун - и не поймет тут эту функцию, напишет вот так и тогда все ляжет"


Вообще это цель любого API - чтобы тот кто будет использовать его, с наименьшей вероятностью допустил ошибку. Для этого на разных уровнях абстракции возможно поддерживать системные инварианты. Как например, что ни при каких раскладах система должна быть потокобезопасной. Кто знает как там было - может система была кастомная с кучей кода, а потом появилась либа которая делает тоже самое, только синхронизация у нее внутри, ну вот старый код выкинули а синхронизацию на всякий оставили(вдруг появится еще какая либа еще) и т.д и т.п. Так что да, аргумент вдруг придет джун он иногда имеет смысл
...
Рейтинг: 0 / 0
16.07.2020, 19:07
    #39980603
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
как у нас: "а вдруг придет кто-то без знания HQL, давайте писать все запросы в Hibernate на Criteria-API". Никто без знания SQL/HQL так пока и не пришел, а ежики колются и пишут годами во всех проектах строго на Criteria-API :(
...
Рейтинг: 0 / 0
16.07.2020, 19:19
    #39980608
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
chpasha
как у нас: "а вдруг придет кто-то без знания HQL, давайте писать все запросы в Hibernate на Criteria-API". Никто без знания SQL/HQL так пока и не пришел, а ежики колются и пишут годами во всех проектах строго на Criteria-API :(

Ну тут надо все взвешивать. Если бизнес выиграет от переписывания(так как снизится цена поддержки и увеличится быстрота написания кода) и риск небольшой - то надо планировать таск и делать. Другое дело, что если риск того что система еб..тся и фирма потеряет миллионы долларов хотя бы чуть-чуть больше нуля - то нет и не может быть никакого разговора о переписывании.
...
Рейтинг: 0 / 0
16.07.2020, 19:50
    #39980621
nnalogovik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
забыл ник
nnalogovik
пропущено...


Да не меня просто всегда впечатляли придирки к коду типа


"А что если придет джун - и не поймет тут эту функцию, напишет вот так и тогда все ляжет"


Вообще это цель любого API - чтобы тот кто будет использовать его, с наименьшей вероятностью допустил ошибку. Для этого на разных уровнях абстракции возможно поддерживать системные инварианты. Как например, что ни при каких раскладах система должна быть потокобезопасной. Кто знает как там было - может система была кастомная с кучей кода, а потом появилась либа которая делает тоже самое, только синхронизация у нее внутри, ну вот старый код выкинули а синхронизацию на всякий оставили(вдруг появится еще какая либа еще) и т.д и т.п. Так что да, аргумент вдруг придет джун он иногда имеет смысл



Все это от лукавого и ну очень натянуто

Джун если тупой - он и в самом хорошем API грабли найдет и на них наступит

А если умный - и с проблемным разберется


Не нужно на джуна перекладывать свои страхи и придирки
...
Рейтинг: 0 / 0
16.07.2020, 23:31
    #39980684
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
chpasha
как у нас: "а вдруг придет кто-то без знания HQL, давайте писать все запросы в Hibernate на Criteria-API". Никто без знания SQL/HQL так пока и не пришел, а ежики колются и пишут годами во всех проектах строго на Criteria-API :(

Имхо критериа апи гораздо сложнее и к чтению и к пониманию нежели хкл или жпкл. Те хоть на скуль издали одним глазом похожи.
...
Рейтинг: 0 / 0
16.07.2020, 23:33
    #39980685
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
забыл ник
Zzz79
на счет этих Completeble фьюч согласен - везде напичкано
на код смотришь ничего не понятно - по полдня тратишь на поиски правды)

Ну это эпичный пример неуклюжей попытки пропихнуть функциональный концепт из скалы в java, не понимая что лучше чем портировать часть решения - не портировать ничего. С опшинал примерно тоже самое.
А теперь попробую рассказать откуда у этого все ноги растут. Все эти Completable Future - это по сути колббаки или continuation. В скале и ФП есть такое понятие как монада. И вот там Future образует монаду(контекст continuation) которым легко и удобно пользоваться, который по сути всю асинхронность и сложность коллбэков превращает в зрительно императивный код.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
val getEmployee(id: Int) = Future(DB.load)
val getDepartment(emp: Employee) = Future(Db.load)
val getBonus(dep: department) = Future(DB.load)

val result: Future[Bonus] = for { // тут мы как бы входим в контекст Future, то есть убираем этот враппер
  e <- getEmployee(1) -- тут работаем с энтити типами, никаких future
  d <- getDepartment(e)
  b <- getBonus(d)
} yield b //Обратно запаковываем во future


Тут все элегантно и красиво в отличие от java-ского
future.thenAsync().orElseThrow бла бла

В скалке так же можешь писать мапами флатмапами. Мало будет отличаться от джавы. Но джава да уже морально устарела. Насчет читаемости форкомпрехеншена это тоже имхо субъективное мироощущение думая что они более элегантные.
...
Рейтинг: 0 / 0
17.07.2020, 09:17
    #39980761
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новые веяния
andreykaT
Имхо критериа апи гораздо сложнее и к чтению и к пониманию нежели хкл или жпкл. Те хоть на скуль издали одним глазом похожи.

имхо тоже, особенно когда начинаются join-ы и подзапросы. так это я еще пол истории рассказал, на самом деле это даже не Criteria-API, а нечто критериа-подобное, т.е. велосипед по сути, в котором до 5 хибера даже left-join не работали. паноптикум короче
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Новые веяния / 25 сообщений из 79, страница 1 из 4
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]