Почему я хочу повторно реализовать ленивый? - программирование
Подтвердить что ты не робот

Почему я хочу повторно реализовать ленивый?

Я читал раздел Lazyness [sic] на странице Эффективный Scala Twitter, в который включено это предложение (акцент мой):

Используйте для этой цели ленивые поля [вычисления и кэширование значений по запросу], , но избегайте использования ленивости, когда ленивость требуется по семантике. В этих случаях лучше быть явным, поскольку он делает модель затрат явной, а побочные эффекты можно контролировать более точно.

Я не понимаю, почему они заявили бы это. Почему бы лучше избегать использования ключевого слова lazy для случаев, когда семантика требует лени (что означает, что это необходимо для правильности в вашей программе, а не просто для ее использования в качестве оптимизации). Я не вижу, как писать собственный ленивый код инициализации сделает тот факт, что лень требуется более ясно, чем использование ключевого слова lazy, встроенного в язык! Я знаю, что некоторые дополнительные накладные расходы связаны с созданием полей lazy потокобезопасными, но я не думаю, что они здесь...

Есть ли какая-то скрытая заслуга в этом руководстве по использованию lazy, который я полностью потерял, или мне лучше просто игнорировать это предложение?

4b9b3361

Ответ 1

Изменить: теперь я больше не уверен, что совет , поэтому примите мои пункты ниже с куском соли, когда речь идет о критическом совете Twitter. (Но я даю свой собственный совет ниже.)

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

Тем не менее, я думаю, что хуже быть явным, но вам нужно быть дисциплинированным. Если вы не можете рассчитывать ни на документацию, ни на дисциплину, возможно, лучше просто полностью ее избежать.