Frage

Da es sich um eine Debatte ohne sinnvolle Begriffe handelt bedeutungslos, dachte ich, ich würde auf den Elefanten im Raum zeigen und fragen:Was genau macht eine Sprache „objektorientiert“?Ich suche hier keine Antwort aus dem Lehrbuch, sondern eine, die auf Ihren Erfahrungen mit OO-Sprachen basiert, die in Ihrer Domäne gut funktionieren, was auch immer diese sein mag.

Eine verwandte Frage, deren Beantwortung zunächst hilfreich sein könnte, lautet:Was ist der Archetyp objektorientierter Sprachen und warum?

War es hilfreich?

Lösung

Definitionen zur Objektorientierung sind natürlich ein riesige Dose Würmer, aber hier sind meine 2 Cent:

Für mich dreht sich bei der Objektorientierung alles um Objekte, die durch das Senden von Nachrichten zusammenarbeiten.Das ist für mich das wichtigste Merkmal einer objektorientierten Sprache.

Wenn ich eine geordnete Liste aller Funktionen erstellen müsste, die eine objektorientierte Sprache haben muss, würde das so aussehen:

  1. Objekte, die Nachrichten an andere Objekte senden
  2. Alles ist ein Objekt
  3. Späte Bindung
  4. Subtyp Polymorphismus
  5. Vererbung oder etwas ähnlich Ausdrucksvolles, wie Delegation
  6. Verkapselung
  7. Informationen verbergen
  8. Abstraktion

Offensichtlich ist diese Liste sehr umstritten, da sie eine Vielzahl von Sprachen ausschließt, die allgemein als objektorientiert gelten, wie z Java, C# Und C++, die alle gegen die Punkte 1, 2 und 3 verstoßen.Es besteht jedoch kein Zweifel daran, dass diese Sprachen eine objektorientierte Programmierung ermöglichen (was aber auch der Fall ist). C) und es sogar erleichtern (was C nicht tut).Daher bezeichne ich Sprachen, die diese Anforderungen erfüllen, als „rein objektorientiert“.

Als archetypische objektorientierte Sprachen würde ich nennen Selbst Und Neusprech.

Beide erfüllen die oben genannten Anforderungen.Beide sind von ihnen inspiriert und Nachfolger davon Smalltalk, und beide schaffen es tatsächlich, in gewisser Weise „mehr OO“ zu sein.Die Dinge, die ich an Self und Newspeak mag, sind, dass beide das Paradigma der Nachrichtenübermittlung auf die Spitze treiben (Newspeak sogar noch mehr als Self).

Im Neusprech, alles ist eine Nachricht zu senden.Es gibt keine Instanzvariablen, keine Felder, keine Attribute, keine Konstanten, keine Klassennamen.Sie werden alle mithilfe von Gettern und Settern emuliert.

Im Selbst gibt es sie keine Klassen, nur Objekte.Dies unterstreicht, was OO ist Wirklich um:Objekte, keine Klassen.

Andere Tipps

Laut Booch sind die folgenden Elemente:Wesentlich:

  • Abstraktion
  • Verkapselung
  • Modularität
  • Hierarchie (Vererbung)

Unerheblich:

  • Tippen
  • Parallelität
  • Beharrlichkeit

Im Grunde läuft Object Oriented wirklich auf „Message Passing“ hinaus.

In einer prozeduralen Sprache rufe ich eine Funktion wie folgt auf:

  f(x)

Und der Name f ist wahrscheinlich zur Kompilierungszeit an einen bestimmten Codeblock gebunden.(Es sei denn, es handelt sich um eine prozedurale Sprache mit Funktionen höherer Ordnung oder Zeigern auf Funktionen, aber ignorieren wir diese Möglichkeit für eine Sekunde.) Diese Codezeile kann also nur eine eindeutige Bedeutung haben.

In einer objektorientierten Sprache übergebe ich eine Nachricht an ein Objekt, vielleicht so:

 o.m(x) 

In diesem Fall.m ist nicht der Name eines Codeblocks, sondern ein „Methodenselektor“, und welcher Codeblock aufgerufen wird, hängt tatsächlich in irgendeiner Weise vom Objekt o ab.Diese Codezeile ist mehrdeutig oder allgemeiner, da sie je nach Situation in verschiedenen Situationen unterschiedliche Bedeutungen haben kann.

In den meisten OO-Sprachen hat das Objekt o eine „Klasse“, und die Klasse bestimmt, welcher Codeblock aufgerufen wird.In einigen OO-Sprachen (am bekanntesten Javascript) hat o keine Klasse, sondern verfügt zur Laufzeit über direkt angehängte Methoden oder hat diese von einem Prototyp geerbt.

Meine Abgrenzung ist, dass weder Klassen noch Vererbung notwendig sind, damit eine Sprache OO ist.Aber dieser polymorphe Umgang mit Nachrichten ist unerlässlich.

Obwohl Sie dies beispielsweise mit Funktionszeigern in C vortäuschen können, reicht das nicht aus, um C als OO-Sprache zu bezeichnen, da Sie Ihre eigene Infrastruktur implementieren müssen.Sie können das tun, und ein OO-Stil ist möglich, aber die Sprache hat es Ihnen nicht vorgegeben.

Es sind nicht wirklich die Sprachen, die OO sind, sondern der Code.

Es ist möglich, objektorientierten C-Code zu schreiben (mit Strukturen und sogar Funktionszeiger-Membern, wenn Sie möchten) und ich habe einige ziemlich gute Beispiele dafür gesehen.(Da fällt mir das Quake 2/3 SDK ein.) Es ist durchaus auch möglich, prozedural zu schreiben (d. h.Nicht-OO-Code in C++.

Angesichts dessen würde ich sagen, dass es die Unterstützung der Sprache für das Schreiben eines guten OO -Codes ist, der ihn zu einer "objektorientierten Sprache" macht. Ich würde mich nie darum kümmern, Funktionszeigerelemente in Strukturen in C zu verwenden, beispielsweise für die gewöhnlichen Mitgliederfunktionen.Daher werde ich sagen, dass C keine OO-Sprache ist.

(Erweitert könnte man sagen, dass Python auch nicht objektorientiert ist, mit der obligatorischen „Selbst“-Referenz bei jedem Schritt und aufgerufenen Konstruktoren drin, was nicht;aber das ist eine religiöse Diskussion.)

Smalltalk gilt üblicherweise als die archetypische OO-Sprache, obwohl Simula oft als erste OO-Sprache genannt wird.

Aktuelle OO-Sprachen können grob danach kategorisiert werden, aus welcher Sprache sie die meisten Konzepte übernehmen:

  • Smalltalk-artig:Ruby, Objective-C
  • Simula-artig:C++, Object Pascal, Java, C#

Soweit ich das beurteilen kann, besteht die Hauptansicht dessen, was eine Sprache „objektorientiert“ macht, darin, die Idee der Gruppierung von Daten und Methoden, die mit diesen Daten arbeiten, zu unterstützen, was im Allgemeinen durch Klassen, Module, Vererbung, Polymorphismus usw. erreicht wird.

Sehen diese Diskussion für einen Überblick darüber, was Menschen denken (gedacht?) Objektorientierung bedeutet.

Was die „archetypische“ OO-Sprache betrifft – das ist tatsächlich Smalltalk, wie Kristopher betonte.

Unterstützt Klassen, Methoden, Attribute, Kapselung, Datenverbergung, Vererbung, Polymorphismus, Abstraktion ...?

Abgesehen von den theoretischen Implikationen scheint es so zu sein

„Jede Sprache, die ein Schlüsselwort namens ‚class‘ hat“ :-P

Um das zu ergänzen, was aib gesagt hat, würde ich sagen, dass eine Sprache nicht wirklich objektorientiert ist, es sei denn, die verfügbaren Standardbibliotheken sind objektorientiert.Das größte Beispiel hierfür ist PHP.Obwohl es alle standardmäßigen objektorientierten Konzepte unterstützt, bedeutet die Tatsache, dass ein so großer Prozentsatz der Standardbibliotheken nicht objektorientiert ist, dass es nahezu unmöglich ist, Ihren Code objektorientiert zu schreiben.

Es spielt keine Rolle, dass sie Namespaces einführen, wenn alle Standardbibliotheken immer noch verlangen, dass Sie allen Funktionsaufrufen Dinge wie mysql_ und pgsql_ voranstellen, während Sie in einer Sprache, die Namespaces in der eigentlichen API unterstützt, Funktionen mit loswerden könnten mysql_ und fügen Sie einfach ein einfaches „include system.db.mysql.*“ am Anfang Ihrer Datei ein, damit es weiß, woher diese Dinge kommen.

Wenn Sie Klassen erstellen können, sind diese objektorientiert
Zum Beispiel :Java ist objektorientiert, Javascript nicht, und C++ sieht aus wie eine Art „objektorientierte“ Sprache

Nach meiner Erfahrung sind Sprachen nicht objektorientiert, Code schon.

Vor ein paar Jahren schrieb ich eine Reihe von Programmen in AppleScript, die eigentlich keine objektorientierten Funktionen erzwingen, als ich anfing, OO zu groken.Es ist umständlich, Objekte in AppleScript zu schreiben, obwohl es möglich ist, Klassen, Konstruktoren usw. zu erstellen, wenn Sie sich die Zeit nehmen, herauszufinden, wie das geht.

Die Sprache war die richtige Sprache für die Domain:Verschiedene Programme auf dem Macintosh dazu bringen, zusammenzuarbeiten, um einige automatische Aufgaben basierend auf Eingabedateien auszuführen.Die Mühe zu machen, einen objektorientierten Stil selbst durchzusetzen, war die richtige Wahl für die Programmierung, da dadurch ein Code entstand, der einfacher zu beheben, zu testen und zu verstehen war.

Die Funktion, die mir bei der Umstellung dieses Codes von prozedural auf OO am meisten aufgefallen ist, war die Kapselung:sowohl von Eigenschaften als auch von Methodenaufrufen.

Simples:(vergleiche Versicherungscharakter)

1-Polymorphismus 2-Inheritanz 3-Einkapselung 4-Re-Use.:) :)

Objekt:Ein Objekt ist ein Datenspeicher.Wenn MyList beispielsweise ein ShoppingList-Objekt ist, zeichnet MyList möglicherweise Ihre Einkaufsliste auf.

Klasse:Eine Klasse ist ein Objekttyp.Es könnten viele Objekte derselben Klasse existieren;Beispielsweise können MyList und YourList beide ShoppingList-Objekte sein.

Methode:Eine Prozedur oder Funktion, die ein Objekt oder eine Klasse bearbeitet.Eine Methode ist einer bestimmten Klasse zugeordnet.Beispielsweise könnte addItem eine Methode sein, die einem beliebigen ShoppingList-Objekt einen Artikel hinzufügt.Manchmal ist eine Methode einer Klassenfamilie zugeordnet.addItem könnte beispielsweise auf jede Liste angewendet werden, von der ShoppingList nur ein Typ ist.

Nachlass:Eine Klasse kann Eigenschaften von einer allgemeineren Klasse erben.Beispielsweise erbt die ShoppingList-Klasse von der List-Klasse die Eigenschaft, eine Reihenfolge von Artikeln zu speichern.

Polymorphismus:Die Möglichkeit, dass ein Methodenaufruf für mehrere verschiedene Objektklassen funktioniert, auch wenn diese Klassen unterschiedliche Implementierungen des Methodenaufrufs benötigen.Beispielsweise könnte eine Codezeile in der Lage sein, die Methode „addItem“ für jede Art von Liste aufzurufen, auch wenn das Hinzufügen eines Artikels zu einer ShoppingList völlig anders ist als das Hinzufügen eines Artikels zu einem ShoppingCart.

