Czy dopuszczalne jest stosowanie funkcji \ metod lambda w oprogramowaniu biznesowym?

26

Zauważyłem tutaj posty pokazujące użycie funkcji delegates \ lambda do rozwiązania dziury w środku pomysłu bez dużej ilości powtórzeń: http://www.markhneedham.com/blog/2009/04/04/functional-c -the-hole-in-the-middle-pattern /

Problemem wydaje się być to, że młodsi programiści i inni niekoniecznie rozumieją, czym jest pojęcie funkcji wskaźnik wskaźnik \ delegate \ lambda, co utrudnia odczyt (i być może debugowanie) kodu.

Czy powinniśmy unikać lub poważnie ograniczyć korzystanie z tego narzędzia do pisania oprogramowania biznesowego, zwłaszcza w małych zespołach lub sklepach z programistami?

Czy też dopuszczalne jest używanie go z odpowiednimi komentarzami i oczekiwanie, że kiedy już mnie nie będzie, następny programista zrozumie lub pozna funkcje lambda?

Peter Smith
źródło
10
W języku Ruby lambdas (jako one i w postaci bloków) są podstawową koncepcją języka. Są używane wszędzie, od Arrayklas po skomplikowane ORM. Cóż, nikt nie narzeka.
whitequark
18
Publikuję to jako komentarz, a nie odpowiedź, ponieważ jest to tylko wariant tego, co wszyscy inni już powiedzieli: skorzystam z nich. W przeciwieństwie do tego, co większość ludzi powiedziała, nie zawracałbym sobie głowy dodawaniem komentarzy w całym miejscu, aby wyjaśnić, że używasz funkcji językowej, która jest naprawdę dość prosta. Komentarze powinny wyjaśniać logikę biznesową i dlaczego dokonano wyboru implementacji, a nie informować programistów o funkcjach językowych, które powinni już znać. Jeśli wiesz, że twoi młodsi deweloperzy nie rozumieją lambdów, usiądź i wyjaśnij pojęcie.
Mitch Lindgren,
3
Co jeśli koder Junior chce używać lambdas, ale martwi się, że dawni hakerzy C ++ go nie dostaną? Brzmi jak ani lambda, ani ... algorytmy powinny być używane w oprogramowaniu biznesowym.
Job
10
Gdyby tak było, nadal rozpalalibyśmy ogień, pocierając dwa monochromatyczne monitory.
sbi
3
Wskaźniki funkcji są uważane na uniwersyteckich kursach C. I masz także delegatów w języku C #, więc prawie każdy programista powinien czuć się komfortowo z funkcjami jako typ danych / parametr. Napisz kod, który możesz napisać najlepiej.
Daniel Iankov,

Odpowiedzi:

23

Problemem wydaje się być to, że młodsi programiści i inni niekoniecznie rozumieją, czym jest pojęcie funkcji wskaźnik \ delegate \ lambda

Szczerze mówiąc, to ich problem. Do tego masz pewność, że mają szkolenie. Nie możesz nie używać dobrej techniki tylko dlatego, że niektórzy ludzie mogą jej nie zrozumieć. Jeśli potrzebują pomocy, mogą poprosić autora. Co ważniejsze, funkcje lambda stają się niezwykle popularnymi funkcjami językowymi.

Czy nie powinniśmy korzystać z dziedziczenia, ponieważ niektórzy go nie rozumieją? Do diabła, niektórzy ludzie nie chcą wierzyć w naukę, zarazki lub jakiekolwiek inne śmieszne rzeczy. Musisz być w stanie przejść dalej i nie dopuścić do tego, aby inni nie byli w stanie dotrzymać Ci kroku, powstrzymując Cię przed napisaniem najlepszego kodu, jaki możesz. Funkcje Lambda są świetną funkcją i bardzo pomagają w pisaniu kodu, i powinieneś wziąć całą pomoc, jaką możesz uzyskać.

Deweloper powinien wiedzieć, jak używać języka, w którym jest młodszy, czy nie. Jeśli tego nie zrobią, zwolnij ich i znajdź kogoś, kto to zrobi, lub wyszkol ich, aby to zrobili.

DeadMG
źródło
11
Cóż,
zakazałbym
49

Tak, użyj ich.

Jestem młodszym programistą i znam / rozumiem lambdas (i inne pojęcia, o których wspominałeś). Nic nie mogłem przewidzieć, aby powstrzymać młodszego programistę od nauki wszystkich tych koncepcji w bardzo krótkim czasie. Juniorzy mogą nie mieć takiego samego doświadczenia / wiedzy, jeśli chodzi o wiele problemów związanych z tworzeniem oprogramowania, jednak pojęcia takie jak lambda mogą być równie łatwo zrozumiałe dla każdego, kto ma podstawową wiedzę na temat programowania i połączenia internetowego. Wydaje się również dziwne, że wybrałeś lambdas jako przykład, biorąc pod uwagę, że używasz C #, prawdopodobnie nie masz nawet tyle przewagi w nauce lambdas niż młodszych programistów (zostały wprowadzone dopiero w 2008 roku, jeśli ja pamiętaj poprawnie).

