Size: a a a

2020 December 07

AV

Alexei Vinogradov in pro.jvm
@Tagir_Valeev

А стримы типа:

a.stream()
.filter(FilterClass::longMethodWithbunchOfIfs)
.map(MapClass::evenMoreLogicHere)
.collect(...)

Это нормально или зло?
источник

C

Cargeh in pro.jvm
Alexei Vinogradov
@Tagir_Valeev

А стримы типа:

a.stream()
.filter(FilterClass::longMethodWithbunchOfIfs)
.map(MapClass::evenMoreLogicHere)
.collect(...)

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

DC

Denis Chikanov in pro.jvm
Alexei Vinogradov
@Tagir_Valeev

А стримы типа:

a.stream()
.filter(FilterClass::longMethodWithbunchOfIfs)
.map(MapClass::evenMoreLogicHere)
.collect(...)

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

AV

Alexei Vinogradov in pro.jvm
Cargeh
а почему это должно быть злом? и какие альтернативы?
Ну без стримов, по дедовски, циклы, приватные методы и тд
источник

AV

Alexei Vinogradov in pro.jvm
Denis Chikanov
Это не выглядит, как "автоматически" зло,  но, возможно, сложные методы лучше разбить на несколько последовательно вызываемых.
Ну допустим они разбиты
источник

DC

Denis Chikanov in pro.jvm
Alexei Vinogradov
Ну без стримов, по дедовски, циклы, приватные методы и тд
А чем такая альтернатива лучше?
источник

AV

Alexei Vinogradov in pro.jvm
Denis Chikanov
А чем такая альтернатива лучше?
Не знаю. Инстинктивно не доверяю конструкции стрима, если слишком сложные правила обработки. Как тестировать, как дебажить?
источник

C

Cargeh in pro.jvm
Alexei Vinogradov
Не знаю. Инстинктивно не доверяю конструкции стрима, если слишком сложные правила обработки. Как тестировать, как дебажить?
ну, выше с одним фильтром и мапом - это ж не "сложные правила обработки", не?
источник

DC

Denis Chikanov in pro.jvm
Alexei Vinogradov
Не знаю. Инстинктивно не доверяю конструкции стрима, если слишком сложные правила обработки. Как тестировать, как дебажить?
Так же, как и аналогичную конструкцию с циклом, что не так?
источник

AV

Alexei Vinogradov in pro.jvm
Denis Chikanov
Так же, как и аналогичную конструкцию с циклом, что не так?
Ну может быть я стримы тестировать не умею. Неочевидно, когда любой тест даёт 100% покрытия понимать, что пропущено.
источник

DC

Denis Chikanov in pro.jvm
Alexei Vinogradov
Не знаю. Инстинктивно не доверяю конструкции стрима, если слишком сложные правила обработки. Как тестировать, как дебажить?
>Инстинктивно не доверяю конструкции стрима, если
Звучит, как проблема не с кодом, а с мышлением, no offense
источник

Э

Эд in pro.jvm
Alexei Vinogradov
Не знаю. Инстинктивно не доверяю конструкции стрима, если слишком сложные правила обработки. Как тестировать, как дебажить?
для удобства тестирования лучше ссылки на методы объекта юзать
источник

DC

Denis Chikanov in pro.jvm
Alexei Vinogradov
Ну может быть я стримы тестировать не умею. Неочевидно, когда любой тест даёт 100% покрытия понимать, что пропущено.
Так стримы не надо тестировать, их тестируют разработчики JVM. Надо поведение программы тестировать.
А если есть метод, принимающий, допустим, коллекцию, над элементами которой проводятся операции или через стрим, или через цикл, то тестироваться он будет совершенно одинаково, потому что интерфейс метода ни хрена не меняется от того, стрим там или foreach-loop внутри.
источник

AV

Alexei Vinogradov in pro.jvm
Denis Chikanov
>Инстинктивно не доверяю конструкции стрима, если
Звучит, как проблема не с кодом, а с мышлением, no offense
Может быть. Поэтому и хочу понять, что не так - может недоверие пропадёт.
источник

AK

Alexander Komarov in pro.jvm
Alexei Vinogradov
Не знаю. Инстинктивно не доверяю конструкции стрима, если слишком сложные правила обработки. Как тестировать, как дебажить?
Эээ. Юнитами ? С различными корнер-кейсами? Чем принципиально тестирование метода со стримами отличается от тестирования метода без стримов?
источник

AK

Alexander Komarov in pro.jvm
так-то можно понапихать логику в
for ( <тут дофига всего>
и сказать что говно ваши циклы. неочевидно все и нетестабельно
источник

AV

Alexei Vinogradov in pro.jvm
Denis Chikanov
Так стримы не надо тестировать, их тестируют разработчики JVM. Надо поведение программы тестировать.
А если есть метод, принимающий, допустим, коллекцию, над элементами которой проводятся операции или через стрим, или через цикл, то тестироваться он будет совершенно одинаково, потому что интерфейс метода ни хрена не меняется от того, стрим там или foreach-loop внутри.
Ну не сами стримы. В принципе я представляю так: стрим преобразует множество А во множество В. И в принципе у стрима частенько бывает как минимум несколько различных результатов трансформации. Тестировщицким языком - входные данные можно разбить на классы эквивалентности, где для каждого класса есть своя "особенность" при трансформации. Или с позиции написания тестов - "для каждого из классов эквивалентности нужен отдельный тест".

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

А в стриме - любой один тест покрывает 100% кода. И как искать пропущенные ветви?
источник

T

Tagir in pro.jvm
Alexei Vinogradov
@Tagir_Valeev

А стримы типа:

a.stream()
.filter(FilterClass::longMethodWithbunchOfIfs)
.map(MapClass::evenMoreLogicHere)
.collect(...)

Это нормально или зло?
Почему нет? Нормально
источник

VP

Vladimir Petrakovich in pro.jvm
Alexei Vinogradov
Ну не сами стримы. В принципе я представляю так: стрим преобразует множество А во множество В. И в принципе у стрима частенько бывает как минимум несколько различных результатов трансформации. Тестировщицким языком - входные данные можно разбить на классы эквивалентности, где для каждого класса есть своя "особенность" при трансформации. Или с позиции написания тестов - "для каждого из классов эквивалентности нужен отдельный тест".

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

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

DC

Denis Chikanov in pro.jvm
Alexei Vinogradov
Ну не сами стримы. В принципе я представляю так: стрим преобразует множество А во множество В. И в принципе у стрима частенько бывает как минимум несколько различных результатов трансформации. Тестировщицким языком - входные данные можно разбить на классы эквивалентности, где для каждого класса есть своя "особенность" при трансформации. Или с позиции написания тестов - "для каждого из классов эквивалентности нужен отдельный тест".

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

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