Was sind einige bewährte Methoden, wenn Sie versuchen, imperativen Programmierern deklaratives Programmieren beizubringen?

13

Ich habe angeboten, ein bisschen in F # in meiner Firma zu trainieren, und sie schienen ein gewisses Interesse zu zeigen. Es sind in der Regel VB6- und C # -Programmierer, die dem Programmieren nicht mit allzu großer Leidenschaft folgen. Abgesehen davon denke ich, dass es einfacher ist, korrekten Code zu schreiben, wenn Sie an eine funktionale Angelegenheit denken, sodass sie definitiv einen gewissen Nutzen daraus ziehen sollten.

Kann mir jemand einen Rat geben, wie ich das angehen soll?

Ideen

  • Konzentrieren Sie sich nicht auf die Syntax, sondern darauf, wie diese Sprache und die damit beworbenen Redewendungen verwendet werden können.
  • Versuchen Sie, Beispiele zu finden, die nicht unbedingt zu schreiben sind, die sich aber in deklarativer Form in elegantem Code niederschlagen lassen.
ChaosPandion
quelle
F # und deklarative Programmierung ?????
P Shved
@Pavel - Ist das eine Frage?
ChaosPandion
3
@Pavel - OK, bitte erklären Sie, warum Sie die Erklärung abgegeben haben. Dies ist das zweite Mal, dass Sie äußerst vage Kommentare abgegeben haben. Es ist sehr unhöflich.
ChaosPandion
3
en.wikipedia.org/wiki/Declarative_programming Funktionale Programmierung ist eine Art deklarative Programmierung. Auch +1, gute Frage.
Hinweis für sich selbst - denken Sie an einen Namen
2
@Chaos, meiner Meinung nach, unterstützt F # das deklarative Programmierparadigma nicht. Die eifrige Bewertung und die zwingenden Merkmale machen die Sprache lediglich zu einer praktischen, funktionalen Form, um dieselben zwingenden Aussagen zu kennzeichnen, die Sie beispielsweise in C # verwenden. Komm schon, ist sogar makeeher eine deklarative Sprache als F # oder Caml! (Ironischerweise erleichtert dies Ihre Arbeit.)
P Shved

Antworten:

5

Funktionale Programmierung ist für mich ein merkwürdiges Biest. Ich habe F # und Haskell gelernt, habe ein paar einfache Programme geschrieben und liebe es, sie zu verwenden, aber ich hatte nie den "Blitz der Offenbarung", über den manche Leute sprechen. Aber langsam bemerkte ich, dass ich immer mehr Code schrieb, der unveränderlich sein sollte, Aufgaben in mehr, kleinere Funktionen aufteilte und versuchte, Delegierte viel mehr zu verwenden. Es ist eine Sache, die sich, wenn Sie es mögen, in Ihre Arbeit einschleicht, weil der Wert dieser Techniken offensichtlich ist.

Jetzt praktischer zum Training: Ich finde, dass zwei Konzepte für mich wirklich auf Functional Programming als Stil klicken.

Erstens basiert der FP-Stil auf der Datenstruktur und nicht auf der Komposition wie in OOP. Ich betrachtete etwas wie List in C # als einen cleveren Trick, um typsichere Listen zu generieren, etwas, das den Typ (String) in den anderen Typ (Liste) zusammensetzte. Nachdem ich FP gelernt habe, schaue ich mir Generika an, die jetzt eher Monaden ähneln. List ist eine strukturierte Form, die Code annehmen kann und die Zeichenfolgen schmückt.

Zweitens und möglicherweise nützlicher für C # / ASP-Programmierer ist die Idee, dass FP an Rekursion und Wiederholung arbeitet, während OOP an Veränderlichkeit und Schleifen arbeitet. Ich neige dazu, den ASP-Seitenlebenszyklus als eine Art FP zu betrachten: Jede Anforderung wird von Grund auf über den gesamten Lebenszyklus hinweg verarbeitet, sodass die gesamte Seite praktisch ein einziges großes, langsam wiederkehrendes Programm ist. Wenn Sie diesen Begriff eingrenzen können, erhalten Sie eine bessere Vorstellung davon, wie ein Imperativprogramm aus Schleifen von Funktionen aufgebaut sein kann, die Daten aufnehmen, darüber arbeiten und neue Daten zurückgeben, anstatt die alten zu ändern.

Die schwierigste Hürde, zumindest für mich, mit diesem Ansatz zu überwinden, ist das sinkende Gefühl, dass Sie Tonnen von Ressourcen verschwenden, wenn Sie veränderbare Objekte verwenden, was eine Menge Speicherplatz einsparen würde. Wir vertrauen auf GC, und ich musste erst lernen, Leistungsprobleme loszulassen, bevor ich das Programm tatsächlich laufen sah und verifizierte, ob es überhaupt welche gab, und wenn ja, einen Profiler zu verwenden, um genau zu sehen, wo die Probleme waren.

CodexArcanum
quelle
1

Viele imperative Programmiersprachen (Ada, C / C ++, Turbo Pascal, FoxPro) können Zeiger auf Funktionen oder Prozedurnamensliterale definieren, die zur Laufzeit ausgewertet werden können (und die nach dem aufgerufenen Literal benannten Prozeduren).

Das traditionelle Beispiel ist qsort in C. Bauen Sie darauf auf, dass Sie Algorithmen definieren können, die andere Algorithmen für Datenstrukturen ausführen . Offensichtlich ist dies nur ein Bruchteil dessen, was funktionale Programmierung ist. Aber ich habe festgestellt, dass dies ein guter Ausgangspunkt ist, um die Idee zum Eintauchen zu bringen.

Sobald dies eintritt, können Sie beginnen, sich mit anderen Dingen (Unveränderlichkeit, Teilen-Nichts usw.) zu beschäftigen.

luis.espinal
quelle
Korrektur: Ich möchte damit sagen , dass Sie parametrisierte Algorithmen definieren können, die ANDERE Algorithmen als Parameter verwenden und auf Datenstrukturen ausführen können.
Luis.espinal
1

Kann mir jemand einen Rat geben, wie ich das angehen soll?

Sicher:

  • Wählen Sie Ihre Beispiele sorgfältig aus, damit Ihr F # -Code ein Problem nicht nur elegant, sondern auch viel eleganter löst, als dies mit C # / VB möglich ist . Pattern Matching und Type Inference sind deine Freunde hier.

  • Verwenden Sie ein Beispiel, um die Vorteile der neuen Funktion in F # hervorzuheben, z. B. asynchrone Workflows und aktive Muster.

  • Haben Sie keine Angst davor, unreine Beispiele mit veränderlichen Datenstrukturen zu nennen, wenn dies angebracht ist. F # ist aus einem bestimmten Grund unrein.

  • Präsentieren Sie F # nicht als Allheilmittel. Beschreiben Sie Anwendungen, für die F # nicht so gut geeignet ist wie für Anwendungen, für die es viel besser geeignet ist als andere .NET-Sprachen.

  • Zeigen Sie auf Spielzeugproben, die sie studieren können, sowie auf erfolgreiche Projekte in der Praxis, die F # verwendeten (Bing AdCenter, Halo 3 usw.).

  • Erklären Sie alles, wie F # ihnen helfen kann, Probleme leichter zu lösen. Vermeiden Sie religiöse Debatten. Bleiben Sie positiv in Bezug auf F # und nicht negativ in Bezug auf andere Sprachen. Bewaffnen Sie sie mit Fakten und Beweisen, aber lassen Sie sie ihre eigenen Schlussfolgerungen ziehen.

Jon Harrop
quelle