Krótko mówiąc, nie ma potrzeby ogłuszania kodu dla nas neofitów. Będzie nam dobrze i wolimy pracować nad najlepszym możliwym wdrożeniem, jakie możesz wymyślić. :)

Morgan Herlocker
źródło
4
Chyba że my, neofici są powolni. W takim przypadku prosimy o głupszy kod dla nas lub ... nie zatrudniaj nas w pierwszej kolejności.
Job
19
@Job - Myślę, że musimy być szczerzy i powiedzieć, że jeśli junior nie może zrozumieć składni lambda, biorąc pod uwagę kilka dni (będąc dość hojnymi), to naprawdę może to być problem z zatrudnieniem.
Morgan Herlocker
2
Wskaż neofitom na stackoverflow.com/questions/2167360/ ... ... to była świetna odpowiedź na moje pytanie w tym czasie i pomogła mi zrozumieć, w jaki sposób Linq i lambdas.
IAbstract
20

Jeśli są rozsądnym rozwiązaniem twojego problemu, powinieneś ich użyć.

Nie ograniczaj się sztucznie - istnieje większe prawdopodobieństwo, że kod będzie niskiej jakości, trudny do utrzymania.

Jeśli kod jest dobrze napisany z odpowiednimi komentarzami, to ci, którzy go śledzą, powinni móc się od ciebie uczyć .

ChrisF
źródło
13

Umieść link do dokumentacji msdn w komentarzach na górze bloku, który z niej korzysta, a następnie kontynuuj. Nie powinieneś bać się korzystać z nowej / złożonej technologii, która jest częścią pracy programisty, aby dowiedzieć się rzeczy, których nie znają.

Tom Squires
źródło
14
czy link jest naprawdę konieczny?
Morgan Herlocker
3
Czy naprawdę umieściłbyś link przy każdym użyciu lambda?
Federico klez Culloca
złożoność jest wrogiem ...
Robert S Ciaccio
11

Problemem wydaje się być to, że młodsi programiści i inni niekoniecznie rozumieją, czym jest pojęcie funkcji wskaźnik \ delegate \ lambda

Następnie muszą się ich nauczyć. Kropka.

  1. To nie jest ezoteryczny róg C #. Musisz je zrozumieć, aby móc korzystać z wielu bibliotek .Net.
  2. Zasadniczo nie jest to temat ezoteryczny. Praktycznie każdy obecnie używany język ma pewien smak wskaźnika funkcji, a większość ma (lub wkrótce dostanie, w przypadku Java i C ++) zamknięcia.

Poświęć im kilka minut, aby im to wyjaśnić. To nie jest trudne.

Błoto
źródło
5

Powinieneś użyć odpowiedniego narzędzia do pracy. Jeśli istnieje prostszy i bardziej przejrzysty sposób rozwiązania problemu, skorzystaj z niego. Jeśli chcesz wejść w coś, co Twoim zdaniem może być zaawansowanym tematem dla przyszłych opiekunów, zaznacz to wyraźnie i dołącz wskaźnik do dokumentacji wyjaśniającej tę technikę.

wskaźnik funkcji \ delegat \ koncepcja funkcji lambda

Należy zauważyć, że są to trzy różne rzeczy.

Caleb
źródło
3

Dwa możliwe scenariusze:

a) Twoi koledzy (lub większość z nich) mają odpowiednie umiejętności. Muszą nauczyć się lambdas, są częścią języka, a czasem są dokładnie odpowiednim narzędziem do pracy. Jeśli więc są naprawdę najlepszym narzędziem, z pewnością je wykorzystaj. Po prostu unikaj ich używania, ponieważ dopiero się o nich dowiedziałeś i wszyscy są podekscytowani i myślą, że to srebrna kula.

b) Wy, koledzy (lub większość z nich), jesteście niekompetentni. Nie ma możliwości, by kiedykolwiek w pełni zrozumieli lambdy, zamknięcia, wskaźniki funkcji lub inne podobne meta-kodowanie. Prawdopodobnie już starają się zrozumieć wskaźniki, referencje i rekurencję. W tej sytuacji najlepsze, co możesz zrobić, to ugryźć kulę, użyć niezdarnego, pełnego, pozbawionego lambda roztworu i wyczyścić CV, ponieważ powinieneś szukać pracy.

tdammers
źródło
2

W tym przypadku spójność może bardzo pomóc. Jeśli używasz go konsekwentnie w tym samym stylu itp., Czytelnicy muszą się go nauczyć tylko raz, a następnie rozpoznają go wszędzie.

Ponadto, przynajmniej na początku, może być pomocne. Na przykład te dwa są równoważne:

doSomething(() => someMethod());

doSomething(someMethod);

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

