Казалось бы, какое отношение величины проекта имеет к yield?
Поясню: допустим есть некоторая функция, которая порождает список из 10 случайных чисел
def generate = for (i <- 1 to 10) yield Math.random
допустим я хочу узнать минимум
val sequence = generate
val min = (1000000d /: sequence)((m,v) => if (m > v) v else m)
а теперь максимум
val max= (0d /: sequence)((m,v) => if (m < v) v else m)
а теперь распечатать
println (sequence)
println (min)
println (max)
В итоге получаем что sequence генерировалась 3 раза, потому что реально это итератор, который передёргивается при каждом новом использовании. Понятно, что можно это поведение можно починить
val sequence = generate.toList
или даже так
def generate = (for (i <- 1 to 10) yield Math.random).toList
К сожалению, ни компилятор ни ИДЕ не подсказывают, что я коллекцию сгенерированную "йелдом" использую больше чем один раз. Соответственно, рано или поздно, когда над проектом работает больше чем один человек, в результате какого-либо рефакторинга или просто по недосмотру, эти грабли больно стукнут по лбу. Конечно, мой случай легко выловить на этапе юнит-тестирования. Но если коллекция более менее статичная, то это может долго работать правильно (с пониженной поизводительностью), а грохнется уже на продакшн.
Как тут быть — запретить использование "йелда"? Или договорится помечать методы, генерирующие что-нибудь с помощью "йелда" специальным префиксом/постфиксом, вроде yieldSomething()? Советы вроде "ты обязан думать головой, чтобы не прострелить себе ногу" на большом проекте не проканают