Fall : Ich arbeite in einer Firma und schreibe eine Anwendung in Python, die viele Daten in Arrays verarbeitet. Ich bin der einzige Entwickler dieses Programms im Moment, aber es wird wahrscheinlich in Zukunft (1-3 Jahre) von einem anderen Programmierer verwendet / modifiziert / erweitert, der mir derzeit unbekannt ist. Ich werde wahrscheinlich nicht direkt da sein, um zu helfen, aber vielleicht per E-Mail Unterstützung geben, wenn ich Zeit dafür habe.
Als Entwickler, der funktionales Programmieren (Haskell) gelernt hat, neige ich dazu, beispielsweise folgende Filter zu lösen:
filtered = filter(lambda item: included(item.time, dur), measures)
Der Rest des Codes ist OO, es sind nur einige kleine Fälle, in denen ich ihn so lösen möchte, weil er meiner Meinung nach viel einfacher und schöner ist.
Frage : Ist es heute in Ordnung, Code wie diesen zu schreiben?
- Wie reagiert ein Entwickler, der FP nicht geschrieben / gelernt hat, auf Code wie diesen?
- Ist es lesbar
- Modifizierbar?
Soll ich einem Kind in einer Dokumentation erklären, was die Zeile bewirkt?
# Filter out the items from measures for which included(item.time, dur) != True
Ich habe meinen Chef gefragt, und er sagt nur: "FP ist schwarze Magie, aber wenn es funktioniert und die effizienteste Lösung ist, ist es in Ordnung, es zu verwenden."
Wie ist Ihre Meinung dazu? Wie reagieren Sie als Nicht-FP-Programmierer auf den Code? Ist der Code "googbar", damit Sie verstehen können, was er bewirkt? Ich würde mich über Feedback freuen.
# Select the item's from measures for which included(item.time, dur) == True
Wenn Sie ein doppeltes Negativ vermeiden, wird das Verständnis immer verbessert.Antworten:
Für mich: Ja, aber ich habe verstanden, dass die Python-Community Listenverständnisse oft als sauberere Lösung betrachtet als die Verwendung von
map()
/filter()
.Tatsächlich hat GvR sogar in Betracht gezogen , diese Funktionen ganz fallen zu lassen.
Bedenken Sie:
Dies hat außerdem den Vorteil, dass ein Listenverständnis immer eine Liste zurückgibt.
map()
undfilter()
auf der anderen Seite wird ein Iterator in Python 3 zurückgegeben.Hinweis: Wenn Sie stattdessen einen Iterator haben möchten, ist dies so einfach wie das Ersetzen
[]
durch()
:Um ehrlich zu sein, sehe ich wenig
map()
oder keinen Grund,filter()
Python zu verwenden.Ja, natürlich gibt es jedoch eine Sache, die das einfacher macht: Machen Sie es zu einer Funktion, nicht zu einem Lambda.
Wenn Ihre Bedingung komplexer wird, wird dies viel einfacher skalieren, und Sie können Ihren Scheck wiederverwenden. (Beachten Sie, dass Sie Funktionen in anderen Funktionen erstellen können. Dies kann dazu führen, dass sie näher an der Stelle sind, an der sie verwendet werden.)
Er googelt nach der Python-Dokumentation und weiß, wie es fünf Minuten später funktioniert. Ansonsten sollte er nicht in Python programmieren.
map()
undfilter()
sind extrem einfach. Es ist nicht so, dass Sie sie bitten, Monaden zu verstehen. Deshalb glaube ich nicht, dass Sie solche Kommentare schreiben müssen. Verwenden Sie gute Variablen- und Funktionsnamen, dann ist der Code fast selbsterklärend. Sie können nicht vorhersagen, welche Sprachfunktionen ein Entwickler nicht kennt. Nach allem, was Sie wissen, weiß der nächste Entwickler möglicherweise nicht, was ein Wörterbuch ist.Was wir nicht verstehen, ist für uns normalerweise nicht lesbar. Sie können also behaupten, dass es nicht weniger lesbar ist als ein Listenverständnis, wenn Sie noch nie eines von beiden gesehen haben. Aber wie Joshua in seinem Kommentar erwähnt hat, halte ich es auch für wichtig, mit anderen Entwicklern übereinzustimmen - zumindest, wenn die Alternative keinen wesentlichen Vorteil bietet.
quelle
map
undfilter
tun in Python 3.reduce
als Gegenbeispiel zu dem auf, dass Sie immer ein Argument für das Listenverständnis verwenden können , da es relativ schwierig ist, es durchreduce
einen Inline-Generator oder ein Listenverständnis zu ersetzen .Da sich die Entwicklergemeinschaft wieder für funktionale Programmierung interessiert, ist es nicht ungewöhnlich, dass einige funktionale Programmiersprachen ursprünglich vollständig objektorientiert waren. Ein gutes Beispiel ist C #, wo anonyme Typen und Lambda-Ausdrücke es ermöglichen, durch funktionale Programmierung viel kürzer und aussagekräftiger zu sein.
Das heißt, funktionale Programmierung ist komisch für Anfänger. Als ich zum Beispiel den Anfängern während eines Schulungskurses erklärte, wie sie ihren Code durch funktionale Programmierung in C # verbessern können, waren einige von ihnen nicht überzeugt, und einige sagten, dass der ursprüngliche Code für sie leichter zu verstehen sei. Das Beispiel, das ich ihnen gab, war das folgende:
Code vor dem Refactoring:
Gleicher Code nach dem Refactoring mit FP:
Das lässt mich denken, dass:
Sie sollten sich keine Sorgen machen, wenn Sie wissen, dass der nächste Entwickler, der Ihren Code wartet, über ausreichende allgemeine Erfahrung und einige Kenntnisse der funktionalen Programmierung verfügt, aber:
Vermeiden Sie andernfalls die funktionale Programmierung, oder geben Sie einen ausführlichen Kommentar ab, in dem Sie gleichzeitig die Syntax, die Vorteile und die möglichen Einschränkungen Ihres Ansatzes im Vergleich zu einer nicht funktionalen Programmierung erläutern.
quelle
Ich bin ein Nicht-FP-Programmierer und habe kürzlich den Code meines Kollegen in JavaScript geändert. Es gab eine HTTP-Anfrage mit einem Rückruf, der der von Ihnen enthaltenen Aussage sehr ähnlich sah. Ich muss sagen, dass ich einige Zeit (etwa eine halbe Stunde) gebraucht habe, um alles herauszufinden (der Code war insgesamt nicht sehr groß).
Es gab keine Kommentare, und ich glaube, es gab keine Notwendigkeit dafür. Ich habe meinen Kollegen nicht einmal gebeten, mir zu helfen, seinen Code zu verstehen.
Angesichts der Tatsache, dass ich ungefähr 1,5 Jahre arbeite, denke ich, dass die meisten Programmierer in der Lage sein werden, solchen Code zu verstehen und zu modifizieren, seit ich das getan habe.
Außerdem gibt es, wie Joachim Sauer in seinem Kommentar sagte, oft Stücke von FP in vielen Sprachen, wie z. B. C # (indexOf). So viele Nicht-FP-Programmierer beschäftigen sich ziemlich oft damit, und das von Ihnen enthaltene Code-Snippet ist weder schrecklich noch unverständlich.
quelle
Ich würde definitiv ja sagen!
Es gibt viele Aspekte der funktionalen Programmierung, und die Verwendung von Funktionen höherer Ordnung, wie in Ihrem Beispiel, ist nur einer davon.
Zum Beispiel halte ich das Schreiben von reinen Funktionen für äußerst wichtig für jede Software, die in einer beliebigen Sprache geschrieben wurde (wobei mit "rein" keine Nebenwirkungen gemeint sind), weil:
Ich vermeide es auch oft, Werte und Variablen zu verändern - ein anderes Konzept, das ich von FP übernommen habe.
Beide Techniken funktionieren problemlos in Python und anderen Sprachen, die normalerweise nicht als funktionsfähig eingestuft werden. Sie werden oft sogar von der Sprache selbst (dh
final
Variablen in Java) unterstützt. Auf diese Weise werden zukünftige Wartungsprogrammierer nicht vor einer enormen Hürde stehen, den Code zu verstehen.quelle
Wir hatten die gleiche Diskussion über ein Unternehmen, für das ich im letzten Jahr gearbeitet habe.
Die Diskussion betraf "magischen Code" und ob er gefördert werden sollte oder nicht. Bei genauerem Hinsehen schienen die Leute sehr unterschiedliche Ansichten darüber zu haben, was eigentlich "magischer Code" war. Diejenigen, die die Diskussion zur Sprache brachten, schienen hauptsächlich zu bedeuten, dass Ausdrücke (in PHP), die funktionalen Stil verwendeten, "magischer Code" waren, während Entwickler, die aus anderen Sprachen stammten, die mehr FP-Stil in ihrem Code verwendeten, anscheinend eher magischen Code hielten wenn Sie Dateien über Dateinamen usw. dynamisch einbinden.
Wir sind nie zu einem guten Schluss gekommen, mehr als die Leute denken, dass Code, der ungewohnt aussieht, "magisch" oder schwer zu lesen ist. Ist es also eine gute Idee, Code zu vermeiden, der anderen Benutzern unbekannt erscheint? Ich denke, dass es davon abhängt, wo es verwendet wird. Ich würde es unterlassen, fp-artige Ausdrücke (dynamische Einbeziehung von Dateien usw.) in einer Hauptmethode (oder in wichtigen zentralen Teilen von Anwendungen) zu verwenden, bei denen Daten auf eine klare und einfach zu lesende, intuitive Weise getunnelt werden sollen. Andererseits glaube ich nicht, dass man Angst haben sollte, den Briefumschlag zu schieben, die anderen Entwickler werden wahrscheinlich schnell FP lernen, wenn sie mit FP-Code konfrontiert sind und möglicherweise über eine gute interne Ressource verfügen, die sie zu diesen Themen konsultieren können.
TL; DR: Vermeiden Sie auf hoher Ebene zentrale Teile der Anwendungen (die gelesen werden müssen, um einen Überblick über die Funktionalität der Anwendung zu erhalten). Ansonsten benutze es.
quelle
Die C ++ - Community hat kürzlich auch Lambdas bekommen, und ich glaube, sie haben ungefähr die gleiche Frage. Die Antwort ist jedoch möglicherweise nicht dieselbe. Das C ++ - Äquivalent wäre:
Jetzt
std::copy
ist nicht neu und die_if
Varianten sind auch nicht neu, aber der Lambda ist es. Dennoch ist es im Kontext ziemlich klar definiert:dur
wird erfasst und ist daher konstant,Item i
variiert in der Schleife und die einzelnereturn
Anweisung erledigt die ganze Arbeit.Dies scheint für viele C ++ - Entwickler akzeptabel zu sein. Ich habe jedoch keine Meinungen zu Lambdas höherer Ordnung gesammelt, und ich würde eine viel geringere Akzeptanz erwarten.
quelle
Senden Sie einem Kollegen, der nicht so fließend Python spricht, einen Code-Snippet und fragen Sie ihn, ob er 5 Minuten lang den Code überprüfen kann, um zu sehen, ob er ihn versteht.
Wenn ja, sind Sie wahrscheinlich gut zu gehen. Wenn nicht, sollten Sie es klarer machen.
Könnte Ihr Kollege dumm sein und etwas nicht verstehen, das offensichtlich sein sollte? Ja, aber Sie sollten immer nach KISS programmieren.
Vielleicht ist Ihr Code effizienter / gut aussehender / eleganter als ein einfacher, idiotensicherer Ansatz? Dann müssen Sie sich fragen: Muss ich das tun? Wieder, wenn die Antwort nein ist, dann tu es nicht!
Wenn Sie nach all dem immer noch denken, dass Sie es auf die FP-Art und Weise brauchen und wollen, dann tun Sie es auf jeden Fall. Vertraue deinem Instinkt, sie sind besser für deine Bedürfnisse geeignet als die meisten Leute in irgendeinem Forum :)
quelle