Aufgrund meiner (zugegebenermaßen eingeschränkten) Erfahrung mit funktionalen Programmiersprachen wie Clojure scheint die Kapselung von Daten eine weniger wichtige Rolle zu spielen. Normalerweise sind verschiedene native Typen wie Karten oder Mengen die bevorzugte Währung für die Darstellung von Daten gegenüber Objekten. Darüber hinaus sind diese Daten im Allgemeinen unveränderlich.
Hier zum Beispiel eines der bekannteren Zitate von Rich Hickey von Clojure in einem Interview zu diesem Thema :
Fogus: Dieser Idee folgend - einige Leute sind überrascht über die Tatsache, dass Clojure keine datenversteckenden Kapselungen für seine Typen vornimmt. Warum haben Sie sich entschieden, auf das Verbergen von Daten zu verzichten?
Hickey: Lassen Sie uns klarstellen, dass Clojure die Programmierung von Abstraktionen stark betont. Irgendwann muss jemand Zugriff auf die Daten haben. Und wenn Sie eine Vorstellung von „privat“ haben, brauchen Sie entsprechende Vorstellungen von Privilegien und Vertrauen. Und das erhöht die Komplexität und den Wert des Systems um eine ganze Menge, schafft Starrheit in einem System und zwingt die Dinge oft dazu, an Orten zu leben, an denen sie nicht sein sollten. Dies kommt zu den anderen Verlusten hinzu, die auftreten, wenn einfache Informationen in Klassen eingeteilt werden. In dem Maße, in dem die Daten unveränderlich sind, kann die Bereitstellung des Zugriffs nur wenig schaden, außer dass jemand von etwas abhängen könnte, das sich ändern könnte. Okay, die Leute machen das die ganze Zeit im wirklichen Leben und wenn sich die Dinge ändern, passen sie sich an. Und wenn sie rational sind, Sie wissen, wann sie eine Entscheidung treffen, die auf etwas basiert, das sich ändern kann und das sie möglicherweise in Zukunft anpassen müssen. Es ist also eine Risikomanagement-Entscheidung, die Programmierer meiner Meinung nach frei treffen sollten. Wenn die Leute nicht die Sensibilität haben, auf Abstraktionen programmieren zu wollen und die Details der Implementierung nicht zu kennen, werden sie niemals gute Programmierer sein.
Aus der OO-Welt stammend, scheint dies einige der verankerten Prinzipien, die ich im Laufe der Jahre gelernt habe, zu verkomplizieren. Dazu gehören Information Hiding, das Demeter-Gesetz und das Prinzip des einheitlichen Zugriffs, um nur einige zu nennen. Der rote Faden ist, dass die Kapselung es uns ermöglicht, eine API zu definieren, damit andere wissen, was sie berühren sollen und was nicht. Im Wesentlichen sollte ein Vertrag erstellt werden, der es dem Betreuer eines Codes ermöglicht, Änderungen und Umgestaltungen frei vorzunehmen, ohne sich Gedanken darüber zu machen, wie Fehler in den Code des Verbrauchers eingefügt werden könnten (Open / Closed-Prinzip). Es bietet auch eine saubere, kuratierte Oberfläche, über die andere Programmierer wissen, welche Tools sie verwenden können, um auf diese Daten zuzugreifen oder darauf aufzubauen.
Wenn auf die Daten direkt zugegriffen werden darf, ist dieser API-Vertrag ungültig und alle diese Vorteile der Kapselung scheinen verschwunden zu sein. Darüber hinaus scheinen streng unveränderliche Daten die Weitergabe domänenspezifischer Strukturen (Objekte, Strukturen, Datensätze) im Sinne der Darstellung eines Zustands und der Menge von Aktionen, die für diesen Zustand ausgeführt werden können, weniger nützlich zu machen.
Wie gehen funktionale Codebasen mit diesen Problemen um, die auftreten, wenn die Größe einer Codebasis enorm zunimmt, sodass APIs definiert werden müssen und viele Entwickler an der Arbeit mit bestimmten Teilen des Systems beteiligt sind? Gibt es Beispiele für diese Situation, die veranschaulichen, wie dies in solchen Codebasen gehandhabt wird?
Also, strictly immutable data seems to make passing around domain-specific structures (objects, structs, records) much less useful in the sense of representing a state and the set of actions that can be performed on that state.
Nicht wirklich. Das einzige, was sich ändert, ist, dass die Änderungen auf einem neuen Objekt enden. Dies ist ein großer Gewinn, wenn es darum geht, über den Code nachzudenken. Wenn Sie veränderbare Objekte weitergeben, müssen Sie nachverfolgen, wer sie möglicherweise verändert. Dieses Problem hängt von der Größe des Codes ab.