Was ist der Vorteil der objektorientierten Programmierung gegenüber der prozeduralen Programmierung?

77

Ich versuche den Unterschied zwischen prozeduralen Sprachen wie C und objektorientierten Sprachen wie C ++ zu verstehen. Ich habe C ++ noch nie benutzt, aber ich habe mit meinen Freunden darüber diskutiert, wie man die beiden unterscheiden kann.

Mir wurde gesagt, dass C ++ objektorientierte Konzepte sowie öffentliche und private Modi für die Definition von Variablen hat: Dinge, die C nicht hat. Ich musste diese Funktionen noch nie verwenden, um Programme in Visual Basic.NET zu entwickeln. Welche Vorteile bieten diese Funktionen?

Mir wurde auch gesagt, dass auf eine Variable, die öffentlich ist, überall zugegriffen werden kann, aber es ist nicht klar, wie sich diese von einer globalen Variablen in einer Sprache wie C unterscheidet. Es ist auch nicht klar, wie sich eine private Variable von einer lokalen Variable unterscheidet.

Eine andere Sache, die ich gehört habe, ist, dass aus Sicherheitsgründen, wenn auf eine Funktion zugegriffen werden muss, diese zuerst vererbt werden sollte. Der Anwendungsfall ist, dass ein Administrator nur so viele Rechte haben sollte, wie er benötigt, und nicht alles, aber es scheint, dass eine Bedingung auch funktionieren würde:

if ( login == "admin") {
    // invoke the function
}

Warum ist das nicht ideal?

Da es eine prozedurale Möglichkeit zu geben scheint, alles objektorientiert zu machen, warum sollte ich mich dann für objektorientierte Programmierung interessieren?

niko
quelle
11
Diese Karte mit Programmierparadigmen kann Ihnen helfen.
Programmierer
26
+1, um einigen Abwertungen entgegenzuwirken. Wenn ein Kollege mir eine solche Frage stellen würde, hätte ich wahrscheinlich einige Bedenken und könnte ihn sogar ablehnen (vorausgesetzt, es gibt einen Abwärtspfeil neben ihm). Diese Frage scheint jedoch von einem zukünftigen Softwareentwickler gestellt worden zu sein, und es scheint, als hätte er einige Zeit damit verbracht, über das Thema nachzudenken und es zu diskutieren, bevor er es veröffentlicht. Ich stimme dafür, ihm zu helfen, anstatt ihn zu entlassen.
DXM
14
@ DXM Ausgezeichnete Idee! Downvote / Upvote-Pfeile schweben um Kollegen herum ... Das würde Wunder wirken.
Yannis
2
Standardgegenargument: Es gibt auch einen Assembler-Weg, um alles zu tun, was Sie in C tun können. Warum sollten Sie sich also für C interessieren? (Hinweis: Es geht darum, die Abstraktionsebene zu erhöhen. C ++ schafft dies, ohne den größten Teil der Geschwindigkeit von C zu opfern. IMO ist der Hauptgrund für den Erfolg von C ++.)
sbi

Antworten:

135

Alle bisherigen Antworten haben sich auf das Thema Ihrer Frage konzentriert, nämlich "Was ist der Unterschied zwischen c und c ++?". In Wirklichkeit klingt es so, als ob Sie wissen, was ein Unterschied ist. Sie verstehen einfach nicht, warum Sie diesen Unterschied brauchen würden. Also versuchten andere Antworten, OO und Einkapselung zu erklären.

Ich wollte noch eine weitere Antwort geben, da ich aufgrund der Details Ihrer Frage glaube, dass Sie einige Schritte zurücktreten müssen.

Sie verstehen den Zweck von C ++ oder OO nicht, da Ihre Anwendung scheinbar nur Daten speichern muss. Diese Daten werden in Variablen gespeichert. "Warum sollte ich eine Variable unzugänglich machen wollen? Jetzt kann ich nicht mehr darauf zugreifen! Indem ich alles öffentlich oder besser global mache, kann ich Daten von überall aus lesen und es gibt keine Probleme." - Und Sie haben Recht, basierend auf dem Umfang der Projekte, an denen Sie gerade arbeiten, gibt es wahrscheinlich nicht allzu viele Probleme (oder es gibt sie, aber Sie sind sich ihrer noch nicht bewusst).

