Ist es akzeptabel, Lambda-Funktionen \ Methoden in Unternehmenssoftware zu verwenden?

26

Ich habe hier Beiträge gesehen, die die Verwendung von delegates \ lambda-Funktionen zum Lösen der Lücke in der mittleren Idee ohne viel Wiederholung demonstrieren: http://www.markhneedham.com/blog/2009/04/04/functional-c -das-loch-in-der-mitte-muster /

Das Problem scheint zu sein, dass Nachwuchsentwickler und andere nicht unbedingt verstehen, was das Funktionskonzept Zeiger \ Delegat \ Lambda ist, was das Lesen (und möglicherweise das Debuggen) des Codes erschwert.

Sollten wir die Verwendung dieses Tools beim Schreiben von Unternehmenssoftware vermeiden oder stark einschränken, insbesondere in kleinen Teams oder Einzelentwicklergeschäften?

Oder ist es akzeptabel, es mit entsprechenden Kommentaren zu verwenden und zu erwarten, dass der nächste Entwickler die Lambda-Funktionen versteht oder etwas über sie erfährt, wenn ich nicht mehr da bin?

Peter Smith
quelle
10
In Ruby sind Lambdas (als solche und in Form von Blöcken) ein Kernsprachenkonzept. Sie werden überall eingesetzt, von der ArrayKlasse bis zu komplizierten ORMs. Nun, niemand beschwert sich.
Whitequark
18
Ich poste dies eher als Kommentar als als Antwort, weil es nur eine Abwandlung dessen ist, was alle anderen bereits gesagt haben: Ich würde weitermachen und sie verwenden. Im Gegensatz zu dem, was die meisten Leute gesagt haben, würde ich nicht die Mühe machen, überall Kommentare hinzuzufügen, nur um zu erklären, dass Sie eine Sprachfunktion verwenden, die ehrlich gesagt ziemlich einfach ist. Kommentare sollten die Geschäftslogik erläutern und erklären, warum Implementierungsentscheidungen getroffen wurden, und Entwickler nicht über Sprachfunktionen informieren, mit denen sie bereits vertraut sein sollten. Wenn Sie wissen, dass Ihre Junior-Entwickler Lambdas nicht verstehen, setzen Sie sich und erklären Sie das Konzept.
Mitch Lindgren
3
Was ist, wenn ein Junior-Programmierer Lambdas verwenden möchte, aber befürchtet, dass die alten C ++ - Hacker es nicht bekommen werden? Klingt so, als ob weder Lambdas noch ... Algorithmen in Unternehmenssoftware verwendet werden sollten.
Job
10
Wenn das so wäre, würden wir immer noch Feuer machen, indem wir zwei monochrome Monitore reiben.
sbi
3
Gut Hinweise auf Funktionen werden in Universitätskursen C gedacht. Und Sie haben auch Delegierte in C #, sodass fast jeder Entwickler mit Funktionen als Datentyp / Parameter vertraut sein sollte. Schreiben Sie den Code, den Sie am besten schreiben können.
Daniel Iankov

Antworten:

23

Das Problem scheint zu sein, dass Nachwuchsentwickler und andere nicht unbedingt verstehen, was das Funktionskonzept Zeiger \ Delegat \ Lambda ist

Ganz ehrlich, das ist ihr Problem. Dafür sorgen Sie, dass sie ausgebildet sind. Eine gute Technik kann man nicht anwenden, nur weil manche Leute sie vielleicht nicht verstehen. Wenn sie Hilfe benötigen, können sie den Autor fragen. Noch wichtiger ist, dass Lambda-Funktionen zu extrem häufigen Sprachmerkmalen werden.

Sollten wir Vererbung nicht verwenden, weil einige Leute es nicht verstehen? Zur Hölle, manche Menschen weigern sich, an Wissenschaft, Keime oder andere lächerliche Dinge zu glauben. Sie müssen in der Lage sein, weiterzumachen und sich nicht davon abhalten zu lassen, dass andere nicht mit Ihnen mithalten können, den bestmöglichen Code zu schreiben. Lambda-Funktionen sind eine großartige Funktion, die beim Schreiben von Code sehr hilfreich ist, und Sie sollten jede erdenkliche Hilfe in Anspruch nehmen.

Ein Entwickler sollte wissen, wie er mit der Sprache umgeht, in der er sich gerade befindet oder nicht. Wenn dies nicht der Fall ist, feuern Sie sie und suchen Sie jemanden, der dies tut, oder schulen Sie sie, damit sie es tun.

DeadMG
quelle
11
Nun, ich würde die Vererbung verbieten, bevor ich Lambdas verbiete ...;)
Fredoverflow
49

Ja, benutze sie.

Ich bin ein Junior-Entwickler und kenne / verstehe Lambdas (und die anderen Konzepte, die Sie erwähnt haben). Ich kann mir nichts vorstellen, das einen Nachwuchsentwickler daran hindert, all diese Konzepte in sehr kurzer Zeit zu erlernen. Junioren verfügen möglicherweise nicht über die gleiche Erfahrung / Sachkenntnis, wenn es um viele Fälle der Softwareentwicklung geht. Konzepte wie Lambdas können jedoch von jedem mit einem grundlegenden Verständnis der Programmierung und einer Internetverbindung einfach verstanden werden. Es ist auch seltsam, dass Sie Lambdas als Beispiel gewählt haben, wenn man bedenkt, dass Sie mit C # wahrscheinlich nicht einmal so viel Vorsprung haben, Lambdas gegenüber den Junior - Entwicklern zu erlernen (diese wurden erst 2008 eingeführt, wenn ich es so finde) richtig merken).

Kurz gesagt, es ist nicht nötig, Ihren Code für uns Neulinge zu verfälschen. Es wird uns gut gehen und wir würden es vorziehen, an der bestmöglichen Implementierung zu arbeiten, die Sie finden können. :)

Morgan Herlocker
quelle
4
Sofern wir nicht, sind Neophyten langsam. In diesem Fall bitte den Code für uns dumm machen oder ... uns erst gar nicht einstellen.
Job
19
@Job - Ich denke, wir müssen nur ehrlich sein und sagen, wenn ein Junior die Lambda-Syntax nach ein paar Tagen nicht verstehen kann (ziemlich großzügig), dann könnte es sich wirklich um ein Einstellungsproblem handeln.
Morgan Herlocker
2
Weisen Sie die Neulinge auf stackoverflow.com/questions/2167360/ ... hin. Dies war eine hervorragende Antwort auf meine damalige Frage und hat mir geholfen, mein Verständnis von Linq und Lambdas zu fördern.
IAbstrakter
20

Wenn sie eine sinnvolle Lösung für Ihr Problem sind, sollten Sie sie verwenden.

Beschränken Sie sich nicht künstlich - es ist wahrscheinlicher, dass Sie Code mit schlechter Qualität erhalten, der schwer zu pflegen ist.

Wenn der Code mit den entsprechenden Kommentaren gut geschrieben ist, sollten die folgenden von Ihnen lernen können .

ChrisF
quelle
13

Fügen Sie einen Link zur msdn-Dokumentation in die Kommentare oben in einem Block ein, der sie verwendet, und fahren Sie dann fort. Sie sollten keine Angst haben, neue / komplexe Technologien zu verwenden, die Teil eines Entwicklerberufs sind, um Dinge zu lernen, die sie nicht kennen.

Tom Squires
quelle
14
ist ein link überhaupt nötig?
Morgan Herlocker
3
Würden Sie wirklich jedes Mal einen Link setzen, wenn Sie ein Lambda verwenden?
Federico Klez Culloca
Komplexität ist der Feind ...
Robert S Ciaccio
11

Das Problem scheint zu sein, dass Nachwuchsentwickler und andere nicht unbedingt verstehen, was das Funktionskonzept Zeiger \ Delegat \ Lambda ist

