Hintergrund: Ich bin Befürworter der funktionalen Programmierung und arbeite in einem VB.NET-Shop, in dem das vorherrschende mentale Modell die zwingende Programmierung ist. Die Grundlage unseres Systems ist WinForms. Ich kann verstehen, dass wir nicht ganz von der imperativen Programmierung loskommen, aber ich versuche trotzdem, FP (hauptsächlich über Linq) zu verwenden, wo immer es möglich ist, weil ich an seine Vorzüge glaube.
Argumente & Gegenargumente gegen FP
Man könnte bemerken, dass fließendes Linq weniger effizient ist als sein zwingendes Gegenstück, da dieser Stil eine Sequenz bis zu einer anderen Sequenz verarbeitet und diese wiederholt. Im Allgemeinen dauert es ein paar Mal länger als der imperative Ansatz, der besser optimiert werden kann, um wiederholte Übergänge über eine Sequenz zu vermeiden. Aus diesem Grund konnte der Lead nicht verstehen, warum ich einen funktionalen Ansatz wählen würde, der eindeutig "weniger effizient" ist.
- Gegenargument : Ich argumentierte, dass es, obwohl es in Bezug auf die CPU-Zyklen manchmal weniger effizient ist, meiner Meinung nach verständlicher und leichter zu befolgen ist, da jede Zeile beim Durchlaufen der Sequenz nur eines tut. Für mich fühlt es sich so an, als hätte man ein Fließband, an dem jeder an seiner Station nur eine Aufgabe hat. Ich bin der Meinung, dass der vernachlässigbare Nachteil der Effizienz durch Code kompensiert wird, dessen Anliegen sauber voneinander getrennt sind.
Das nächste Argument gegen FP, das ich in meinem Shop höre, ist, dass es schwerer zu debuggen ist - was wahr ist. Es ist nicht einfach, über Linq-Code zu springen. Und manchmal muss ich eine Methodenkette auflösen, um Probleme, die ich nicht sofort erkennen kann, besser verfolgen und analysieren zu können.
- _Gegenargument: Meistens habe ich kein Problem damit, da ich denke, dass der Funktionsstil aussagekräftiger ist, wenn ein Fehler in einer Funktionskette auftritt, kann ich das Problem normalerweise sofort erkennen.
Meine Frage
Ich habe versucht, den funktionalen Stil in unserem Geschäft zu fördern, und ich habe nicht das Gefühl, dass ich Fortschritte mache. Ich habe beide Arten der Programmierung gemacht und mich erst kürzlich in Haskell versucht. Trotz jahrelanger unerlässlicher Erfahrung, seitdem ich FP in JavaScript routinemäßig verwende, ist es auf mich angewachsen. In meinem Kern klingt es richtig, wenn ich es mit dem vergleiche, was ich getan hätte, wenn ich mich an einen imperativen Stil gehalten hätte. Ich habe mein Gehirn auf funktionales Denken, auf funktionale Komposition umgeschult.
Was ich nicht verstehen kann, ist, wie schwer es war, andere von den Verdiensten von FP zu überzeugen.
Zum Beispiel verwenden die Entwickler in meinem Shop Linq, aber ich denke, sie verwenden es im Allgemeinen im Kontext des Umgangs mit Domänendaten. Ich benutze es allgemeiner und bevorzuge es, wenn ich mit Sequenzen / Listen oder persistenten Datenstrukturen zu tun habe. Ich war nicht in der Lage, meine Teamkollegen davon zu überzeugen, den Einsatz von Linq zu erweitern.
Ich versuche zu verstehen, warum ein Entwickler FP nicht mag.
Ich würde gerne eine Antwort von jemandem sehen, der viel Erfahrung mit FP hat, sich aber für den imperativen Stil entschieden hat. Was war der Grund für die Entscheidung, bei Imperativ zu bleiben, anstatt Funktional zu verwenden?
Hier ist ein zusätzliches Beispiel, das die Unterschiede zwischen imperativer und funktionaler Programmierung hervorhebt.
Ich habe die SelectedRows
Methode unseres Rasters in Linq so geschrieben:
Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows
Get
Return Me.ugrBase.Selected.Rows.
OfType(Of Infragistics.Win.UltraWinGrid.UltraGridRow)().
Select(Function(ugr) ugr.ListObject).
OfType(Of DataRowView)().
Select(Function(drv) drv.Row).
ToArray
End Get
Diese Art von Code macht es einigen Entwicklern jedoch unangenehm, und so hat unser Lead ihn an die Vertrauten weitergegeben:
Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows
Get
Dim plstRows As New List(Of DataRow)
For Each bugrLoop As Infragistics.Win.UltraWinGrid.UltraGridRow In Me.ugrBase.Selected.Rows
If bugrLoop.ListObject IsNot Nothing Then
plstRows.Add(CType(bugrLoop.ListObject, DataRowView).Row)
End If
Next
Return plstRows.ToArray()
End Get