it-swarm.com.de

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

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

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 nie für die Entwicklung von Programmen in Visual Basic.NET verwenden: Was sind die Vorteile davon?

Mir wurde auch gesagt, dass auf eine Variable, auf 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 Variablen 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?

Warum sollte ich mich für objektorientierte Programmierung interessieren, da es einen prozeduralen Weg zu geben scheint, alles objektorientiert zu machen?

80
niko

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 Kapselung) 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, weil es für Sie so aussieht, als müsste Ihre Anwendung lediglich Daten speichern. 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 noch global mache, kann ich Daten von überall lesen und es gibt keine Probleme." - Und Sie haben Recht, basierend auf dem Umfang der Projekte, die Sie gerade schreiben, gibt es wahrscheinlich nicht so viele Probleme (oder es gibt sie, aber Sie sind sich ihrer noch nicht bewusst geworden).

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

Angenommen, Sie starten ein neues Projekt, öffnen Ihren Texteditor und beginnen mit dem Schreiben von Funktionen. Jedes Mal, wenn Sie etwas speichern müssen (um es für später zu speichern), erstellen Sie eine Variable. Zur Vereinfachung machen Sie Ihre Variablen global. Ihre erste Version Ihrer App läuft großartig. Jetzt fügen Sie weitere Funktionen hinzu. Sie haben mehr Funktionen, bestimmte Daten, aus denen 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, werden Sie es in Zukunft unbedingt bemerken), ist, dass Sie mit zunehmender Größe Ihres Codes immer länger brauchen, um die nächste Funktion hinzuzufügen. Und wenn Ihr Code größer wird, wird es immer schwieriger, Funktionen hinzuzufügen, ohne etwas zu beschädigen, das früher funktioniert hat. Warum? Weil Sie sich merken müssen, was alle Ihre globalen Variablen speichern, und Sie müssen sich merken, wo alle von ihnen geändert werden. Und Sie müssen sich daran erinnern, welche Funktion zum Aufrufen von welche genaue Reihenfolge in Ordnung ist. Wenn Sie sie in einer anderen Reihenfolge aufrufen, werden möglicherweise Fehler angezeigt, da Ihre globalen Variablen dies nicht tun noch recht gültig. Bist du jemals darauf gestoßen?

Wie groß sind Ihre typischen Projekte (Codezeilen)? Stellen Sie sich jetzt ein Projekt vor, das 5000 bis 50000 Mal so groß ist wie Ihr Projekt. Außerdem arbeiten mehrere Personen darin. Wie kann sich jeder im Team daran erinnern (oder sich dessen überhaupt bewusst sein), 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 einschränken, wie viele Funktionen Zugriff auf Daten haben. Wenn ich 5 Ganzzahlen und eine Zeichenfolge 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 dieselben Werte setzen/erhalten? Auch ohne OO Sprachen (dh C)) haben die Leute 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, Einfache Programmierung wird nicht "Kann ich von Funktion Y aus auf Variable X zugreifen", sondern "Wie stelle ich sicher, dass NUR die Funktionen A, B, C und niemand anderes die Variable X berührt".

Aus diesem Grund wurden OO Konzepte eingeführt und deshalb sind sie so leistungsfähig. Sie ermöglichen es Ihnen, Ihre Daten vor sich selbst zu verbergen, und Sie wollen dies absichtlich tun Denn je weniger Code diese Daten sieht, desto geringer ist die Wahrscheinlichkeit, dass Sie beim Hinzufügen der nächsten Funktion etwas kaputt machen. Dies ist der Hauptzweck für die Konzepte der Kapselung und OO Sie ermöglichen es Ihnen, unsere Systeme/Subsysteme in noch detailliertere Felder zu unterteilen, bis zu einem Punkt, an dem unabhängig von der Größe des Gesamtprojekts auf einen bestimmten Satz von Variablen möglicherweise nur über 50 bis 200 Codezeilen zugegriffen werden kann Es gibt offensichtlich noch viel mehr zu OO Programmierung, aber im Wesentlichen bietet C++ Ihnen daher 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 bemühen, solche Schichten zu erstellen, aber in C++, wenn Wenn Sie eine Klasse deklarieren, erstellen Sie automatisch eine Abstraktionsschicht (es liegt immer noch an Ihnen, ob diese Abstraktion einen Wert hinzufügt oder entfernt). Sie sollten mehr über Abstraktionsschichten lesen/recherchieren, und wenn Sie weitere Fragen haben, bin ich mir sicher, dass dies der Fall ist Das Forum wird diese auch gerne beantworten.

138
DXM

Hmm ... vielleicht ist es am besten, ein Backup zu erstellen und eine Vorstellung von der grundlegenden Absicht der objektorientierten Programmierung zu geben. Die objektorientierte Programmierung soll vor allem die Erstellung abstrakter Datentypen ermöglichen. Betrachten Sie für ein wirklich einfaches Beispiel, mit dem Sie zweifellos vertraut sind, eine Zeichenfolge. Eine Zeichenfolge verfügt normalerweise über einen Puffer, der den Inhalt der Zeichenfolge enthält. Einige Funktionen können die Zeichenfolge bearbeiten (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 benötigt wird, um die größere zu speichern 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. Jede Zeichenfolge hat Inhalte mit einer bestimmten Länge, daher müssen wir diesen Inhalt/diese Länge für diese Zeichenfolge verfolgen. Umgekehrt kann dieselbe Funktion (z. B. zum Extrahieren eines Teilstrings) zu unterschiedlichen Zeiten mit vielen verschiedenen Zeichenfolgen arbeiten, so dass Daten nicht lokal für die einzelne Funktion sein können.

Als solches erhalten wir einige Daten, die für die Zeichenfolge privat sind, sodass nur (direkt) auf Zeichenfolgenfunktionen zugegriffen werden kann. Die Außenwelt kann get die Länge der Zeichenfolge mithilfe einer Zeichenfolgenfunktion ermitteln, muss jedoch nichts über die Interna der Zeichenfolge wissen, um sie abzurufen. Ebenso kann die Zeichenfolge geändert werden - dies geschieht jedoch wiederum über die Zeichenfolgenfunktionen, und nur sie ändern direkt die Variablen, die für das Zeichenfolgenobjekt lokal sind.

In Bezug auf die Sicherheit würde ich bemerken, dass dies zwar als Analogie vernünftig ist, aber nicht 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 soll erzwingen die Einschränkungen, damit (zum Beispiel) ein normaler Benutzer kann nicht Dinge tun, die einem Administrator vorbehalten sind. Im Gegensatz dazu soll die Zugriffskontrolle in C++ nur nfälle verhindern. Jeder, der möchte, kann sie ganz einfach umgehen. Sie befinden sich in derselben 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 trivial, sie von schreibgeschützt in schreibgeschützt zu ändern. Alles, was Sie auf schreibgeschützt setzen, lässt Sie mindestens eine Sekunde darüber nachdenken und entscheiden, um die Datei zu löschen, damit sie nicht versehentlich gelöscht wird, wenn Sie zur falschen Zeit die falsche Taste drücken .

10
Jerry Coffin

OOP versus C handelt nicht wirklich von den Dingen, die Sie besprochen haben. Es geht in erster Linie darum, Code in Bereiche zu verpacken, die sich nicht unbeabsichtigt (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 potenziell großer Vorteil von OOP ist also) dass Sie mit viel größerer Wahrscheinlichkeit eine bessere Code-Anordnung haben, ohne viel Erfahrung, um Ihnen zu sagen, dass Sie sollten.

6
John Fisher

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 häufigen Fallstricken schützt. Das macht eine gute Klasse zu einem Baustein, der viel besser als eine Reihe von Funktionen und Variablen wiederverwendbar ist, die zwar gut funktionieren, Ihnen aber all ihre hässlichen Eingeweide 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 Verfahrenslösung wie ein Bündel von Drähten, Chips, Zinn und einem Lötbit ist.

Ein Punkt, der nicht ausführlich erörtert wurde, ist der Aspekt der Schnittstelle/Implementierung. Eine Schnittstelle beschreibt das Verhalten, aber nicht die Realisierung. Eine Listenschnittstelle beschreibt also das Konzept einer Liste und ihr Verhalten: Sie würden Dinge wie Hinzufügen, Entfernen und Größen von Methoden erwarten. Nun gibt es viele verschiedene Möglichkeiten, diese Liste zu implementieren, z. als verknüpfte Liste oder unter Verwendung eines Array-Puffers. Die Stärke von 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 nicht eine Listenimplementierung ersetzen 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: z. Für Bibliotheken können Sie eine Schnittstelle für Dinge definieren die noch nicht einmal 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.

4
Landei

Es gibt eine Möglichkeit, alles mit einer Turing-Maschine oder zumindest in einer Assemblersprache für den Maschinencode zu tun, bis zu dem ein C- oder C++ - Programm schließlich kompiliert wird.

Der Unterschied besteht also nicht darin, was der Code kann, sondern darin, was Menschen tun können.

Menschen machen Fehler. Viele.

OOP führt ein Paradigma und eine Syntax ein, die dazu beitragen, die Größe und Wahrscheinlichkeitsdichte des Raums möglicher menschlicher Codierungsfehler zu verringern. Manchmal, indem der Fehler für eine bestimmte Klasse von Datenobjekten unzulässig 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 stilistisch merkwürdig aussieht, verglichen mit dem kanonischen Gebrauch der Sprache. Manchmal, indem eine Schnittstelle mit weitaus weniger möglichen inkonsistenten oder verwickelten Verwendungen (öffentlich oder privat) benötigt wird. usw.

Je größer das Projekt, 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. Daher ist die mögliche Verwirrung darüber, warum OOP] wertvoll.

3
hotpaw2

Ihre Frage scheint eher den Zweck von OOP als den Unterschied) zu betreffen. Das Konzept in Ihrem Beitrag lautet "Kapselung". Die Kapselung unterstützt CHANGE. Wenn andere Klassen auf Ihre Interna zugreifen, wird es schwierig, Änderungen vorzunehmen In OOP) stellen Sie eine Schnittstelle (öffentliche Mitglieder) bereit, über die Sie anderen Klassen die Interaktion mit Ihren Klassen ermöglichen, und Sie verbergen Ihre Interna, damit sie sicher geändert werden können.

2
Eoin Carroll

Egal, wo ich lese, auf private Variablen kann nicht zugegriffen werden, wohingegen auf öffentliche Variablen zugegriffen werden kann. Warum nicht öffentlich so global und privat wie lokal machen, was ist der Unterschied? Was ist die wirkliche Verwendung 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. Ich hoffe auch, dass Ihre lokalen Variablen zwischen Funktionsaufrufen bestehen bleiben. Diese Dinge mögen in Bezug auf die Zugänglichkeit gleich sein, aber in Bezug auf die Lebensdauer und andere Nutzung? Sie sind absolut nicht gleich.

2
DeadMG

Wie viele sagten, wird jedes einmal kompilierte Programm in einen Binärcode umgewandelt, und da eine Binärzeichenfolge zur Darstellung einer Ganzzahl verwendet werden kann, ist jedes Programm letztendlich nur eine Zahl. Die Definition der benötigten Nummer kann jedoch ziemlich schwierig sein, und deshalb wurden Programmiersprachen auf hoher Ebene entwickelt. Programmiersprachen sind nur Modelle des Assembly-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 erklären http://www.jot.fm/issues/issue_2008_03/article4 /

wie Sie auf diesem Bild sehen können, bietet die prozedurale Programmierung nur eine Dimension, um eine Recheneinheit einem Namen zuzuordnen. Hier werden Prozeduraufrufe oder -namen direkt Prozedurimplementierungen zugeordnet. In Abbildung-a lässt ein Aufruf von m1 keine andere Wahl als den Aufruf der einzigen Implementierung der Prozedur m1.

Die objektorientierte Programmierung erweitert die prozedurale Programmierung um eine weitere Dimension für die Namensauflösung. Zusätzlich zum Namen der Methode oder Prozedur 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 in der Tat die Kapselung und Modularisierung.

enter image description here

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

Ich hoffe, dies hat Ihnen beim Nachdenken über OOP aus einer anderen Perspektive) geholfen.

1
Andrea Sindico

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

Der Unterschied besteht in der objekt- und klassenorientierten Programmierung. "Plain C" arbeitet mit Daten und Funktionen. "C++" fügt "Objekt- und Klassen" -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 denken, dass Studenten nur ein Zeug unterrichten sollten.

Zum Beispiel alte Lehrer, die kein O.O. erhalten und nur "Plain Structured C" unterrichten.

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

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

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

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

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

0
umlcat

In einem Wort: Projektmanagement. Ich meine, dass C++ mir hilft, Regeln für die Verwendung meines Codes durch andere durchzusetzen. 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 sind auch vorhanden, aber ich wollte mich nur auf alltägliche praktische Dinge konzentrieren. Immerhin wird alles zu Maschinencode kompiliert.

0
Gus