Dann müssen sie sie lernen. Zeitraum.

  1. Dies ist keine esoterische Ecke von C #. Sie müssen sie verstehen, um viele .Net-Bibliotheken nutzen zu können.
  2. Dies ist im Allgemeinen kein esoterisches Sprachthema. Praktisch jede Sprache, die heutzutage im allgemeinen Sprachgebrauch verwendet wird, weist eine gewisse Art von Funktionszeigern auf, und die meisten haben (oder werden im Falle von Java und C ++ bald) Abschlüsse.

Nehmen Sie sich ein paar Minuten Zeit, um es ihnen zu erklären. Es ist nicht schwer.

Schlamm
quelle
5

Sie sollten das richtige Werkzeug für den Job verwenden. Wenn es einen einfacheren und klareren Weg gibt, das vorliegende Problem zu lösen, verwenden Sie diesen. Wenn Sie sich mit etwas befassen möchten, von dem Sie glauben, dass es ein fortgeschrittenes Thema für zukünftige Betreuer ist, markieren Sie es deutlich und fügen Sie einen Verweis auf die Dokumentation hinzu, die die Technik erklärt.

das Funktionszeiger \ delegate \ lambda Funktionskonzept

Es ist zu beachten, dass dies drei verschiedene Dinge sind.

Caleb
quelle
3

Zwei mögliche Szenarien:

a) Ihre Kollegen (oder die meisten von ihnen) sind angemessen qualifiziert. Sie müssen Lambdas lernen, sind Teil der Sprache und manchmal genau das richtige Werkzeug für den Job. Also, wenn sie in der Tat das beste Werkzeug sind, benutzen Sie sie auf jeden Fall. Vermeiden Sie es einfach, sie zu benutzen, denn Sie haben sie gerade erst selbst kennengelernt, und Sie sind alle aufgeregt und glauben, sie seien eine Silberkugel.

b) Ihre Kollegen (oder die meisten von ihnen) sind inkompetent. Auf keinen Fall werden sie Lambdas, Closures, Funktionszeiger oder ein ähnliches Meta-Coding-Konzept jemals vollständig verstehen. Sie haben wahrscheinlich Schwierigkeiten, Zeiger, Verweise und Rekursionen bereits zu verstehen. In dieser Situation ist das Beste, was Sie tun können, die Kugel zu beißen, eine plumpe, ausführliche, lambdafreie Lösung zu verwenden und Ihren Lebenslauf aufzufrischen, da Sie auf Jobsuche sein sollten.

tdammers
quelle
2

Hier kann Konsistenz sehr hilfreich sein. Wenn Sie es konsequent mit demselben Stil usw. verwenden, müssen die Leser es nur einmal lernen und erkennen es dann überall.

Es könnte auch hilfreich sein, zumindest anfangs explizit zu sein. Zum Beispiel sind diese beiden äquivalent:

doSomething(() => someMethod());

doSomething(someMethod);

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

... aber im ersten Fall ist es offensichtlich, wenn Sie die Lambda-Syntax kennen, was wir tun. Auch wenn Sie die Lambda-Syntax nicht kennen, ist es offensichtlich, dass Sie etwas Neues sehen und es nachschlagen müssen. Im zweiten Fall sieht es so aus, als würden Sie eine Variable übergeben.

Ich weiß, dass ReSharper Sie dazu drängt, es auf den zweiten Fall umzustellen, aber ich frage mich, ob das immer eine gute Idee ist. Im zweiten Fall muss man wissen, dass doSomethingein Action.

Scott Whitlock
quelle
1
Ich würde die zweite verwenden. Ich sehe, dass someMethod übergeben wird, und um festzustellen, was someMethod ist, würde ich mit der rechten Maustaste klicken und zu def'n gehen. siehe es ist eine Funktion / Methode und es sollte zu diesem Zeitpunkt für jeden Programmierer Sinn machen.
CaffGeek
@Chad - das ist so, als würde man sagen "Ich würde ein kürzeres Wort verwenden, das der Leser wahrscheinlich nicht kennt, und ich gehe davon aus, dass sie es auf einem Kindle lesen Ich bin mir ziemlich sicher, dass sie es im Wörterbuch nachschlagen, anstatt nur ein längeres, aussagekräftigeres Wort zu verwenden. Ich bin mit dieser Logik nicht einverstanden. Code wird mehr gelesen als geschrieben.
Scott Whitlock
"Im zweiten Fall muss man wissen, dass man eine doSomethingbraucht Action." Und wie unterscheidet sich das davon, dass man wissen muss, dass man eine functionWithNameThatDoesNotSpecifyItsArgumentTypesbraucht ObjectOfSomeType? Tatsächlich ist es in Sprachen, in denen Funktionen echte erstklassige Objekte sind, nicht anders.
JAB
1

