170 похожих чатов

@Tagir_Valeev А стримы типа: a.stream() .filter(FilterClass::longMethodWithbunchOfIfs) .map(MapClass::evenMoreLogicHere) .collect(...) Это нормально или зло?

22 ответов

11 просмотров

а почему это должно быть злом? и какие альтернативы?

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

Alexei-Vinogradov Автор вопроса
Cargeh
а почему это должно быть злом? и какие альтернатив...

Ну без стримов, по дедовски, циклы, приватные методы и тд

Alexei-Vinogradov Автор вопроса
Denis Chikanov
А чем такая альтернатива лучше?

Не знаю. Инстинктивно не доверяю конструкции стрима, если слишком сложные правила обработки. Как тестировать, как дебажить?

Alexei Vinogradov
Не знаю. Инстинктивно не доверяю конструкции стрим...

ну, выше с одним фильтром и мапом - это ж не "сложные правила обработки", не?

Alexei Vinogradov
Не знаю. Инстинктивно не доверяю конструкции стрим...

Так же, как и аналогичную конструкцию с циклом, что не так?

Alexei-Vinogradov Автор вопроса
Denis Chikanov
Так же, как и аналогичную конструкцию с циклом, чт...

Ну может быть я стримы тестировать не умею. Неочевидно, когда любой тест даёт 100% покрытия понимать, что пропущено.

Alexei Vinogradov
Не знаю. Инстинктивно не доверяю конструкции стрим...

>Инстинктивно не доверяю конструкции стрима, если Звучит, как проблема не с кодом, а с мышлением, no offense

Alexei Vinogradov
Не знаю. Инстинктивно не доверяю конструкции стрим...

для удобства тестирования лучше ссылки на методы объекта юзать

Alexei Vinogradov
Ну может быть я стримы тестировать не умею. Неочев...

Так стримы не надо тестировать, их тестируют разработчики JVM. Надо поведение программы тестировать. А если есть метод, принимающий, допустим, коллекцию, над элементами которой проводятся операции или через стрим, или через цикл, то тестироваться он будет совершенно одинаково, потому что интерфейс метода ни хрена не меняется от того, стрим там или foreach-loop внутри.

Alexei-Vinogradov Автор вопроса
Denis Chikanov
>Инстинктивно не доверяю конструкции стрима, если ...

Может быть. Поэтому и хочу понять, что не так - может недоверие пропадёт.

Alexei Vinogradov
Не знаю. Инстинктивно не доверяю конструкции стрим...

Эээ. Юнитами ? С различными корнер-кейсами? Чем принципиально тестирование метода со стримами отличается от тестирования метода без стримов?

Alexei-Vinogradov Автор вопроса
Denis Chikanov
Так стримы не надо тестировать, их тестируют разра...

Ну не сами стримы. В принципе я представляю так: стрим преобразует множество А во множество В. И в принципе у стрима частенько бывает как минимум несколько различных результатов трансформации. Тестировщицким языком - входные данные можно разбить на классы эквивалентности, где для каждого класса есть своя "особенность" при трансформации. Или с позиции написания тестов - "для каждого из классов эквивалентности нужен отдельный тест". В мире без стримов, мы выбираем представителей, пишем по 1 тесту на каждого, и смотрим на покрытие. Если остались непокрытые места - значит что-то не учли. Если избыточное покрытие - возможно код можно оптимизировать. В общем какие-то есть метрики и признаки. А в стриме - любой один тест покрывает 100% кода. И как искать пропущенные ветви?

Почему нет? Нормально

Alexei Vinogradov
Ну не сами стримы. В принципе я представляю так: с...

Не очень понятно, как стримы влияют на покрытие вашего кода

Alexei Vinogradov
Ну не сами стримы. В принципе я представляю так: с...

А как вы ищете пропущенные ветви в методе, аналогично тому, что выше, где будет for (Element element: collection) { if (longMethodWithbunchOfIfs(element)) { addToNewList(evenMoreLogicHere(element)) } } ? Наличие-отсутствие стрима само по себе на ветвление кода не влияет ровно никак.

Alexei Vinogradov
Не знаю. Инстинктивно не доверяю конструкции стрим...

мне помогло рассматривать это в другом разрезе, не как циклы, а как потоки сообщений которые обрабатываются обработчиками, наподобие EIP https://www.enterpriseintegrationpatterns.com/patterns/messaging/

Alexei-Vinogradov Автор вопроса
Denis Chikanov
А как вы ищете пропущенные ветви в методе, аналоги...

Чуть попозже нарисую пример, пока на пальцах a.stream() .filter() .collect() Покрывается одним тестом for (x in a){ If() Else() } Покрывается двумя.

Alexei Vinogradov
Чуть попозже нарисую пример, пока на пальцах a.st...

Потому что у вас первый и второй вариант не эквивалентны, у вас нет else-ветки поведения в стримах в таком варианте.

Alexei Vinogradov
Чуть попозже нарисую пример, пока на пальцах a.st...

Вот про это я и говорил, что явный if уходит из вашего кода. Но это не отличается от многих других крайних случаев, которые не так очевидны, как if.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта