Ich habe dies immer wieder gehört und versuche zu verstehen und zu bestätigen, dass FP und OO orthogonal sind.
Was bedeutet es zunächst, wenn zwei Konzepte orthogonal sind?
FP fördert die Unveränderlichkeit und Reinheit so weit wie möglich. und OO scheint etwas zu sein, das auf Staat und Mutation ausgelegt ist (eine leicht organisierte Version der imperativen Programmierung?). Und mir ist klar, dass Objekte unveränderlich sein können. Aber OO scheint für mich Zustand / Veränderung zu implizieren.
Sie scheinen Gegensätze zu sein. Bedeutet das, dass sie orthogonal sind?
Eine Sprache wie Scala macht es einfach, OO und FP zu machen. Beeinflusst dies die Orthogonalität der beiden Methoden?
Antworten:
Der Begriff "orthogonal" stammt aus der Mathematik und hat ein Synonym: "senkrecht". In diesem Zusammenhang könnte man es als "die beiden Dinge haben nichts miteinander zu tun."
Wenn Menschen FP und OO vergleichen, verwechseln sie oft zwei separate Achsen.
Einerseits haben Sie funktionale Programmierung gegenüber imperativer Programmierung. Jonas gibt einen guten Vergleich der beiden. Die Ein-Satz-Version besagt, dass "Datenfluss versus Kontrollfluss".
Die andere Achse ist die Datenabstraktion. Sprachen wie Haskell verwenden abstrakte Datentypen für abstrakte Daten. Smalltalk verwendet Objekte, die die Daten und Vorgänge für diese Daten zu einer Einheit zusammenfassen. William Cook erklärt dies besser, als ich es in seinem Aufsatz Über das Verständnis von Datenabstraktion, Revisited, könnte .
Es ist vollkommen verständlich, dass die meisten Leute am Ende denken, FP und OO seien Gegensätze: Die meisten OO-Sprachen sind unerlässlich. Wenn Sie also beispielsweise Haskell und Java vergleichen, haben Sie Datenfluss + ADT im Vergleich zu Kontrollfluss + Objekt. Es gibt aber auch andere Möglichkeiten! Matthias Felleisen erklärt in seinem Vortrag Functional Objects , wie man FP und OO glücklich heiratet .
quelle
Dies bedeutet, dass die beiden Konzepte keine gegensätzlichen Vorstellungen haben oder nicht miteinander unvereinbar sind.
Bei OO geht es um Kapselung, Objektzusammensetzung, Datenabstraktion, Polymorphismus durch Subtypisierung und gegebenenfalls kontrollierte Mutation (Unveränderlichkeit wird auch in OO gefördert). In FP geht es um Funktionszusammensetzung, Kontrollabstraktion und eingeschränkten Polymorphismus (auch als parametrischer Polymorphismus bekannt). Somit sind die beiden Ideen nicht widersprüchlich. Beide bieten Ihnen verschiedene Arten von Kräften und Abstraktionsmechanismen, die sicherlich in einer Sprache verfügbar sein können. Tatsächlich ist dies die These, auf der Scala aufgebaut wurde!
In seinem Scala-Experiment- Vortrag bei Google erklärt Martin Odersky sehr gut, wie er der Ansicht ist, dass die beiden Konzepte - OO und FP - orthogonal zueinander sind und wie Scala die beiden Paradigmen elegant und nahtlos zu einem neuen Paradigma vereint, das in der Scala-Community als bekannt ist Objekt-Funktions-Paradigma. Ich muss zusehen, wie ich für dich rede. :-)
Andere Beispiele für objektfunktionale Sprachen: OCaml , F # , Nemerle .
quelle
Orthogonal bedeutet ungefähr "unabhängig".
Wenn FP und OO also orthogonal sind, bedeutet dies, dass Sie die Unveränderlichkeit verwenden können, unabhängig davon, ob Sie Objekte verwenden oder nicht, und Sie können Objekte verwenden, unabhängig davon, ob sie unveränderlich sind oder nicht.
quelle
* Ich habe dies immer wieder gehört und versuche zu verstehen und zu bestätigen, dass FP und OO orthogonal sind. *
Was bedeutet es zunächst, wenn zwei Konzepte orthogonal sind?
Wikipedia-Zitat: "Orthogonalität garantiert, dass das Ändern des technischen Effekts, der durch eine Komponente eines Systems erzeugt wird, keine Nebenwirkungen erzeugt oder auf andere Komponenten des Systems überträgt."
Dies bedeutet lediglich, dass die Änderung an einem System keine Auswirkungen auf eine Änderung im anderen System hat und haben kann.
Zum Beispiel hat ein Auto orthogonale Komponenten und Bedienelemente (z. B. das Beschleunigen des Fahrzeugs beeinflusst nichts anderes als die Komponenten, die ausschließlich mit der Beschleunigungsfunktion zu tun haben. Es wirkt sich beispielsweise nicht auf das Radio aus (obwohl ich nicht sicher bin, ob es das Abspielen von CDs beeinflusst, da meins manchmal überspringt)).
FP fördert die Unveränderlichkeit und Reinheit so weit wie möglich. und OO scheint etwas zu sein, das auf Staat und Mutation ausgelegt ist (eine leicht organisierte Version der imperativen Programmierung?). Und mir ist klar, dass Objekte unveränderlich sein können. Aber OO scheint für mich Zustand / Veränderung zu implizieren.
Sie scheinen Gegensätze zu sein. Bedeutet das, dass sie orthogonal sind?
Irgendwie. Das Problem ist, dass keines dieser Konzepte wirklich steinhart definiert ist. Aber ja, Sie haben es verstanden.
quelle