Ich denke, die grundlegende Frage, die Sie wirklich beantworten müssen, ist: "Warum sollte ich jemals Daten verbergen wollen? Wenn ich das tue, kann ich nicht damit arbeiten!" Und deshalb:

Angenommen, Sie starten ein neues Projekt, öffnen Ihren Texteditor und schreiben Funktionen. Jedes Mal, wenn Sie etwas speichern müssen (um es später zu speichern), erstellen Sie eine Variable. Um die Dinge einfacher zu machen, machen Sie Ihre Variablen global. Ihre erste Version Ihrer App läuft hervorragend. Jetzt können Sie weitere Funktionen hinzufügen. Sie haben mehr Funktionen, bestimmte Daten, die Sie zuvor gespeichert haben, müssen aus Ihrem neuen Code gelesen werden. Andere Variablen müssen geändert werden. Sie schreiben immer mehr Funktionen. Was Sie vielleicht bemerkt haben (oder, wenn nicht, Sie werden es in Zukunft absolut bemerken), ist, dass es mit zunehmendem Code immer länger dauert, bis Sie die nächste Funktion hinzufügen. Und je größer Ihr Code wird, desto schwieriger wird es, Features hinzuzufügen, ohne dass etwas kaputt geht, was früher funktioniert hat. Warum? Da musst du dir was alles merkenIhre globalen Variablen werden gespeichert und Sie müssen sich daran erinnern, wo sie alle geändert werden. Und Sie müssen sich merken, welche Funktion in welcher Reihenfolge aufgerufen werden kann. Wenn Sie sie in einer anderen Reihenfolge aufrufen, können Fehler auftreten, da Ihre globalen Variablen noch nicht ganz gültig sind. Bist du jemals darauf gestoßen?

Wie groß sind Ihre typischen Projekte (Codezeilen)? Jetzt können Sie ein Projekt mit einer 5000- bis 50000-fachen Größe erstellen. Außerdem arbeiten dort mehrere Personen. Wie kann sich jeder im Team daran erinnern (oder gar merken), was all diese Variablen tun?

Was ich oben beschrieben habe, ist ein Beispiel für perfekt gekoppelten Code. Und seit Anbeginn der Zeit (vorausgesetzt, die Zeit begann am 1. Januar 1970) hat die Menschheit nach Wegen gesucht, um diese Probleme zu vermeiden. Sie vermeiden sie, indem Sie Ihren Code in Systeme, Subsysteme und Komponenten aufteilen und die Anzahl der Funktionen einschränken, die auf Daten zugreifen können. Wenn ich 5 Ganzzahlen und eine Zeichenkette habe, die einen Zustand darstellen, wäre es für mich einfacher, mit diesem Zustand zu arbeiten, wenn nur 5 Funktionen die Werte setzen / erhalten? oder wenn 100 funktionen die gleichen werte setzen / bekommen? Auch ohne OO-Sprachen (dh C) haben die Menschen hart daran gearbeitet, Daten von anderen Daten zu isolieren und saubere Trennungsgrenzen zwischen verschiedenen Teilen des Codes zu schaffen. Wenn das Projekt eine bestimmte Größe erreicht, wird die Programmierung nicht einfacher. "Kann ich über die Funktion Y auf die Variable X zugreifen?"

Aus diesem Grund wurden OO-Konzepte eingeführt, und aus diesem Grund sind sie so leistungsfähig. Sie ermöglichen es Ihnen, Ihre Daten vor sich selbst zu verbergen, und Sie möchten dies absichtlich tun. Denn je weniger Code diese Daten sieht, desto geringer ist die Wahrscheinlichkeit, dass Sie beim Hinzufügen des nächsten Features etwas kaputt machen. Dies ist der Hauptzweck für die Konzepte der Kapselung und der OO-Programmierung. Mit ihnen können Sie unsere Systeme / Subsysteme in noch detailliertere Bereiche unterteilen, bis zu einem Punkt, an dem auf einen bestimmten Satz von Variablen unabhängig von der Größe des Gesamtprojekts nur noch 50-200 Codezeilen zugreifen können - und das war's! Die OO-Programmierung bietet natürlich noch viel mehr. Im Wesentlichen bietet C ++ jedoch die Möglichkeit, Daten / Funktionen als privat, geschützt oder öffentlich zu deklarieren.

