анонимные функции, которые рассматривают вредными? [закрытый]

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

Я думаю, что мы можем все договориться о следующих фактах:

  • человеческий разум не имеет дело больше чем с 7 плюс минус два объекта (закон Miller's)
  • глубокое добавление отступа считают плохой практикой программирования и обычно указывает в вопросах проектирования при расположении с отступом больше чем трех или четырех уровней. Это расширяется на вложенные объекты, и это хорошо представлено в записи Дзэн Python, "Плоской, лучше, чем вложенный".
  • идея наличия имени функции и для ссылки, и для легкой документации задачи, которую это выполняет. Мы знаем или можем ожидать, какая функция, вызванная removeListEntry (), делает. Самодокументирование, код разъединения важен для отладки и удобочитаемости.

В то время как анонимные функции, кажется, очень хорошая функция, ее использование приводит к глубоко вложенному дизайну кода. Код быстр для записи, но трудный читать. Вместо того, чтобы быть вынужденным изобрести именованный контекст для функциональности и сгладить Вашу иерархию вызываемых объектов, это поощряет, "идут глубоко один уровень", продвигая Ваш мозговой стек и быстро переполняя 7 + правило/-2. Подобное понятие выражается в Alan Cooper "О Поверхности", заключение в кавычки свободно "люди не понимает иерархии". Как программисты мы действительно понимаем иерархии, но наша биология все еще ограничивает наше схватывание глубокого вложения.

Я хотел бы услышать Вас по этому вопросу. Анонимные функции нужно считать вредными, очевидный солнечный синтаксический сахар, который мы находим позже, чтобы быть солью или даже крысиным ядом?

CW как нет никакого корректного ответа.

19
задан 3 revs, 2 users 100% 25 December 2009 в 06:22
поделиться

8 ответов

Как мне кажется, проблема, с которой вы сталкиваетесь, это не анонимные функции, а скорее нежелание превращать функциональность в полезные и многократно используемые устройства. Что интересно, так как проще повторно использовать функциональность в языках с первоклассными функциями (и, обязательно, анонимными функциями), чем в языках без.

Если Вы видите много глубоко вложенных анонимных функций в Вашем коде, я бы предположил, что может быть много общей функциональности, которая может быть учтена в именованных функциях более высокого порядка (т.е. функциях, которые берут или возвращают ("строят") другие функции). Даже "простым" превращениям существующих функций следует давать имена, если они используются часто. Это всего лишь принцип DRY

.
16
ответ дан 30 November 2019 в 04:03
поделиться

Анонимные функции более полезны функционально, чем вредные разборчиво. Я думаю, что если хорошо отформатировать код, то проблем не должно быть. У меня нет с этим проблем, и я уверен, что не смогу справиться с 7 элементами, не говоря уже о 7 + 2 :)

.
8
ответ дан 30 November 2019 в 04:03
поделиться

На самом деле, иерархии помогают преодолеть правило 7+/-2 так же, как и ООП. Когда вы пишете или читаете класс, вы читаете его содержимое и ничего из внешнего кода, так что вы имеете дело с относительно небольшой частью сущностей. Когда вы смотрите на иерархии классов, вы не заглядываете внутрь них, то есть опять же имеете дело с небольшим количеством сущностей.

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

Закрытие (или анонимные функции) просто помогает взломать ваш код немного иначе, чем ООП, но на самом деле они не создают никаких иерархий. Они здесь для того, чтобы помочь вам выполнить ваш код в контексте другого блока кода. В Си++ или Яве для этого нужно создать класс, в JavaScript функции достаточно. Конечно, автономный класс легче понять, так как человеку просто легче смотреть на него как на автономный блок. Функция кажется намного меньше по размеру, и мозг иногда думает, что может понять ее И код вокруг нее в то же время, что обычно плохая идея. Но можно научить мозг не делать этого :)

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

.
4
ответ дан 30 November 2019 в 04:03
поделиться

Забавно, что JavaScript позволяет назвать "анонимные" функции:

function f(x) {
   return function add(y) {
        return x+y;
   };
}
3
ответ дан 30 November 2019 в 04:03
поделиться

Я думаю, что закрытие имеет огромные преимущества, которые не следует упускать из виду. Например, Apple использует "blocks" (закрытие для C) с GCD, чтобы обеспечить действительно легкое многопоточность - вам не нужно настраивать контекстные структуры, и вы можете просто ссылаться на переменные по имени, так как они находятся в scope.

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

2
ответ дан 30 November 2019 в 04:03
поделиться

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

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

Что касается java-скрипта, то я думаю, что функции-переменные выглядят довольно уродливо и делают код загроможденным (инкапсулированная функция(...){} строка делает java-скрипт код часто менее читабельным). В качестве примера я отдаю большое предпочтение синтаксису закрытия groovy ('{}' и '->' chars).

.
0
ответ дан 30 November 2019 в 04:03
поделиться

Кто когда-либо приходил к мысли о необходимости привязки функций к идентификаторам, тот оказывал каждому программисту услугу. Если вы никогда не занимались функциональным программированием, и вам не знакомы и не нравятся функции, являющиеся первоклассными значениями, то вы не настоящий программист.

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

.
-2
ответ дан 30 November 2019 в 04:03
поделиться

Если функция не понятна без имени, то имя, вероятно, слишком длинное. Используйте комментарии для объяснения загадочного кода, не полагайтесь на имена.

.
0
ответ дан 30 November 2019 в 04:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: