Допустимо ли использовать лямбда-функции \ методы в деловом программном обеспечении?


26

Я заметил здесь посты, демонстрирующие использование функций делегатов \ лямбда для устранения дыры в средней идее без большого количества повторений: http://www.markhneedham.com/blog/2009/04/04/functional-c -The отверстия-в-среднего рисунка /

Кажется, проблема в том, что младшие разработчики и другие не обязательно понимают, что такое концепция функции указатель \ делегат \ лямбда-функция, что, кажется, затрудняет чтение (и, возможно, отладку) кода.

Должны ли мы избегать или строго ограничивать использование этого инструмента при написании программного обеспечения для бизнеса, особенно в небольших группах или в магазинах для индивидуальных разработчиков?

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


10
В Ruby лямбды (как сами по себе, так и в форме блоков) являются основной концепцией языка. Они используются везде, от Arrayкласса до сложных ORM. Ну, никто не жалуется.
Уайткварк

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

3
Что, если младший кодер хочет использовать лямбды, но беспокоится, что старые хакеры C ++ не получат его? Похоже, ни лямбды, ни ... алгоритмы не должны использоваться в бизнес-программах.
Работа

10
Если бы это было так, мы бы все равно зажглись, потерев два монохромных монитора.
sbi

3
Хорошо указатели на функции думают в университетских курсах C. И у вас также есть делегаты в C #, так что почти любой разработчик должен быть вполне доволен функциями как типом данных / параметром. Напишите код, который вы можете написать лучше всего.
Даниэль Янков

Ответы:


23

Кажется, проблема в том, что младшие разработчики и другие не обязательно понимают, что такое концепция функции указатель \ делегат \ лямбда-функция

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

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

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


11
Ну, я бы запретил наследование, прежде чем запретить лямбды ...;)
fredoverflow

49

Да, используйте их.

Я младший разработчик, и я знаю / понимаю лямбды (и другие концепции, которые вы упомянули). Я ничего не мог упустить, чтобы помешать начинающему разработчику изучить все эти концепции за очень короткое время. У юниоров может не быть такого количества опыта / опыта, когда дело доходит до многих задач разработки программного обеспечения, однако такие понятия, как лямбда-выражения, могут быть так же легко понятны любому, кто имеет базовое понимание программирования и интернет-соединения. Кроме того, кажется странным, что вы выбрали лямбду в качестве примера, учитывая, что если вы используете C #, то, скорее всего, у вас даже не будет большого успеха в изучении лямбд у младших разработчиков (они были введены только в 2008 году, если я помните правильно).

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


4
Если не мы, неофиты медленные. В этом случае, пожалуйста, дайте нам код или ... не нанимайте нас в первую очередь.
Работа

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

2
Направьте неофитов на stackoverflow.com/questions/2167360/… ... это был отличный ответ на мой вопрос в то время и помогло мне понять Linq и lambdas.
IAbstract

20

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

Не ограничивайте себя искусственно - у вас больше шансов получить некачественный код, который сложно поддерживать.

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


13

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


14
ссылка действительно даже необходима?
Морган Херлокер

3
Неужели вы бы ставили ссылку каждый раз, когда используете лямбду?
Федерико Клез Каллока

сложность - враг ...
Роберт С. Чаччо

11

Кажется, проблема в том, что младшие разработчики и другие не обязательно понимают, что такое концепция функции указатель \ делегат \ лямбда-функция

Тогда они должны изучить их. Период.

  1. Это не эзотерический уголок C #. Вы должны понимать их, чтобы использовать много библиотек .Net.
  2. Это вообще не эзотерическая языковая тема. Практически каждый популярный сегодня язык имеет свой вид указателя на функцию, и большинство из них имеют (или скоро получат, в случае Java и C ++) замыкания.

Просто потратьте несколько минут, чтобы объяснить это им. Это не сложно.


5

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

указатель на функцию \ делегат \ концепция лямбда-функции

Следует отметить, что это три разные вещи.


3

Два возможных сценария:

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

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


2

Вот где последовательность может очень помочь. Если вы используете его в соответствии с тем же стилем и т. Д., То читатели должны выучить его только один раз, и тогда они узнают его повсюду.

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

doSomething(() => someMethod());

doSomething(someMethod);

private void doSomething(Action someAction) { ... }
private void someMethod() { ... }

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

Я знаю, что ReSharper подталкивает вас изменить его на второй случай, но мне интересно, всегда ли это хорошая идея. Во втором случае вы должны знать, что doSomethingзанимает Action.


1
Я бы использовал второй, я вижу, что someMethod передается, и чтобы определить, что такое someMethod, я бы щелкнул правой кнопкой мыши и пошел в def'n. видите, это функция / метод, и это должно иметь смысл для любого программиста на этом этапе.
CaffGeek

@Chad - это все равно, что сказать: «Я бы использовал более короткое слово, которое читатель с меньшей вероятностью узнает, и я предполагаю, что они читают его на Kindle, поэтому им нужно навести курсор на слово, чтобы оно выглядело это в словаре для них, вместо того, чтобы просто использовать более длинное и описательное слово, которое я почти уверен, что они знают. И наплевать на людей без Kindles ". Я не согласен с этой логикой. Код читается больше, чем написано.
Скотт Уитлок

«Во втором случае вы должны знать, что doSomethingтребуется Action». И чем это отличается от необходимости знать, что functionWithNameThatDoesNotSpecifyItsArgumentTypesтребует ObjectOfSomeType? Фактически, в языках, где функции являются настоящими первоклассными объектами, это ничем не отличается.
JAB

1

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

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


1
itemsList.ForEach(item => DoAction(item));
...
public void DoAction(Item item) {
  //...do various things here...
}

Теперь, возможно, здесь мы называем DoAction, потому что его тело слишком длинное, чтобы поместиться в самой лямбде. В этом случае использование метода расширения ForEach () для List не дает нам большого преимущества по сравнению с использованием обычного цикла foreach, хотя, я полагаю, он сохраняет пару строк кода. Но в этом конкретном случае использование ForEach () могло бы побудить нас сделать что-то, что на самом деле требует больше кода и приводит к дополнительным перегрузкам в стеке, чем это необходимо; Приведенный аргумент вовсе не должен быть лямбдой

Вы должны просто вызвать DoAction так:

itemsList.ForEach(DoAction);

Нет лямбда вообще. Главное - помнить, что именно вы передаете, когда создаете лямбда-выражение: что-то вроде ярлыка для определения экземпляра делегата. Да, он также имеет такие преимущества, как замыкание, но не следует забывать о том, что ожидает вызов метода. В этом случае ожидается адрес метода, который соответствует сигнатуре Action. DoAction уже является таким методом, поэтому создание лямбды - это просто добавление совершенно ненужного вызова метода.


-1

ИМХО, писать на любом техническом уровне выше, чем технический уровень команды, неправильно. Если членам вашей команды не очень-то нравятся лямбда-выражения и функции, и у них нет времени тратить на их изучение (им следует больше времени уделять настройке производительности, работе над пользовательским интерфейсом, созданию компонентов и т. Д.), Тогда я настоятельно рекомендую предлагаю не использовать их . Однако, если они хотят учиться и имеют свободное время, или они уже знают знания, то почему бы и нет?

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.