Objektorientierte:Jedes Objekt kennt seine eigene Klasse und welche Methoden Objekte in dieser Klasse manipulieren.Jede ShoppingList und jeder ShoppingCart weiß, welche Implementierung von addItem für sie gilt.

In dieser Liste ist das Einzige, was objektorientierte Sprachen wirklich von prozeduralen Sprachen (C, Fortran, Basic, Pascal) unterscheidet, der Polymorphismus.

Quelle: https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd

Ich teile dies gerne mit euch, es war sehr interessant und hilfreich für mich.Dies ist ein Auszug aus einem Rolling Stone-Interview von 1994, in dem Steve (kein Programmierer) OOP in einfachen Worten erklärt.

Jeff Goodell:Können Sie in einfachen Worten erklären, was genau objektorientierte Software ist?

Steve Jobs:Objekte sind wie Menschen.Sie leben, atmen Dinge, in denen Wissen darüber steckt, wie man Dinge macht, und die ein Gedächtnis in sich haben, damit sie sich an Dinge erinnern können.Und anstatt mit ihnen auf einer sehr niedrigen Ebene zu interagieren, interagieren Sie mit ihnen auf einer sehr hohen Abstraktionsebene, wie wir es hier tun.

Hier ist ein Beispiel:Wenn ich dein Wäschereiobjekt bin, kannst du mir deine schmutzigen Kleider geben und mir eine Nachricht schicken, in der steht: "Kannst du bitte meine Kleiderwäsche bekommen." Ich weiß zufällig, wo der beste Wäscheplatz in San Francisco ist.Und ich spreche Englisch und ich habe Dollars in meinen Taschen.Also gehe ich raus, rufe ein Taxi und sage dem Fahrer, er soll mich zu diesem Ort in San Francisco bringen.Ich gehe deine Kleidung waschen, ich springe zurück ins Taxi und komme hierher zurück.Ich gebe dir deine saubere Kleidung und sage: „Hier ist deine saubere Kleidung.“

Du hast keine Ahnung, wie ich das gemacht habe.Sie haben keine Kenntnis von der Wäscherei.Vielleicht sprechen Sie Französisch und können nicht einmal ein Taxi rufen.Sie können nicht dafür bezahlen, Sie haben kein Geld in der Tasche.Dennoch wusste ich, wie man das alles macht.Und Sie mussten nichts davon wissen.All diese Komplexität war in mir verborgen und wir konnten auf einem sehr hohen Abstraktionsniveau interagieren.Das sind Objekte.Sie kapseln Komplexität und die Schnittstellen zu dieser Komplexität sind auf hohem Niveau.

Archetyp

Die Fähigkeit, reale Szenarien in Code auszudrücken.

foreach(House house in location.Houses)
{
 foreach(Deliverable mail in new Mailbag(new Deliverable[]
              {
              GetLetters(), 
              GetPackages(), 
              GetAdvertisingJunk()
              })
 {
    if(mail.AddressedTo(house))
    {
        house.Deliver(mail);
    }
 }
}

-

foreach(Deliverable myMail in GetMail())
{
    IReadable readable = myMail as IReadable;
    if ( readable != null )
    {
        Console.WriteLine(readable.Text);
    }
}

Warum?

Damit wir dies leichter verstehen.Es macht in unseren Köpfen mehr Sinn und macht den Code bei korrekter Implementierung effizienter, wiederverwendbar und reduziert Wiederholungen.

Um dies zu erreichen, benötigen Sie:

  • Hinweise/Referenzen um sicherzustellen, dass dies == dies und dies != das.
  • Klassen zeigen auf (z.B.Arm), die Daten (int hairyness) und Operationen (Throw(IThrowable)) speichern.
  • Polymorphismus (Vererbung und/oder Schnittstellen) um bestimmte Objekte auf generische Weise zu behandeln, sodass Sie sowohl Bücher als auch Graffiti an der Wand lesen können (beide implementieren IReadable)
  • Verkapselung weil ein Apfel keine Atoms[]-Eigenschaft verfügbar macht
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top