[Scala] Использование yield в больших проектах
От: avpavlov  
Дата: 24.02.09 16:29
Оценка: -1
Казалось бы, какое отношение величины проекта имеет к 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()? Советы вроде "ты обязан думать головой, чтобы не прострелить себе ногу" на большом проекте не проканают
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.