Frage

Wie ich habe durch Stackoverflow Antworten und Fragen, die ich den Eindruck, dass ich immer OO Kompartimente ist von Natur zwingend notwendig, um zu sein.

Aber ist nicht OO nur eine Möglichkeit, Code und Daten in der realen Welt Objekte compartmentalize?

Wenn ja, warum würde, dass verzichten andere untere Ebene Paradigma in einer solchen Plattform zu arbeiten?

IOW, ein objektbasiertes generisches Typsystem, das standardmäßig unveränderlich ist, würde die Art und Weise eine funktionelle erste Sprache sein funktionieren würde, ein Objekt auf Basis generisches Typ-System, das standardmäßig wandelbar ist wäre die Welt von imperativen Sprachen.

Oder bin ich etwas fehlt ganz?

War es hilfreich?

Lösung

Nein . OO und zwingend notwendig sind zwei orthogonale Konzepte.

Zum Beispiel:

  • Die Common Lisp Object System ist ein Beispiel für Lisp OO und vielleicht das komplexeste Objekt-System um.
  • OCaml ist eine funktionale Sprache mit einem Objektsystem und ein Modulsystem Stützobjektorientierte Organisation
  • Scala ist eine funktionale Sprache mit einem sehr flexiblen OO-System
  • Haskell ermöglicht es Ihnen, objektorientierten Code mit höheren kinded Polymorphismus
  • schreiben

Es gibt viele verschiedene Möglichkeiten, objektorientiert zu sein.

Andere Tipps

Die meisten OO-Sprachen sind zwingend notwendig, aber Sie können sie in einem etwas funktionalen Stil verwenden. Einige funktionalen Sprachen sitzen auf einen OO-Framework (F # auf .NET ist das offensichtlichste Beispiel) Abwägen etwas „Reinheit“, um einen massiven Rahmen zu bekommen, wo angemessen zu verwenden.

Ich denke, es gibt ein Los Platz für „hauptsächlich OO“ Sprachen, mehr zu tun Programmierung in einem funktionalen Stil zu helfen - ein bessere Unterstützung für Unveränderlichkeit ist das offensichtlichste Merkmal, möglicherweise durch eine bessere Typinferenz gefolgt . (Zumindest, wenn man über C #, das ist wahrscheinlich das wichtigste Beispiel für eine traditionelle Sprache, einen Fuß in der funktionalen Tür zu bekommen versuchen.)

Ja. Objektorientiert ist eine Art der Programmierung, die es dem Programmierer ermöglicht, ein Programm als eine Gruppe von Stateful-Objekte auszudrücken wirkenden und die Interaktion (typischerweise durch Message-Passing in dynamisch typisierten Sprachen und Verfahren-Aufruf in statisch typisierten Sprachen), und so in einer bestimmten Reihenfolge zu tun.

State, Aktion und Reihenfolge sind Konzepte aus prozeduralen Programmierung und sind nicht in nonmonadic funktionaler Programmierung (Monaden werden verwendet, Zustand, Action und Reihenfolge in den reinen funktionalen Sprachen Haskell zu implementieren, die sonst nicht diese Konzepte haben).

Um es aus einer anderen Perspektive zu betrachten, wie die meisten Menschen unbedingt zu denken (und nicht in Rekursion oder RPN). Daraus folgt, dass die meisten Sprachen unerlässlich sein wird.

Natürlich sind viele Probleme viel einfacher auszudrücken (oder zu lösen) mit einem nicht zwingend notwendig Ansatz (zB Benutzeroberflächen), aber die meisten Menschen fühlen sich nicht wirklich wohl mit diesem Ansatz. Manche mögen es nicht, die ausgetretenen Pfade verlassen, während andere wirklich Schwierigkeiten haben, die mentale Veränderung zu tun notwendig, um Probleme von dieser Seite (Denken in Methodenaufrufen und Rekursion anstelle von Variablen und Schleifen) zu nähern.

Ich bin fest davon überzeugt, dass Objektorientierung ein von Natur aus Imperativ Konzept. Doch als letzte Frage ich etwas mehr über Programmierparadigmen im Allgemeinen denken ließ, habe ich zusammen eine umfassendere Antwort, die etwas off-topic, aber übrigens auch beantwortet Ihre Frage:

Die 2 wichtigsten Programmierparadigmen sind die deklaratives Paradigma , wo der Programmierer abstrakte Beziehungen schreibt (also die Compiler zu sagen was er will), und den Imperativ Paradigma , wo der Programmierer Algorithmen schreibt (also den Computer zu sagen wie zu bekommen, was er will).

Die Paradigmen a priori sprachunabhängig - es ist eher eine Art und Weise, wie denken Sie über und Ihr Programm strukturieren. Allerdings gibt es Unterschiede, wie einfach eine Sprache, macht es zu einem Paradigma zu verwenden. Sprache Semantik und Syntax führen zu einem idiomatischen Weg, um Code zu schreiben

Ein Beispiel für eine deklarative Sprache wäre Prolog, ein Beispiel für eine imperative Sprache Fortran wäre (und Echte Programmierer Fortran-Programme in jeder Sprache schreiben kann ).

Als ein Beispiel für Code, der zugleich zwingend notwendig und deklarative ist, sollten Sie diese Implementierung der Fibonnaci-Sequenz in Perl6:

my @fibonacci-sequence := 0, 1, * + * ... *;

Dies ist eindeutig eine deklarative Beschreibung der Sequenz. Doch wie * und ... gelten Perl6 Betreiber - das, was auch immer-Stern kann verwendet werden, Lambda-Ausdrücke zu erstellen, der Sequenz-Operator zu erstellen faul Listen -. Es ist auch eine unbedingte Anweisung Aufruf Runtime-Eigens Code

Lassen Sie uns einige andere Programmierparadigmen berücksichtigen, insbesondere funktionale und objektorientierte Programmierung.

Die funktionale Paradigma ist von Natur aus deklarativen, wie es Modelle Berechnung als eine Beziehung zwischen den Sätzen.

Das objektorientierte Paradigma ist von Natur zwingend notwendig, da es Modellen Berechnung wie die Kommunikation zwischen Stateful Objekten, die so genannten Message Passing.

Einige Sprachen sind rein, alle Berechnung Sinn entspricht das Paradigma. Zum Beispiel ist Haskell eine rein funktionale Sprache und Smalltalk ist eine rein objektorientierte Sprache.

Allerdings bedeutet dies nicht, dass diese funktionalen Sprachen resp. objektorientierten Sprachen verhindern unerlässlich resp. deklarative Programmierung. In der Praxis verwenden Sie oft Funktionen imperativ - Sie in einem Eingabewert setzen einen Ausgangswert raus. Das Gegenteil gilt für die objektorientierte Programmierung. Die Menge von Nachrichten ein Objekt akzeptiert erklärt seine Schnittstelle

Manche Menschen uneinig über OO ein Imperativ Konzept zu sein, also hier ist meine Argumentation.

Objektorientierung Wesentliche:

  1. Objekte halten Zustand (dh Verweise auf andere Objekte)
  2. Objekte erhalten (und Verfahren) Nachrichten
  3. eine Nachricht verarbeiten kann zu
    • Nachrichten beeing auf das Objekt selbst oder andere Objekte
    • gesendet
    • eine Änderung in dem Zustand des Objekts

Das bedeutet, oo-Programmierung erfordert wandelbaren Zustand durch das Objekt gehalten (!) . Wenn Sie Zustandsänderung simulieren, indem eine Reihe von Objekten zu schaffen, sind Sie diese Invarianten zu brechen, einfach.

flamebait:. Wenn Sie mit dieser Definition der Objektorientierung nicht einverstanden sind, nehmen Sie es mit Alan Kay up

Viele verschiedene Konzepte tragen zu dem Konzept der objektorientierten Programmierung. Wikipedia mosts von ihnen aufgelistet sind.

Ich würde das Wesen der OOP durch die Verwendung von Objekte mit Behaviors .

Wikipedia kennzeichnet Objekte durch die folgenden drei Eigenschaften:

  1. Identity : die Eigenschaft eines Objekts, die es von anderen Objekten
  2. unterscheidet
  3. Staat : beschreibt die in dem Objekt gespeicherten Daten
  4. Verhalten : beschreibt die Methoden in der Schnittstelle des Objekts, durch die das Objekt verwendet werden

Viele objektorientierte Sprache haben ein Konzept von Klassen, aber eigentlich gibt es auch Prototype -basierte Sprachen wie JavaScript.

Funktionale Sprachen können auch verwenden Klassen (zum Beispiel Typ-Klassen in Haskell). Aber nur, weil sie Klassen haben, bedeutet das nicht, dass sie objektorientiert sind oder objektorientierte Programmierung ermöglichen. Zu Bleiben mit dem Beispiel von Haskell: Sie haben nicht einmal Objekte haben! Es gibt kein solches Konzept als „Identität“! Alles, was Sie komponiert reine Funktionen tun können!

Nur weil jemand ist mit einem Begriff namens „Klassen“, bedeutet dies nicht, dass sie objektorientierte Programmierung tun!

OOP ist etwa Stateful Objekte mit Verhalten. Obwohl das Verhalten von Objekten nicht das Objekt ändern müssen, weil neue Objekte stattdessen erstellt werden können, sollten Sie die Notwendigkeit von Gegenständen vollständig verlieren. Sie würden Identitäten nicht mehr brauchen, weil es keine Rolle, ob die Änderungen an ein Objekt durch andere Verweise auf das gleiche Objekt reflektiert werden, weil es keine Änderungen mehr sein würde. Alles, was Sie brauchen, sind Werte (ohne Identität) und Module und / oder Klassen für Datenkapselung und Verkapselung.

So Ja , imperative Programmierung ist inhärent OOP.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top