Ich habe irgendwo in einer der Antworten auf eine Frage hier gelesen (kann mich nicht erinnern, welche), dass C ++ nicht für die objektorientierte Programmierung geeignet ist. Es wurde erwähnt, dass Sie von seiner Funktion oder so etwas Gebrauch machen könnten, aber nicht im reinen OOP-Sinne (ich verstand eigentlich nicht wirklich, was die Person meinte).
Ist da etwas Wahres dran? Wenn ja warum?
c++
object-oriented
gablin
quelle
quelle
Antworten:
Wie unter Also, was * meinte * Alan Kay wirklich mit dem Begriff "objektorientiert"? , Alan Kay dachte, dass das Weitergeben von Nachrichten das wichtige Stück OOP ist, aber es ist das Stück, das "C mit Klassen" (das später zu C ++ wurde) fehlt. C ++ ist nur eine Struktur mit ein wenig Verhalten, während Objekte in Smalltalk oder Objective-C "intelligent" sind, da sie entscheiden können, was sie mit den gesendeten Nachrichten tun. Wenn ein Smalltalk-ähnliches Objekt eine Nachricht empfängt, für die es keine Implementierung hat, kann es diese träge hinzufügen, die Nachricht an ein anderes Objekt weiterleiten oder eine beliebige Aktion ausführen.
Was C ++ im Hinblick auf die Objektorientierung bietet, sind
virtual
Methoden und Polymorphismen, die die Art und Weise betreffen, wie diese Methoden aufgerufen werden. Wenn der Compiler einen Datentyp (oderclass
) mit virtuellen Methoden erkennt, erstellt er eine vtable mit einem Slot für jede virtuelle Methode. Unterklassen, die die virtuellen Methoden implementieren, platzieren ihre Implementierungen in den richtigen Slots, sodass der Clientcode lediglich wissen muss, wo in der virtuellen Tabelle der auszuführende Code zu suchen ist, anstatt ihn bis zur spezifischen Funktion aufzulösen. Was dies bedeutet , ist , dass C ++ effektiv funktioniert eine Form von mehreren Dispatch haben, obwohl sie alle im Compiler implementiert ist und ist nicht so leistungsfähig wie ein Smalltalk-artiges System.Wenn Sie die Nachrichtenübermittlung als grundlegend für OOP ansehen, ist dies mit C ++ alles andere als einfach. OTOH Wenn Sie unter OOP das Zuordnen von Daten zu Funktionen verstehen, die auf diese Daten wirken, ist C ++ in Ordnung.
quelle
Diese Art von Diskussion stört mich, weil es sich wie Exegese anhört, Leute über die Bedeutung der Heiligen Schrift oder der amerikanischen Verfassung diskutieren und darüber, was die ursprünglichen Autoren gemeint haben, als ob das, was wir denken, keine Rolle spielt.
Sehen Sie, Alan Kay war / ist ein kluger Kerl, und er hatte eine gute Idee, die sich mit einer Reihe anderer guter Ideen überschlug und deren Umsetzung in Smalltalk und anderen Sprachen fand.
Er ist nicht der Messias und OOP ist nicht das einzig wahre Programmierparadigma.
Das ist unter vielen eine gute Idee. Hat C ++ gute Ideen aus der OOP-Sicht? Natürlich tut es das.
quelle
C ++ unterstützt OOP, wenn Sie OOP so definieren, dass es Kapselung, Vererbung und Polymorphismus bedeutet.
Allerdings ist C ++ nicht wirklich zeichnen sich auf der OOP. Ein Grund dafür ist, dass der Polymorphismus häufig von Objekten abhängt, die einem Haufen zugewiesen wurden und mit denen (ungeachtet der Verwendung intelligenter Zeiger) natürlicher in einer Sprache gearbeitet werden kann, die mit Müll zusammengetragen wurde.
C ++ zeichnet sich jedoch durch generische Programmierung aus. Mit C ++ können Sie auf einfache Weise hocheffizienten, generischen Code mithilfe vorlagenbasierter funktionaler Programmiertechniken erstellen.
quelle
Von C ++ ausgeliehene OOP-Funktionen von Simula. Einer oder mehrere der Simula-Entwickler, IIRC, bemerkten, dass C ++ nicht das ist, was sie vorhatten.
C ++ bietet gute Werkzeuge für die Abstraktion, ist jedoch eher eine gemischte Paradigmasprache als eine objektorientierte Sprache. Die objektorientierten Funktionen sind vorhanden, Sie haben jedoch Optionen, die nicht "strikter OOP" sind.
Eines der unanständigen "Opt-outs", die Sie in C ++ erhalten, besteht darin, für Methoden eher die frühe als die späte Bindung zu verwenden. Dies ist nicht nur möglich - es ist die Standardeinstellung. In Java ist "final" verwandt, aber in gewisser Hinsicht sauberer (es gibt Absichten an, bei denen es nicht nur darum geht, einen geringfügigen Leistungsaufwand zu vermeiden), und es ist nicht die Standardeinstellung.
In gewisser Weise zeigt C ++ Anzeichen dafür, dass es sich um ein frühes Experiment handelt, das noch vorhanden ist. Trotzdem ist es immer noch ein gutes Tool mit vielen Vorteilen, die Sie in anderen OOP-Sprachen nicht bekommen.
quelle
Das Erzwingen, dass alles Teil einer Klasse ist, führt nicht unbedingt zu großartigem OO-Code.
Bitten Sie einen schlechten prozeduralen Programmierer, Java zu programmieren, und er wird möglicherweise irgendwo eine Klasse belegen, ihr eine statische Hauptmethode geben und 1000 Codezeilen hineinstecken. Ich weiß, dass ich es gesehen habe.
Java hat eine switch-Anweisung. Ich habe
switch( type ) { case typeA: bundles_of_code; break; case typeB: bundles_of_other_code; break }
usw. sowohl in C ++ als auch in Java-Code gesehen.C ++ unterstützt viele OO-Konzepte, aber sein Standard ist nicht von ihm definiert, aber ich denke, viel hängt davon ab, was Ihr Ziel ist.
Die wichtigste "schlechte" Semantik in C ++ ist das Kopieren von Klassen, wodurch ein Objekt in ein anderes transformiert wird. Sie können dies deaktivieren, aber dann können Sie keine Funktion zurückgeben. Glücklicherweise wird dies in C ++ 0x behoben.
quelle
Bei OOP geht es nicht nur darum, sicherzustellen, dass alles von einer Klasse ist oder in einer Klasse ist. Es ist durchaus möglich, Nicht-OO-Code in einer "rein OO" -Sprache zu schreiben. Zum Beispiel wird "main" oft als globale Funktion bezeichnet, aber eine Klasse nur zu erfinden, um eine statische main-Methode zu enthalten, ist genauso, als wäre sie nicht OO.
C ++ funktioniert am besten mit einer Mischung aus verschiedenen Dingen. Das sollte nicht überraschen, denn so funktionieren die meisten guten Dinge am besten. Oft ist OOP eines dieser sehr nützlichen Werkzeuge.
quelle
C ++ kann für OOP verwendet werden, ist aber nicht so 'rein' wie Smalltalk. In C ++ können Sie auch Nicht-OOP ausführen, wovon die Leute möglicherweise sprechen.
quelle
Obwohl ich mit dem Gefühl nicht einverstanden bin, ist es wahr, dass C ++ 's Typsystem kein reines OOP ist - nicht "alles ist ein Objekt". Zahlen (insbesondere) können nicht so einfach erweitert werden, wie dies beispielsweise in Smalltalk der Fall ist. Sie können beispielsweise die Bedeutung von "2 + 2" nicht neu definieren (obwohl Sie die Bedeutung von "zwei + zwei" neu definieren könnten).
Aber was die meisten Leute wahrscheinlich meinen, ist, dass viele Leute nicht-objektorientierten Code in C ++ schreiben, aber glauben, dass sie objektorientiert sind, weil sie eine "OOP" -Sprache verwenden. Das ist nicht wahr. Aber meiner Meinung nach können Sie in Smalltalk abscheulichen Imperativ-Code schreiben und einem anständigen OOP-Design in C ++ nicht überlegen sein.
quelle
Alan Kays vollkommen berechtigter Einwand gegen C ++ war, dass es sich um eine Makrosprache über C handelte.
Der Begriff "Nachrichtenübergabe" ist einfach die Idee, dass Instanzen von Klassen im Speicher gehalten werden und dass sie Methoden verfügbar machen, die aufgerufen werden können. Die Nachrichtenübergabe wird in C ++ mit vtables simuliert, die Zeiger auf Funktionen enthalten.
Zu sagen, dass die Nachrichtenübergabe in C ++ nicht vorhanden ist, ist ungenau. Genauer gesagt, dass die Nachrichtenübergabe ein integraler Bestandteil anderer Sprachen wie Smalltalk und Java ist, da die Sprache ein fremdes Konstrukt nicht vorverarbeitet und es direkt auf C pfropft.
Dies ist ein hochsemantisches Argument für das Sprachdesign, von dem ich vermute, dass es etwas über das Erfahrungsniveau des Fragestellers hinausgeht.
Davon abgesehen gibt es tausend Gründe, C ++ zu hassen, und sehr wenige Gründe, es zu lieben.
Anstatt nach dem perfekten Hammer und dem perfekten Nagel zu suchen, finden Sie das perfekte Haus zum Bauen und dann die richtigen Werkzeuge ... das braucht Erfahrung.
Es ist auch wichtig zu bedenken, dass in der Systemprogrammierung, was Alan Kay befürchtet, nicht "pure OOP" ist, sondern eine Stärke von C ++. Jedem sein eigenes ...
quelle
Meiner Ansicht nach handelt es sich weniger um ein Definitionsproblem als vielmehr um ein Usability-Problem.
Objekte sind eine Abstraktion, die das Lesen, Schreiben und Begründen komplexer Programme erleichtern soll. Für einen praktischen Programmierer ist es nicht so wichtig, ob eine Sprache alle Kriterien einer bestimmten formalen Definition von "objektorientiert" erfüllt (es scheint mehrere konkurrierende zu geben!), Als ob die angebotenen Werkzeuge zum Nachdenken geeignet sind Ihr Programm in Bezug auf diese Objekte - dh tatsächlich die vermeintlichen Produktivitätsvorteile von OOP zu ernten.
In C ++ sind Objekte eine furchtbar undichte Abstraktion, die Programmierer oft dazu zwingt, sich mit unangenehmen Problemen zu befassen, die mit der Struktur dieser Objekte im Speicher zu tun haben - Probleme, die eher an die Codierung in direktem C als an andere OOP-Sprachen erinnern. Zum Beispiel bietet C ++ Frequently Questioned Answers diese Kritik (unter anderem):
C ++ ist objektorientiert, aber unangenehm und unvollständig: Die Benutzer müssen viel Aufwand betreiben, um sicherzustellen, dass sich ihre Daten tatsächlich wie "echte" Objekte und nicht wie fehlerhafte Bits verhalten . Das heißt, eine Menge Code in C ++ über seine Lebensdauer geschrieben worden, die meisten davon Gebrauch von Klassen zu machen und dynamischen Dispatch, also ist es selbstverständlich , etwas , dass Sie kann für die praktische OOP verwenden.
quelle
Nicht umsonst hatte Graham Lee hier die meisten positiven Stimmen. Um es noch einmal zu wiederholen, es scheint, dass eine C ++ - Klasse kein Objekt in dem Sinne ist, dass sie keine Nachrichtenübergabe durchführt. Ich denke, das ist es, was die Leute sehr aufregt, wenn sie C ++ oder oop lernen. Den Leuten wird gesagt, dass objektorientiert "das" ist, und dann, dass C ++ es anders macht. Nun, C ++ hat OOP nie anders gemacht. Wenn Sie so denken, werden Sie C ++ - Klassen niemals für das schätzen, wofür sie gedacht sind, und das bedeutet, dass sie lediglich eine Verbesserung des prozeduralen Paradigmas darstellen, indem sie Abstraktion und dynamisches Verhalten einbeziehen. C ++ - Klassen sind also grundlegend prozedural, sie verbessern lediglich das prozedurale Paradigma oder sind vielmehr eine fortgeschrittenere Version einer C-Struktur.
quelle
Steve Yegge sagte es am besten :
Das Objektsystem in C ++ ist zur Kompilierungszeit so fest verdrahtet und fixiert, dass es sehr weit von der ursprünglichen Vorstellung von OOP entfernt ist, die unter anderem Nachrichtenübergabe, Introspektion, Reflexion, dynamisches Versenden und spätes Binden umfasst. Das einzige, was C ++ und Smalltalk gemeinsam haben, ist ein bisschen Wortschatz.
quelle