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


26

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

Проблема, мабуть, полягає в тому, що молодші розробники та інші не обов'язково розуміють, що таке функція вказівника \ delegate \ lambda функція, яка, схоже, ускладнює читання (і, можливо, налагодження) коду.

Чи слід уникати або суворо обмежувати використання цього інструменту для написання бізнес-програмного забезпечення, особливо у невеликих магазинах для індивідуальних розробників чи індивідуальних розробників?

Або прийнятно використовувати його з відповідними коментарями і очікувати, що коли я більше не буду, наступний розробник зрозуміє або дізнається про функції лямбда?


10
У Рубі лямбди (як самі, так і у вигляді блоків) - це основна мовна концепція. Вони використовуються всюди, від Arrayкласу до складних ОРМ. Ну, ніхто не скаржиться.
whitequark

18
Я публікую це як коментар, а не відповідь, тому що це лише варіація того, що всі інші вже сказали: я б продовжував їх використовувати. Всупереч тому, що сказала більшість людей, я б не переймався додаванням коментарів у всьому місці лише для того, щоб пояснити, що ви користуєтесь мовною функцією, яка чесно є досить простою. У коментарях має бути пояснено ділову логіку та чому було зроблено вибір для впровадження, а не навчати розробників про мовні особливості, з якими вони вже повинні бути знайомі. Якщо ви знаєте, що ваші молодші дияволи не розуміють лямбдів, сідайте їх і поясніть поняття.
Мітч Ліндгрен

3
Що робити, якщо кодер-молодший хоче використовувати лямбда, але переживає, що старі хакери C ++ не збираються його отримати? Звучить як лямбда, ні ... алгоритми не повинні використовуватися в бізнес-програмному забезпеченні.
Робота

10
Якби таке ставлення, ми все-таки підпалили б, потервши два монохромних монітора.
sbi

3
Добре вказівки на функції розглядаються в університетських курсах C. А також у вас є делегати на C #, тому майже будь-який розробник повинен бути досить комфортний у функціях типу даних / параметра. Напишіть код, який ви зможете найкраще написати.
Даніель Янков

Відповіді:


23

Здається, проблема полягає в тому, що молодші розробники та інші не обов'язково розуміють, що таке функція вказівника \ delegate \ lambda функція

Відверто кажучи, це їхня проблема. Це те, що ви гарантуєте, що вони мають навчання. Ви не можете використовувати хорошу техніку лише тому, що деякі люди можуть її не зрозуміти. Якщо їм потрібна допомога, вони можуть прийти запитати автора. Що ще важливіше, лямбда-функції стають надзвичайно поширеними мовними особливостями.

Чи не слід використовувати спадщину, оскільки деякі люди її не розуміють? Чорт, деякі люди відмовляються вірити в науку чи мікроби або будь-які смішні речі. Ви повинні мати можливість рухатися далі і не допускати можливості, щоб інші не змогли йти в ногу з вами, щоб не зупинити вас на написанні найкращого коду, який ви можете. Функції лямбда - це відмінна особливість і чудово допомагає в написанні коду, і вам слід скористатися всією допомогою, яку ви можете отримати.

Розробник повинен знати, як користуватися мовою, яка їм є молодшою ​​чи ні. Якщо вони цього не роблять, тоді звільніть їх і знайдіть когось, хто це робить, або навчіть їх так, як вони це роблять.


11
Що ж, я заборонив би спадщину перед забороною лямбда ...;)
fredoverflow

49

Так, використовуйте їх.

Я молодший розробник, і знаю / розумію лямбда (та інші поняття, які ви згадали). Я не міг би передбачити, що заважає молодшому розробнику вивчити всі ці концепції за дуже короткий проміжок часу. Юніори можуть не мати однакового досвіду / досвіду, коли справа стосується багатьох програм з розробки програмного забезпечення, однак такі поняття, як лямбда, можуть бути так само легко зрозуміти кожен, хто має базове розуміння програмування та підключення до Інтернету. Крім того, здається дивним, що ви вибрали лямбдаси в якості прикладу, враховуючи, що ви використовуєте C #, ймовірно, у вас навіть немає такої великої сили для вивчення лямбдаз для молодших розробників (вони були представлені лише у 2008 році, якщо я пам'ятайте правильно).

Коротше кажучи, немає необхідності придушувати свій код для нас неофітів. Ми будемо просто чудово, і насправді воліємо б працювати над найкращою можливою реалізацією, яку ви можете придумати. :)


4
Якщо ми, неофіти повільні. У такому випадку, будь ласка, отупите код для нас, або ... не наймайте нас в першу чергу.
Робота

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

2
Наведіть неофітів на stackoverflow.com/questions/2167360/… ... це була чудова відповідь на моє запитання в той час і допомогло плацдарму в моєму розумінні Linq та лямбда.
IАнотація

20

Якщо вони є розумним рішенням вашої проблеми, тоді ви повинні їх використовувати.

Не обмежуйте себе штучно - ви, швидше за все, отримаєте код низької якості, який важко підтримувати.

Якщо код добре написаний з відповідними коментарями, то ті, що читаються далі, повинні мати можливість дізнатися у вас.


13

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


14
чи посилання справді навіть необхідний?
Морган Херлокер

3
Ви б дійсно ставили посилання кожного разу, коли використовуєте лямбда?
Федеріко Клез Куллока

складність - ворог ...
Роберт С Сіакчо

11

Здається, проблема полягає в тому, що молодші розробники та інші не обов'язково розуміють, що таке функція вказівника \ delegate \ lambda функція

Тоді їм потрібно навчитися. Період.

  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
Я використовую другий, я бачу, що деякийМетод передається, і щоб визначити, що такеМетод, я клацну правою кнопкою миші та перейду до опції defn. дивіться, що це функція / метод, і це повинно мати сенс будь-якому програмісту в цей момент.
CaffGeek

@Chad - це як сказати: "Я використовував би коротше слово, яке читач рідше знає, і я припускаю, що вони читають його на Kindle, тому їм доведеться курсувати до слова, так що це виглядає це в словнику для них, замість того, щоб просто використовувати довше більш описове слово, я впевнений, що вони знають. І накручують людей без запалень ". Я не згоден з цією логікою. Код читається більше, ніж написано.
Скотт Вітлок

"У другому випадку ви повинні знати, що 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

IMHO, писати на будь-якому технічному рівні, вищому за технічний рівень команди, є неправильним. Якщо членам вашої команди не дуже зручні лямбда-вирази та функції, і вони не встигають витрачати її на навчання (вони повинні витратити свій час на налаштування бази даних про продуктивність, більше працювати над інтерфейсом, створювати компоненти тощо), пропонують не використовувати їх . Однак якщо вони готові вчитися і мають вільний час, або вони вже знають знання, то чому б ні?

Я думаю, що це відносне питання, яке слід оцінювати за технічним рівнем команди та команди. І це не лише у випадку лямбда-функцій. Це справа технічних знань. Так, наприклад, коли команда знає про шаблон сховища, має досвід для її впровадження та підтримання, тоді давайте це робити. Але якщо цього не зробити, просто знайдіть інший спосіб. Якщо вони знають про OO JavaScript, то давайте створимо більше масштабований код у JavaScript. Але якщо цього немає, просто поверніться до процедурного JavaScript.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.