... ale w pierwszym przypadku jest oczywiste, jeśli znasz składnię lambda, co robimy. Nawet jeśli nie znasz składni lambda, to oczywiste, że widzisz coś nowego i musisz to sprawdzić. W drugim przypadku wygląda to tak, jakbyś przekazał zmienną.

Wiem, że ReSharper popycha cię do zmiany na drugą sprawę, ale zastanawiam się, czy to zawsze dobry pomysł. W drugim przypadku musisz wiedzieć, że doSomethingpotrzeba Action.

Scott Whitlock
źródło
1
Użyłbym drugiego, widzę, że niektóre Metod są przekazywane, i aby ustalić, co to jest Metod, kliknę prawym przyciskiem myszy i przejdę do definicji. widzę, że jest to funkcja / metoda i powinien mieć sens dla każdego programisty w tym momencie.
CaffGeek,
@Chad - to tak, jakby powiedzieć: „Użyłbym krótszego słowa, którego czytelnik raczej nie zna, i zakładam, że czytają je na Kindle, więc muszą przesuwać kursor do słowa, więc wygląda w ich słowniku, zamiast używać dłuższego, bardziej opisowego słowa, jestem pewien, że wiedzą. I pieprzyć ludzi bez Kindlesa. ” Nie zgadzam się z tą logiką. Kod jest czytany więcej niż jest napisany.
Scott Whitlock,
„W drugim przypadku musisz wiedzieć, że doSomethingwymaga to Action”. A jak jest, że każda różni się od konieczności wiedzieć, że functionWithNameThatDoesNotSpecifyItsArgumentTypeszajmuje ObjectOfSomeType? W rzeczywistości w językach, w których funkcje są prawdziwymi obiektami pierwszej klasy, nie jest inaczej.
JAB
1

Często trudno mi zrozumieć niektóre pojęcia, ponieważ są one opisane jedynie w sposób abstrakcyjny, a nie spotykane w praktycznych sytuacjach. Więc osobiście jestem za spotkaniem z takimi konstrukcjami.

Główny scenariusz, który mogę wymyślić, aby tego uniknąć, to taki, że programowanie nie jest głównym zadaniem drugiej osoby. Na przykład administrator systemu lub bioinformatyk, który większość czasu spędza na rzeczywistych eksperymentach („szczur laboratoryjny”).

Andrew Grimm
źródło
1
itemsList.ForEach(item => DoAction(item));
...
public void DoAction(Item item) {
  //...do various things here...
}

Być może tutaj nazywamy DoAction, ponieważ jego ciało jest zbyt długie, aby zmieścić się w samej lambda. W takim przypadku użycie metody rozszerzenia ForEach () do List nie daje nam wiele korzyści w porównaniu ze zwykłą pętlą foreach, choć, jak sądzę, pozwala zaoszczędzić kilka linii kodu. Ale w tym konkretnym przypadku użycie ForEach () mogło nas uśpić do zrobienia czegoś, co w rzeczywistości wymaga więcej kodu i powoduje dodatkowe przeładowanie stosu, niż to konieczne; Przekazany argument wcale nie musi być lambda

Powinieneś po prostu wywołać DoAction w ten sposób:

itemsList.ForEach(DoAction);

W ogóle nie ma Lambdy. Kluczem jest zapamiętanie, co tak naprawdę przekazujesz, gdy tworzysz wyrażenie lambda: coś w rodzaju skrótu do definiowania instancji delegowanej. Tak, ma również zalety, takie jak zamknięcie, ale nie należy tracić witryny z tego, czego oczekuje wywołanie metody. W tym przypadku oczekuje adresu do metody pasującej do podpisu Action. DoAction jest już taką metodą, więc tworzenie lambda jest po prostu dodawaniem całkowicie niepotrzebnego wywołania metody.

manpreet dhillon
źródło
-1

IMHO, pisząc na jakimkolwiek poziomie technicznym wyższym niż poziom techniczny zespołu, jest błędny. Jeśli członkowie Twojego zespołu nie są zbyt zadowoleni z wyrażeń i funkcji lambda i nie mają czasu na naukę tego (powinni poświęcić czas na bazę danych dostrajania wydajności, więcej pracować nad interfejsem użytkownika, tworzyć komponenty itp.), To zdecydowanie sugeruj, aby ich nie używać . Jeśli jednak chcą się uczyć i mają czas wolny lub już wiedzą, to dlaczego nie?

Myślę, że jest to względna kwestia, którą należy oceniać według zespołu i poziomu technicznego zespołu. Dotyczy to nie tylko funkcji lambda. Tak jest w przypadku wiedzy technicznej. Na przykład, ilekroć zespół wie o wzorcu repozytorium, ma wiedzę specjalistyczną, aby go wdrożyć i utrzymywać, niech to zrobi. Ale jeśli nie, po prostu znajdź inny sposób. Jeśli wiedzą o OO JavaScript, pozwól nam stworzyć bardziej skalowalny kod w JavaScript. Ale jeśli nie, po prostu wróć do proceduralnego JavaScript.

Saeed Neamati
źródło