Когда это - слишком много “действия лямбды”?

Кажется, были попытки наличия подобной СЛИЗИ интеграции Lisp в Vim, но ни один действительно не пошел, насколько необходимый быть действительно полезным. Я думаю, что интеграция ECL была сделана, тем не менее, но не фиксировала в восходящем направлении.

необходимо найти все необходимые ссылки от страница Cliki о Vim.

12
задан Christian 12 November 2009 в 08:15
поделиться

8 ответов

Это то, что вы потенциально можете использовать много раз в рамках метода, и только внутри этого метода. Мне нравится эта идея. Сделайте это, если это не затрудняет чтение вашего кода. Я бы сказал, что вам следует пересмотреть свое решение, если вам трудно увидеть, каково содержимое лямбда-функции и каково реальное содержимое метода. В этом случае было бы проще вытащить его отдельным частным методом.

В конце концов, это действительно дело вкуса ...

11
ответ дан 2 December 2019 в 05:27
поделиться

Я согласен с трепетом: для мелкомасштабного повторного использования внутри метода (или даже класса) это идеально. Как примеры string.Format . Я использую это довольно часто. По сути, это то же самое, что использовать локальную переменную для промежуточного значения, которое вы используете более одного раза, , но затем для кода .

Ваш второй пример, похоже, немного подталкивает. Каким-то образом это дает мне ощущение, что закрытый метод AddSurfaceData (возможно, статический, в зависимости от его использования?) Был бы лучше. Это, конечно, выходит за рамки вашего контекста, поэтому используйте здравый смысл.

6
ответ дан 2 December 2019 в 05:27
поделиться

Лямбда-метод - это анонимный метод.

Это означает, что вы не должны давать ему имя.

Если вы это делаете (в вашем случае вы назначаете имя со своей ссылкой), это просто еще один способ объявить функцию.

В C # уже есть способ объявления функций, и это не лямбда-способ, который был добавлен однозначно передавать функции через параметры и возвращать их как возвращаемые значения.

Подумайте, например, в javascript:

function f(var1,var2,...,varX)
{
    some code
}

или

var f = function() {
    some code    
}

Другой синтаксис (почти) то же самое.

Подробнее о том, почему это не одно и то же: Javascript: var functionName = function () {} vs function functionName () {}

Другой пример: в Haskell вы можете определить две функции:

 function1 :: Int -> Int
 function1 x = x + 2

или

 function2 :: Int -> Int
 function2 = \x -> x + 2

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

C # 3.5, как и Javascript, имеет множество функциональных влияний. Некоторые из них следует использовать с умом, ИМХО.

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

Я говорю " У каждого языка есть свой механизм абстракции, используйте его с умом.

4
ответ дан 2 December 2019 в 05:27
поделиться

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

2
ответ дан 2 December 2019 в 05:27
поделиться

У меня нет проблем с длинным примером. Я вижу, что вы очень элегантно переупаковываете составные данные.

Это короткие, которые побудят ваших коллег исследовать преимущества добровольной госпитализации. Пожалуйста, объявите какую-то константу для хранения вашей строки формата и используйте «эту String.Format-вещь снова и снова». Как программист на C #, я знаю, что он делает, не ища нигде самодельных функций. Таким образом, когда мне нужно знать, как будет выглядеть отформатированная строка, я могу просто проверить константу.

2
ответ дан 2 December 2019 в 05:27
поделиться

Я согласен с volothamp в целом, но в дополнение ...

Подумайте о другие люди, которые должны поддерживать ваш код. Я думаю, что это легче понять, чем ваш первый пример, и он по-прежнему предлагает преимущества обслуживания, которые вы упомянули:

String.Format(this.resourceManager.GetString("BasicFormat"), f, o);
String.Format(this.resourceManager.GetString("AdvancedFormat"), f, o);

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

Подумайте о других людях, которые должны поддерживать ваш код. Я думаю, что это легче понять, чем ваш первый пример, и он по-прежнему предлагает преимущества обслуживания, которые вы упомянули:

String.Format(this.resourceManager.GetString("BasicFormat"), f, o);
String.Format(this.resourceManager.GetString("AdvancedFormat"), f, o);

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

Подумайте о других людях, которые должны поддерживать ваш код. Я думаю, что это легче понять, чем ваш первый пример, и он по-прежнему предлагает преимущества обслуживания, которые вы упомянули:

String.Format(this.resourceManager.GetString("BasicFormat"), f, o);
String.Format(this.resourceManager.GetString("AdvancedFormat"), f, o);

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

1
ответ дан 2 December 2019 в 05:27
поделиться

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

Я бы не стал использовать его для замены string.format.

0
ответ дан 2 December 2019 в 05:27
поделиться

+1 на nikie re DRY в целом хороший.

Я бы не стал использовать для них именование PascalCase.

Однако будьте осторожны - в большинстве случаев то, что у вас есть, есть просто метод извлечения в платье или потенциальный помощник или функция расширения. например, GetText - это метод, а FormatF * , вероятно, является вспомогательным методом ...

2
ответ дан 2 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

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