Groovy: закрытия или методы

Мне нравится Ctrl + M , Ctrl + M . Расшириться/свернуть текущий блок кода.

37
задан Dónal 11 September 2011 в 23:23
поделиться

2 ответа

Я использую замыкания только там, где они мне нужны, т.е. по умолчанию использую методы. Я делаю это потому, что

  • методы проще замыканий. Замыкания имеют делегата, владельца, сохраняющего доступ к переменным, которые были в их локальной области при создании (то, что вы называете «свободными переменными»). По умолчанию вызовы методов внутри замыкания разрешаются:

    1. самим замыканием
    2. владельцем замыкания
    3. делегатом замыкания

Но этот порядок может быть изменен во время выполнения, и делегат замыкания также может быть изменен на любой объект.

Все эти факторы вместе взятые могут сделать код, использующий замыкания, очень сложным для анализа, поэтому, если вам не нужна эта сложность, я предпочитаю устранить ее, используя вместо этого метод.

  • Создается файл .class для каждого закрытия, определенного в Groovy. У меня ровно ноль доказательств в поддержку утверждения о том, что обычный метод более эффективен, чем закрытие, но у меня есть подозрения. По крайней мере, большое количество классов может привести к тому, что у вас закончится пространство памяти PermGen - это часто случалось со мной, пока я не увеличил свое пространство PermGen примерно до 200 МБ

. Я понятия не имею, защищаю ли я практику (использовать методы по умолчанию и закрывать только тогда, когда они вам нужны) широко считается «лучшей практикой», поэтому мне любопытно услышать, что думают другие.

45
ответ дан 27 November 2019 в 04:53
поделиться

Хотя все, что говорит Дон, правда, я не знаю, что все это так важно. Вы можете отменить делегата закрытия, которое может изменить исполнение, но если вы не передаете закрытие (что вы все равно не можете сделать с помощью метода), вам на самом деле не нужно беспокоиться о том, что что-то из этого произойдет. Играть с делегатом - это возможность, а не ответственность.

Что касается возможного падения производительности из файлов дополнительных классов, почему вы используете Groovy, если вы так беспокоитесь о производительности?

По моему мнению, на самом деле это не имеет значения. Если в вашей команде много людей, которые являются старыми разработчиками Java, им наверняка не понравится, когда вы будете использовать замыкания, где это сделает метод. С другой стороны, кто-то, кто свободно владеет Groovy, будет раздражен, если вы засоряете все методы, когда закрытие имеет больший смысл.

tl;dr - Нет никакого жесткого и быстрого правила, вместо этого вам следует хорошо разбираться в коде с учетом его читабельности.

.
6
ответ дан 27 November 2019 в 04:53
поделиться