FP und OO orthogonal?

13

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?

letronje
quelle
5
Objektorientierung erfordert keine Objekte, um ihren Zustand zu manipulieren. Methoden können neue Objekte als Ergebnisse zurückgeben. Die Tatsache, dass man den Zustand eines Objekts ändern kann und oft auch tut, bedeutet nicht, dass dies der Fall ist oder dass dies eine gute Idee ist. OO und FP sind keine Gegensätze.
Huperniketes
4
Doppelter Stackoverflow: FP und OO orthogonal?
16.

Antworten:

22

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 .

Frank Shearar
quelle
+1, tolle Antwort. Ihre Antwort fehlt jedoch bei Haskell-Typenklassen.
Fehlender Faktor
Sicher. Ich habe gerade erst angefangen, Haskell zu lernen.
Frank Shearar
Ich frage mich, ob es eine Aufzeichnung dieser Functional Objects-Präsentation gibt ... Ich bin wirklich interessiert, aber Folien allein werden dem nicht wirklich gerecht.
Rei Miyasaka
9

Was bedeutet es zunächst, wenn zwei Konzepte orthogonal sind?

Dies bedeutet, dass die beiden Konzepte keine gegensätzlichen Vorstellungen haben oder nicht miteinander unvereinbar 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. Wie wirkt es sich auf ihre Orthogonalität aus?

Eine Sprache wie Scala macht es einfach, OO und FP zu machen. Beeinflusst dies die Orthogonalität der beiden Methoden?

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 .

Fehlender Faktor
quelle
1
"Das bedeutet, dass die beiden Konzepte keine gegensätzlichen Vorstellungen haben oder nicht miteinander unvereinbar sind." - Das stimmt, aber ich denke, ich würde so etwas wie " eindeutig, aber nicht inkompatibel" sagen . Wenn zum Beispiel eine Untergruppe der anderen wäre, wären sie nicht inkompatibel, aber auch nicht orthogonal.
Tim Goodman
@ Tim: Das war mein [vielleicht gescheiterter] Versuch, den Begriff zu definieren. Ich bin kein englischer Guru, wie du siehst. : - |
Fehlender Faktor
7

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.

Notiz an mich selbst - denke an einen Namen
quelle
2
"Independent" ist ein guter Weg, um es auszudrücken. Es ist nicht so, dass sie gegensätzlich sind, aber ob Ihr Code ein funktionaler Programmierstil oder ein objektorientierter Programmierstil ist, sind zwei verschiedene Dinge. Stellen Sie sie sich wie die x- und y-Achse in einem Diagramm vor - Sie können sich auf und ab bewegen, während Sie auf der anderen fixiert bleiben. (Im mathematischen Sinne sind ein Vektor in der x-Richtung und ein Vektor in der y-Richtung buchstäblich orthogonal - die CS-Definition ist verwandt.)
Tim Goodman,
@ TimGoodman: Ich mochte die x, y-Achse in der von Ihnen erstellten Diagrammanalogie wirklich. Kann dies auf das Endergebnis abgebildet werden, das erreicht wird, wenn eine Bewegung in eine Richtung gegen eine andere erfolgt (ich meine, letztendlich ist es das Ziel beider Programmierparadigmen, einfacheren und wartbaren Code zu haben, nicht
wahr
0

* 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.

Turm
quelle