Ich finde bestimmte Konzepte oft schwer zu verstehen, weil sie nur abstrakt beschrieben werden, anstatt sie in praktischen, realen Situationen zu begegnen. Ich persönlich würde es begrüßen, auf solche Konstrukte zu stoßen.

Das Hauptszenario, an das ich denken kann, um dies zu vermeiden, ist, wenn das Programmieren nicht die Hauptaufgabe der anderen Person ist. Zum Beispiel ein Systemadministrator oder ein Bioinformatiker, der die meiste Zeit mit tatsächlichen Experimenten verbringt (eine "Laborratte").

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

Vielleicht nennen wir hier DoAction, weil sein Körper zu lang ist, um in das Lambda selbst zu passen. In diesem Fall hat die Verwendung der ForEach () - Erweiterungsmethode für List keinen großen Vorteil gegenüber der Verwendung der regulären foreach-Schleife, obwohl sie vermutlich ein paar Codezeilen spart. In diesem speziellen Fall hat uns die Verwendung von ForEach () möglicherweise dazu veranlasst, etwas zu tun, das tatsächlich mehr Code benötigt und auf dem Stapel zusätzliche Thrashs verursacht, als erforderlich sind. Das übergebene Argument muss überhaupt kein Lambda sein

Sie sollten DoAction einfach so aufrufen:

itemsList.ForEach(DoAction);

Kein Lambda. Der Schlüssel ist, sich zu merken, was Sie wirklich passieren, wenn Sie einen Lambda-Ausdruck erstellen: eine Art Verknüpfung zum Definieren einer Delegateninstanz. Ja, es hat auch Vorteile wie das Schließen, aber man sollte nicht den Überblick verlieren, was der Methodenaufruf erwartet. In diesem Fall wird eine Adresse für eine Methode erwartet, die der Signatur von Action entspricht. DoAction ist bereits eine solche Methode. Das Erstellen des Lambda fügt also nur einen völlig unnötigen Methodenaufruf hinzu.

Manpreet Dhillon
quelle
-1

IMHO, auf jeder technischen Ebene, die über der technischen Ebene des Teams liegt, zu schreiben, ist falsch. Wenn Ihre Teammitglieder mit Lambda-Ausdrücken und -Funktionen nicht wirklich vertraut sind und keine Zeit zum Erlernen haben (sie sollten ihre Zeit mit der Leistungsoptimierung von Datenbanken verbringen, mehr an der Benutzeroberfläche arbeiten, Komponenten erstellen usw.), dann bin ich fest entschlossen Schlagen Sie vor, sie nicht zu verwenden . Wenn sie jedoch bereit sind zu lernen und Freizeit haben oder das Wissen bereits kennen, warum dann nicht?

Ich denke, dies ist ein relatives Problem, das je nach Team und technischem Niveau des Teams beurteilt werden sollte. Und das gilt nicht nur für Lambda-Funktionen. Dies ist der Fall von technischem Wissen. Wenn ein Team beispielsweise über das Repository-Muster Bescheid weiß, über das Know-how verfügt, um es zu implementieren und zu warten, sollten Sie dies tun. Aber wenn nicht, suchen Sie einfach einen anderen Weg. Wenn Sie mit OO-JavaScript vertraut sind, können Sie skalierbaren Code in JavaScript erstellen. Wenn dies nicht der Fall ist, kehren Sie einfach zu prozeduralem JavaScript zurück.

Saeed Neamati
quelle