Die zweitgrößte Idee in OO ist das Konzept der Abstraktionsschichten. Obwohl prozedurale Sprachen auch Abstraktionen haben können, muss sich ein Programmierer in C bewusst darum bemühen, solche Ebenen zu erstellen. Wenn Sie in C ++ eine Klasse deklarieren, erstellen Sie automatisch eine Abstraktionsebene (es bleibt Ihnen überlassen, ob diese Abstraktion vorliegt oder nicht) Wert hinzufügen oder entfernen). Sie sollten mehr über Abstraktionsebenen lesen / recherchieren, und wenn Sie weitere Fragen haben, wird dieses Forum diese sicherlich auch gerne beantworten.

DXM
quelle
5
Tolle Antwort, scheint angesichts der Frage das richtige Niveau zu erreichen
Carlos
29
+1 ... hauptsächlich für die Zeile "Und seit Anbeginn der Zeit (angenommen, die Zeit begann am 1. Januar 1970) ..."
CaffGeek
4
@Chad - Ich dachte, diese Linie alleine sollte mir mindestens einen Punkt bringen :)
DXM
Es gibt eine Möglichkeit, mit diesem Skalenproblem umzugehen, über das Sie im prozeduralen Paradigma sprechen. Es heißt Funktionen. Aber eine gute Art, das Problem zu erklären.
ärgerlich_squid
@DXM - Ich bin nicht sicher, ob ich die Antwort richtig verstanden habe. Dieselbe Set / Get-Funktionalität können wir auch in der prozeduralen Programmierung erreichen. Wir können set / get-Funktionen in C schreiben, um die globale Variable zu ändern / abzurufen. Mit dieser Methode begrenzen wir auch die Anzahl der Funktionen, die die globalen Variablen ändern. Und selbst in OOP verwenden wir, wenn wir set / get-Methoden verwenden, diese Methoden von außerhalb des Objekts, um die Werte zu ändern.
Kadina
10

Hmm ... vielleicht ist es am besten, eine Sicherungskopie zu erstellen und eine Vorstellung von der grundsätzlichen Absicht der objektorientierten Programmierung zu bekommen. Bei der objektorientierten Programmierung geht es vor allem darum, die Erstellung abstrakter Datentypen zu ermöglichen. Für ein wirklich einfaches Beispiel, mit dem Sie zweifellos vertraut sind, ziehen Sie eine Zeichenfolge in Betracht. Eine Zeichenfolge hat normalerweise einen Puffer, der den Inhalt der Zeichenfolge enthält, und einige Funktionen, die mit der Zeichenfolge ausgeführt werden können (darin suchen, auf Teile davon zugreifen, Teilzeichenfolgen erstellen usw.). Außerdem hat sie (zumindest normalerweise) etwas zu tun Behalten Sie die (aktuelle) Länge der Zeichenfolge und (wahrscheinlich) die Größe des Puffers im Auge. Wenn Sie also (zum Beispiel) die Größe der Zeichenfolge von 1 auf 1000000 erhöhen, wissen Sie, wann mehr Speicher für die größere Zeichenfolge erforderlich ist Inhalt.

Diese Variablen (der Puffer, die aktuelle Länge und die Puffergröße) sind für die Zeichenfolge selbst privat, aber für eine bestimmte Funktion nicht lokal. Jeder String hat einen Inhalt von einer bestimmten Länge, daher müssen wir diesen Inhalt / diese Länge für diesen String verfolgen. Umgekehrt kann dieselbe Funktion (z. B. zum Extrahieren einer Teilzeichenfolge) mit vielen verschiedenen Zeichenfolgen zu verschiedenen Zeiten ausgeführt werden, sodass Daten nicht für die einzelne Funktion lokal sein können.

Als solches haben wir einige Daten, die für den String privat sind, so dass nur (direkt) auf String-Funktionen zugegriffen werden kann. Die Außenwelt kann erhalten die Länge der Zeichenfolge , die eine String - Funktion verwendet wird , muss aber noch nichts über die Interna der Zeichenfolge wissen , um es zu bekommen. Ebenso kann es sein, dass der String geändert wird. Dies erfolgt jedoch wiederum über die String-Funktionen, und nur diese ändern direkt die Variablen, die für das String-Objekt lokal sind.

Was die Sicherheit anbelangt, würde ich bemerken, dass dies zwar als Analogie angemessen ist, aber nicht so, wie die Dinge wirklich funktionieren. Insbesondere soll der Zugriff in C ++ nicht die gleichen Anforderungen erfüllen wie der Zugriff in einem Betriebssystem. Ein Betriebssystem sollte erzwingen so die Einschränkungen (zum Beispiel) einen normalen Benutzer kann nicht die Dinge für einen Administrator vorbehalten tun. Die Zugriffskontrolle in C ++ soll dagegen nur Unfälle verhindern. Jeder, der will, kann sie von vornherein leicht umgehen. Sie haben dieselbe Reihenfolge wie das Markieren einer schreibgeschützten Datei, damit Sie sie nicht versehentlich löschen. Wenn Sie die Datei löschen möchten, ist es ganz einfach, sie von schreibgeschützt in schreibgeschützt zu ändern. Wenn Sie es nur als schreibgeschützt festlegen, müssen Sie mindestens eine Sekunde darüber nachdenken und entscheiden , die Datei zu löschen, damit sie nicht versehentlich gelöscht wird, wenn Sie zum falschen Zeitpunkt die falsche Taste drücken.

Jerry Sarg
quelle
6

OOP versus C handelt nicht wirklich von Dingen, die Sie besprochen haben. Es geht in erster Linie darum, Code in Bereiche zu packen, die sich nicht ungewollt (oder manchmal sogar absichtlich) gegenseitig beeinflussen.

Mit C können Sie grundsätzlich jede Funktion von überall ausführen. OOP verhindert dies, indem Methoden in Klassen gruppiert werden und Sie die Methoden nur verwenden können, indem Sie auf die Klasse verweisen, die sie enthält. Ein potenzieller großer Vorteil von OOP ist, dass Sie mit größerer Wahrscheinlichkeit eine bessere Code-Anordnung haben, ohne viel Erfahrung damit zu haben, Ihnen zu sagen, dass Sie dies tun sollten.

John Fisher
quelle
4
-1. In C gibt es nichts Exklusives, das alle Funktionen global macht. Sie können jede Funktion als statisch deklarieren und dadurch ihren Bereich auf die lokale Datei beschränken. C unterscheidet sich in dieser Hinsicht nicht von C ++, Java usw. Außerdem geht es in OOP nicht um die Sprachsyntax. Sie können OO-Programme ohne Probleme in C schreiben, obwohl sie etwas gröber sind als in Sprachen mit Syntaxunterstützung für OO. Und im Gegenteil: Sie bekommen kein OOP, nur weil Sie eine Sprache gewählt haben, die OO unterstützt. Objektorientierung ist ein Programmierstil , keine Sprachfunktion.
@Lundin: Während Sie technisch korrekt sind, haben Sie den Punkt verpasst. OOP-Sprachen legen das Standardverhalten für OOP-Verhalten fest. C nicht.
John Fisher
1
In OO-Sprachen gibt es nichts, was Sie dazu zwingt. Zum Beispiel habe ich unzählige obskure C ++ - Programme ohne nennenswerte OO gesehen. Wenn Sie keine Ahnung von OO haben, aber versuchen, Klassen, Erbe usw. zu implementieren, besteht eine 100% ige Chance, ein verkorkstes Programm zu erstellen.
@Lundin: Ich denke nicht, dass C ++ ein faires Beispiel ist. Es ist (oder war zumindest) dafür gedacht, C-Programme ohne (große) Modifikationen kompilieren zu können. Das Hinzufügen von Klassen macht es nicht zu einer OOP-Sprache auf der Ebene von C # oder Java, aber es ermöglicht diese Art der Entwicklung.
John Fisher
Sie können auch Nicht-OO-Programme in Java schreiben, indem Sie sich einfach in eine große Hauptdatei hacken ... OO ist immer noch nicht sprachspezifisch. Wenn der Programmierer keine Ahnung von OO hat, werden sie von keiner Sprache auf der Welt gespeichert .
4

Eine gut geschriebene Klasse sollte eine kleine "Insel des Vertrauens" sein: Sie können sie verwenden und davon ausgehen, dass sie "das Richtige" tut und Sie vor den üblichen Gefahren schützt. Das macht eine gute Klasse zu einem Baustein, der viel wiederverwendbarer ist als eine Reihe von Funktionen und Variablen, die zwar gut funktionieren, Ihnen aber all ihren hässlichen Mut zeigen und Sie dazu zwingen, zu verstehen, wie sie zusammenarbeiten und wie sie initialisiert werden müssen usw. Eine gute Klasse sollte wie ein USB-Stecker sein, während die prozedurale Lösung wie ein Bündel von Drähten, Chips, Zinn und einem Lötbit ist.

Ein Punkt, der nicht ausführlich besprochen wurde, ist der Aspekt der Schnittstelle / Implementierung. Eine Schnittstelle beschreibt das Verhalten, nicht aber die Realisierung. Eine Listenoberfläche beschreibt also das Konzepteiner Liste und ihr Verhalten: Sie würden Dinge wie das Hinzufügen, Entfernen und die Größe von Methoden erwarten. Es gibt jetzt viele verschiedene Möglichkeiten, diese Liste zu implementieren, z. B. als verknüpfte Liste oder mithilfe eines Array-Puffers. Die Stärke der OO-Programmierung besteht darin, dass Sie mithilfe einer Schnittstelle über das Verhalten nachdenken können, ohne über die Implementierung Bescheid zu wissen. Der Zugriff auf interne Variablen oder Methoden würde diese Abstraktion zerstören, Sie könnten eine Listenimplementierung nicht durch eine andere ersetzen und eine vorhandene Implementierung nicht verbessern, ohne den Code mit der Klasse zu berühren. Dies ist einer der Hauptgründe, warum private Variablen und Methoden benötigt werden: Um interne Details der Implementierung zu schützen, bleibt die Abstraktion erhalten.

OO geht noch einen Schritt weiter: Zum Beispiel können Sie für Bibliotheken eine Schnittstelle für Dinge definieren , die noch nicht existieren , und Code schreiben, der mit dieser Schnittstelle funktioniert. Die Benutzer können Klassen schreiben, die die Schnittstelle implementieren, und die von der Bibliothek bereitgestellten Dienste verwenden. Dies ermöglicht ein Maß an Flexibilität, das mit der prozeduralen Programmierung nicht möglich ist.

Landei
quelle
Das Konzept der Schnittstellen ist nicht auf objektorientierte Sprachen beschränkt. Ein größerer Faktor ist meiner Meinung nach, dass in Nicht-OOP-Sprachen fast alle Funktionen, die in einem Modul verwendet werden, zu demselben globalen Namespace gehören müssen. Dies erfordert, dass man entweder Funktionsnamen voranstellt, um anzuzeigen, worauf sie einwirken, oder über viele ähnlich klingende Methoden verfügt, die ganz andere Dinge tun (z. B. SetLocationum a zu bewegen Monster, während a SetPositionzu bewegen PopupWindow, und Movezum Anpassen der Position verwendet werden kann von a DisplayCursor). Der Versuch, die richtige "Move" -Methode zu finden ...
Supercat
... kann viel einfacher gemacht werden, wenn MyMonstor->der Editor beim Schreiben nur eine Liste von Methoden anzeigt, die auf Dinge vom Typ anwendbar sind Monster. Wenn es viele Dutzend verschiedene Arten von Dingen gibt, von denen jede etwa ein Dutzend Vorgänge unterstützt, kann die Reduzierung der Unordnung in den Methodenlisten um 90% die Produktivität erheblich verringern.
Supercat
Bei @supercat-Namenskonflikten handelt es sich um ein Sprachproblem und nicht um ein Problem ohne OOP. Andererseits sind Namespaces problematisch, da der Compiler die Funktion im Wesentlichen automatisch umbenennen oder entstellen muss. Warum also nicht einfach manuell?
ärgerlich_squid
@annoying_squid: Was OOP bietet, ist die Möglichkeit, den Typ des primären Arguments einer Funktion effektiv zu verwenden , um den Namespace auszuwählen. Wenn ich eine Variable itvom Typ habe SuperFancyWhizBang, muss zum Aufrufen einer der SuperFancyWhizBangMethoden von itnicht der Typ ausgeschrieben werden SuperFancyWhizBang. Das Sprichwort it.woozle()weist den Compiler an, automatisch nach woozleinnen zu suchen SuperFancyWhizBang.
Supercat
3

Es gibt eine Möglichkeit, alles mit einer Turing-Maschine oder zumindest in einer Assemblersprache für den Maschinencode zu tun, den ein C- oder C ++ - Programm irgendwann kompilieren wird.

Es geht also nicht darum, was der Code kann, sondern darum, was die Leute können.

Menschen machen Fehler. Viele.

OOP führt ein Paradigma und eine Syntax ein, mit deren Hilfe die Größe und Wahrscheinlichkeitsdichte des Raums möglicher menschlicher Codierungsfehler verringert werden kann. Manchmal, indem der Fehler für eine bestimmte Klasse von Datenobjekten illegal gemacht wird (z. B. wenn es sich nicht um eine für dieses Objekt deklarierte Methode handelt). Manchmal, indem man den Fehler ausführlicher macht oder im Vergleich zum kanonischen Gebrauch der Sprache stilistisch merkwürdig aussieht. Manchmal durch die Anforderung einer Schnittstelle mit weitaus weniger möglichen inkonsistenten oder verwickelten Verwendungen (öffentlich oder privat). usw.

Je größer das Projekt ist, desto höher ist die Wahrscheinlichkeit von Fehlern. Wem ein neuer Codierer möglicherweise nicht ausgesetzt ist, wenn er nur mit kleinen Programmen vertraut ist. So ist die mögliche Verwirrung darüber, warum OOP wertvoll ist.

hotpaw2
quelle
2

Ihre Frage scheint eher nach dem Zweck von OOP zu gehen als nach dem Unterschied. Das Konzept in Ihrem Beitrag lautet Encapsulation. und Kapselung existiert, um ÄNDERUNG zu unterstützen. Wenn andere Klassen auf Ihre Interna zugreifen, ist es schwierig, sie zu ändern, ohne sie zu beschädigen. In OOP stellen Sie eine Schnittstelle (öffentliche Mitglieder) bereit, über die Sie anderen Klassen die Interaktion mit Ihrer ermöglichen und Sie verbergen Ihre Interna, damit sie sicher geändert werden können.

Eoin Carroll
quelle
Verwenden Sie einfach Funktionsprototypen. Das ist Einkapselung.
annoying_squid
2

Unabhängig davon, wo ich private Variablen lese, kann nicht auf sie zugegriffen werden, wohingegen öffentliche Variablen dann so global und privat wie lokal sein können, was ist der Unterschied? Was ist die wirkliche Nutzung von öffentlich und privat? Bitte sagen Sie nicht, dass es von jedem verwendet werden kann. Ich nehme an, warum verwenden wir nicht einige Bedingungen und tätigen die Anrufe?

Ich hoffe, Sie möchten nie mehr als eine Zeichenfolge in Ihrer Anwendung haben. Ich hoffe auch, dass Ihre lokalen Variablen zwischen Funktionsaufrufen bestehen bleiben. Diese Dinge könnten in Bezug auf Zugänglichkeit, aber in Bezug auf Lebensdauer und andere Nutzung gleich sein? Sie sind absolut nicht dasselbe.

DeadMG
quelle
1

Wie viele sagten, wird jedes Programm, sobald es kompiliert ist, in einen Binärcode verwandelt, und da eine Binärzeichenfolge verwendet werden kann, um eine ganze Zahl darzustellen, ist jedes Programm letztendlich nur eine Zahl. Das Definieren der benötigten Nummer kann jedoch ziemlich schwierig sein, weshalb Programmiersprachen auf hoher Ebene entwickelt wurden. Programmiersprachen sind nur Modelle des Assembler-Codes, den sie schließlich erzeugen. Ich möchte Ihnen den Unterschied zwischen prozeduraler und OO-Programmierung anhand dieses sehr schönen Papiers über kontextorientierte Programmierung erläutern. Http://www.jot.fm/issues/issue_2008_03/article4/

Wie Sie auf diesem Bild sehen können, das in dem Artikel dargestellt ist, bietet die prozedurale Programmierung nur eine Dimension, um eine Recheneinheit mit einem Namen zu verknüpfen. Hier werden Prozeduraufrufe oder Namen direkt auf Prozedurimplementierungen abgebildet. In Abbildung 1 bleibt dem Aufruf von m1 keine andere Wahl als der Aufruf der einzigen Implementierung der Prozedur m1.

Die objektorientierte Programmierung erweitert die prozedurale Programmierung um eine weitere Dimension der Namensauflösung. Zusätzlich zum Methoden- oder Prozedurnamen berücksichtigt der Nachrichtenversand den Nachrichtenempfänger beim Nachschlagen einer Methode. In Abbildung-b sehen wir zwei Implementierungen der Methode m1. Die Auswahl der geeigneten Methode hängt nicht nur vom Nachrichtennamen m1 ab, sondern auch vom Empfänger der eigentlichen Nachricht, hier Ry.

Dies ermöglicht tatsächlich eine Kapselung und Modularisierung.

Bildbeschreibung hier eingeben

In Abbildung c geht es schließlich um die themenorientierte Programmierung, die den objektorientierten Methodenversand um eine weitere Dimension erweitert.

Hoffe, das hat dir geholfen, bei OOP aus einer anderen Perspektive zu denken.

Silli
quelle
0

(+1) Eine Frage zu etwas zu stellen, das du nicht verstehst, ist gut, auch wenn es albern klingt.

Der Unterschied liegt in der objekt- und klassenorientierten Programmierung. "Plain C" arbeitet mit Daten und Funktionen. "C ++" fügt "object & classes" -Konzepte sowie mehrere verwandte sekundäre Konzepte hinzu.

Ich empfehle Entwicklern jedoch, "Plain C" vor "C ++" zu lernen. Oder "Procedural Pascal" vor "Object Pascal".

Viele Entwickler sind der Meinung, dass Studenten nur eines unterrichten sollten.

Zum Beispiel alte Lehrer, die kein OO bekommen und nur "Plain Structured C" unterrichten.

Oder "Hipster" -Lehrer, die nur OO unterrichten, aber nicht "Plain C", weil "Sie es nicht brauchen". Oder beides, ohne sich um die Unterrichtsordnung zu kümmern.

Ich denke eher, dass den Schülern sowohl "Structured Plain C" als auch "Object Oriented C (C ++)" beigebracht werden sollten. Mit "Plain C" zuerst und "C ++" später.

In der realen Welt müssen Sie beide Paradigmen lernen (plus andere Paradigmen wie "funktional").

Strukturierte Programme als großes, einzelnes "Objekt" zu betrachten, kann hilfreich sein.

Sie sollten auch Wert auf Namespaces ("Module") legen. In beiden Sprachen ignorieren viele Lehrer dies einfach, aber es ist wichtig.

umlcat
quelle
Namespaces und Überladungen erschweren nur das Verständnis des Programms. Es macht den Identifikationsprozess kontextsensitiv. Wenn Sie foo()in C ++ sehen, kann es sich um eine globale Funktion, eine Funktion im aktuellen Namespace, eine Funktion im verwendeten Namespace using, eine Methode, eine geerbte Methode und im Funktionsaufruf um eine Funktion in einem Namespace handeln kann durch eine argumentbasierte Namenssuche aufgelöst werden. Ähnliches gilt für Java und C #. In C kann es sich nur um eine statische Funktion in der aktuellen Quelldatei oder eine aus einem Header handeln.
Calmarius
Das Schreiben von MODULE_Foo () überall mag eine visuelle Unordnung sein, aber zumindest wissen Sie genau, um welche Funktion es sich handelt.
Calmarius
@Calmarius die Lösung ist eindeutig, nichts foo zu nennen .
0

Mit einem Wort: Projektmanagement. Was ich damit meine ist, dass C ++ mir hilft, Regeln durchzusetzen, wie mein Code von anderen verwendet wird. Bei der Arbeit an einem 5,5-Millionen-Zeilen-Projekt finde ich die objektorientierte Programmierung sehr hilfreich. Ein weiterer Vorteil ist der Compiler, der mich (und alle anderen) dazu bringt, bestimmte Regeln zu befolgen und kleinere Fehler in der Kompilierungszeit zu erkennen. Alle theoretischen Vorteile gibt es auch, aber ich wollte mich nur auf die alltäglichen praktischen Dinge konzentrieren. Immerhin kompiliert sich alles in Maschinencode.

Gus
quelle
-1

Objektorientierte Programmierung ist Prozedurale Programmierung mit Boxen.

In PP haben Sie eine Box, einen Zustand, der mit dem Anwachsen des Projekts unglaublich groß wird, was jedes Mal zu Nebenwirkungen führt, wenn Sie einen kleinen Teil dieses großen Zustands vergessen.

In OO gibt es viele Boxen, viele Status, und wenn das Projekt wächst, wachsen die Boxen ein wenig und die Anzahl der Boxen wächst stark.

Es bleibt einfacher, kleinere Boxen zu betrachten, die Illusion eines ganzen Bildes zu haben, aber tatsächlich fast unmöglich, da das Betrachten von Klassen und Schnittstellen die Implementierungsdetails verbirgt, die wichtige Auswirkungen haben können.

In der funktionalen Programmierung haben Sie viele Funktionsfelder und entscheiden, dass jede Funktion einen Eintrag (Parameter) und einen Ausgang (Rückgabe) hat, ohne dass ein anderer Zugriff auf den externen Kontext möglich ist.

Da es keinen Zustand und keine Nebenwirkungen gibt (beabsichtigt), können Sie jede Funktion sicher und unabhängig vom Ganzen analysieren und zu 100% wissen, wie sie sich unter bestimmten Umständen verhält.

Da Sie Code nach logischen Einheiten boxen, die Aktionen darstellen, ist es auch möglich, nur eine Box pro typischer Aktion zu haben.

Dadurch wird der Code eines Großprojekts im Vergleich zu OOP um einen großen Faktor verkleinert, wodurch mehrere analoge Funktionen in der gesamten Codebasis in verschiedenen Klassen ausgeblendet werden.

Dies wird auch PP bei weitem übertreffen, da Sie das Projekt viel länger wachsen lassen können, da es keinen weiteren XXXXXXXL-Status gibt, den Sie nachverfolgen können.

Zusammenfassend ist PP wahrscheinlich der einfachste Weg, sich einem einfachen Programm zu nähern, und FP ist wahrscheinlich der einfachste Weg, sich einem komplexen Programm zu nähern.

Wenn Sie das Ziel berücksichtigen, alle Codebasen zu vereinheitlichen und die Wiederverwendung von Code zu verbessern, sollten Sie immer FP verwenden, da dies das einzige Paradigma ist, das in großem Maßstab Sinn macht, und das einzige Paradigma, das zu 100% wiederverwendbar ist (Sie können) Kopieren Sie einfach eine Funktion, fügen Sie sie ein und verwenden Sie sie an einer anderen Stelle (ohne Overhead).

Und Sie erhalten 100% zuverlässige Unit-Tests kostenlos.

Und du musst nicht "private static final of_doom genius awesome string_1" schreiben.

Und Sie erhalten kostenlos Parallelität.

Morg.
quelle
-3

Der einfache Unterschied von einem Satz ist, dass C ++ C mit Klassen ist (obwohl es jetzt viel mehr ist). Ich weiß nicht, warum Sie die Unterschiede zwischen zwei nicht lernen wollen, indem Sie einen großartigen Artikel über C ++ bei Wikipedia lesen. Dieser Artikel wird Ihnen sehr helfen: - C ++ (Wikipedia)

Auch das googeln in der Sache hilft. Es kann schwierig sein, zufällige Personen zu bitten, dies zu erklären. Meiner Meinung nach versteht man unter Lesen besser, als jemanden zu fragen

Pankaj Upadhyay
quelle
Ich habe diese gelesen, aber sie haben nur gesagt, wo sie verwendet werden, aber meine Frage immer noch nicht gelöst.
niko
Ich habe die Frage nicht gestellt, ohne mich anzustrengen. Ich habe gegoogelt, aber konnte den Unterschied immer noch nicht verstehen. Deshalb habe ich mich mit stackoverflow getroffen, um mir dabei zu helfen
niko
1
@ niko, du verstehst mich hier falsch. Was ich meinte war, dass Sie versuchen sollten, den Unterschied zwischen den beiden durch Lesen zu verstehen. Deine Freunde zu fragen ist nicht gut. Weil sie ihr eigenes Verständnis vermitteln, das Sie möglicherweise nicht zufrieden stellt. Aber keine Sorge, hier gibt es großartige Kollegen, die werden Ihnen sicherlich weiterhelfen :-)
Pankaj Upadhyay
2
Ich habe nicht abgelehnt, war aber sehr versucht, "C ++ ist C mit Klassen". Diejenigen von uns, die tatsächlich C ++ können, versuchen, das aus dem Kopf der Leute zu bekommen .
DeadMG
1
@ Pankaj: Richtig. Es war C mit Klassen. Es ist definitiv nicht mehr C mit Klassen und es so zu nennen ist fast 30 Jahre veraltet. C ++ hat seitdem einen sehr langen Weg zurückgelegt. Leute, die C ++ jetzt nie codieren, verweisen jemals so darauf. Es fördert die schlimmsten Gewohnheiten und den falschen Eindruck.
DeadMG