it-swarm.dev

So organisieren Sie Funktionsprogramme

Mögliches Duplikat:
Functional Programming vs. OOP
Wie schreibe ich verwaltbaren Code mit funktionaler Programmierung?

In OOP ist Ihre grundlegende Organisationseinheit für Code die Klasse. Eine häufig verwendete Methode in Java, C # und ähnlichen Sprachen besteht darin, Ihren Code so zu organisieren, dass für jede Klasse eine Datei mit dem Dateinamen nach dem Klassennamen vorhanden ist.

Sie können jede dieser Klassen als Organisationseinheit betrachten, um ein einzelnes Konzept zu gruppieren.

Diese Klassen befinden sich in Namespaces, die häufig der Verzeichnisstruktur der Dateien in der Lösung/im Projekt folgen. Namespaces sind eine weitere Organisationsebene.

Wie sind große Projekte in funktionalen Sprachen normalerweise organisiert?

Wie bestimmen Sie, wie Sie Ihre Funktionen in verschiedene Dateien aufteilen?

Werden neben Dateien andere Gruppierungseinheiten verwendet?

Wie ist Code normalerweise in einer einzelnen Datei organisiert?

41
Gilles

Ich vermute, das hängt von der Sprache ab. Was die funktionale Programmierung angeht, habe ich mich hauptsächlich mit Haskell beschäftigt, daher werde ich erklären, wie es dort funktioniert.

Haskell-Code ist in "Module" organisiert, die im Grunde nur Sammlungen von Funktionen und Datentypen sind. Jedes Modul ist eine einzelne Datei. Ein Modul ist eine Mischung aus einer Java - Klasse und einem Java - Paket - der genaue Umfang der Funktionen eines Moduls variiert. Ein Modul hat auch die Kontrolle darüber, welche Funktionen und Typkonstruktoren exportiert und welche ausgeblendet werden sollen. Dies ähnelt private und public in Java.

In meinen eigenen Programmen möchte ich, dass Module eins semantisch tun; Dadurch sind sie wie eine Java - Klasse, außer dass sie möglicherweise mehrere Datentypen definieren. Die Module, die ich aus der Standardbibliothek verwende, wie Data.List, Sind eher Pakete - sie bieten eine Reihe ähnlicher Dienstprogrammfunktionen. Dies ist auch statischen Java Klassen wie Java.util.Arrays Sehr ähnlich.

Die Module sind auch insofern wie Java - Pakete, als sie aus Gründen der Übersichtlichkeit verschachtelt werden können (ich glaube nicht, dass dies Auswirkungen auf den Code selbst hat). Im Allgemeinen gebe ich einem einzelnen Projekt einen Namen (z. B. Project) und lasse alle meine Module Teil davon sein (z. B. Project.Parse Und Project.Run). Wenn ich Code schreiben würde, der eher einer Bibliothek als einer Anwendung ähnelt, würde ich ihn basierend auf den Funktionen wie Data.List Oder Control.Monad Organisieren. Ein wesentlicher Unterschied zu anderen Sprachen besteht darin, dass Haskell dazu ermutigt, IO einzuschränken und alles an einem Ort zu platzieren. Eine große Anzahl von Modulen macht überhaupt kein IO, und für ein bestimmtes Projekt möchte ich, dass so viele Module wie möglich rein sind.

Als Beispiel arbeite ich an einer einfachen Programmiersprache, die ich TPL nenne (ohne guten Grund). Zu diesem Zweck habe ich zwei einfache Module erstellt: TPL.Parse, Die die interne Darstellung der Sprache und deren Analyse definiert, und TPL.Run, Die den Interpreter ausführt und sich mit Variablen und E/A befasst. Zum tatsächlichen Kompilieren und Ausführen des Codes gibt es im Allgemeinen ein Main - Modul, das letztendlich der Einstiegspunkt des Programms ist.

Die Organisation der Funktionen in einer Datei bietet erhebliche Freiheiten. Das ist genau das, was ich gerne mache. Ich definiere meine Datentypen nach oben, bevor sie an anderer Stelle verwendet werden. Gleich nach dem Definieren der Datentypen implementiere ich alles, was ich brauche, um sie zu einem Teil der entsprechenden Typklassen zu machen - dies ähnelt einer Implementierung einer Schnittstelle. Dann folge ich mit Logik und verschiedenen Hilfsfunktionen, je nach Bedarf. Schließlich möchte ich alle meine IO - Funktionen ganz unten haben und mit main enden. Dies macht deutlich, was genau IO tut und wo das Programm startet.

Zusammenfassend: Funktionen sind in Modulen enthalten, die jeweils aus einer einzigen Datei bestehen. Mehrere Module können ein Programm oder eine Bibliothek bilden. Ersteres enthält im Allgemeinen ein Main - Modul, das als Einstiegspunkt dient. Innerhalb einer Datei gibt es verschiedene Optionen für die Organisation, aber ich bevorzuge es, Datentypen oben, IO unten und Logik in der Mitte zu gruppieren.

32
Tikhon Jelvis