15 Stimmen

Definition von OOP für einen neuen Programmierer

Beim Unterrichten einer ersten Sprache für jemanden ohne Programmierkenntnisse fällt es mir schwer, OOP zu definieren, obwohl ich OOP bevorzuge.

0 Stimmen

0 Stimmen

@hasen j - Das hatte ich nicht gesehen, aber hier gibt es einige gute Antworten.

0 Stimmen

Siehe auch: "Jargonfreier Vergleich von OOP vs. Procedural": stackoverflow.com/questions/1530868

28voto

VirtuosiMedia Punkte 49396

Sie könnten es mit folgendem Ansatz versuchen, den ich aus einem Beitrag in einem Forum, den ich vor einiger Zeit verfasst habe, leicht abgewandelt habe:

Das grundlegende Vokabular für OOP besteht aus einer Klasse, einer Methode und einem Parameter.

Eine Klasse ist eine Gruppe von Funktionen, die zusammenarbeiten, um eine Aufgabe zu erfüllen. Eine Instanz einer Klasse wird als Objekt betrachtet.

Eine Methode bezieht sich einfach auf eine Funktion, die in einer Klasse eingeschlossen ist.

Ein Parameter ist eine Variable, die an eine Funktion übergeben wird, um ihr Anweisungen zu geben, wie sie handeln soll, oder um ihr Informationen zur Verarbeitung zu geben.

Wenn Sie ein wenig recherchieren, werden Sie eine Fülle von Informationen über Entwurfsmuster finden. Einige davon könnten nützlich sein, wenn man sie sich anschaut, obwohl ich vorsichtig sein würde, sich anfangs zu sehr damit zu beschäftigen, weil sie überwältigend sein können. Es gibt zwei hilfreiche (und etwas überstrapazierte) Akronyme, die Sie sich merken sollten, wenn Sie versuchen, sich in eine OOP-Mentalität zu versetzen: DRY und KISS.

DRY steht für Don't Repeat Yourself und bedeutet genau das. Wenn Sie einen Code schreiben, sollten Sie diesen bestimmten Code nie mehr wiederholen müssen. In der Praxis bedeutet das, abstrakter zu denken und von Anfang an besser zu planen. Ich werde gleich ein Beispiel geben.

KISS steht für Keep It Simple, Stupid und bedeutet, dass Sie versuchen sollten, einen Code zu schreiben, der sein Ziel auf möglichst einfache Weise erreicht. Einfacher bedeutet weniger Möglichkeiten für Fehler und leichtere Wartung. Im Zusammenhang mit OOP bedeutet dies normalerweise, dass jede Methode oder Funktion nur eine Aufgabe hat. Wenn Sie feststellen, dass eine Methode mehr als eine Aufgabe hat, bedeutet dies in der Regel, dass sie in mehrere kleinere Methoden umstrukturiert werden kann, von denen jede eine bestimmte Aufgabe hat.

Nun ein einfaches Beispiel (vielleicht fällt jemandem ein besseres ein, aber lassen Sie mich das machen):

Nehmen wir an, Sie müssen zwei verschiedene Formulare programmieren, eines, das Informationen über Autos verarbeitet, und eines, das dasselbe für Lastwagen tut.

Für Autos wollen wir die folgenden Informationen aufzeichnen:

  • Farbe
  • Motorgröße
  • Art der Übertragung
  • Anzahl der Türen

Für Lastwagen brauchen wir:

  • Farbe
  • Motorgröße
  • Art der Übertragung
  • Kabinengröße
  • Anhängelast

In der prozeduralen Programmierung würden Sie zuerst den Code für das Autoformular und dann den Code für das LKW-Formular schreiben.

Bei der objektorientierten Programmierung würden Sie eine Basisklasse namens Fahrzeug schreiben, die die gemeinsamen Merkmale von Lkw und Pkw aufzeichnet. In diesem Fall wird die Fahrzeugklasse aufzeichnen:

  • Farbe
  • Motorgröße
  • Art der Übertragung

Wir werden jedes dieser Merkmale zu einer eigenen Methode machen. Die Methode color könnte zum Beispiel die Farbe des Fahrzeugs als Parameter nehmen und etwas damit machen, z. B. es in einer Datenbank speichern.

Als Nächstes werden wir zwei weitere Klassen erstellen: Truck und Car, die beide alle Methoden der Klasse Vehicle erben und um eigene Methoden erweitern werden.

Die PKW-Klasse hat eine Methode namens numberOfDoors und die LKW-Klasse hat die Methoden cabSize und towingCapacity.

Gehen wir also davon aus, dass wir ein funktionierendes Beispiel für prozedurale und OO-Programmierung haben. Lassen Sie uns nun einige Szenarien durchspielen.

Szenario 1 : Angenommen, wir müssen plötzlich ein Busformular hinzufügen, das die folgenden Informationen aufzeichnet:

  • Farbe
  • Motorgröße
  • Art der Übertragung
  • Anzahl der Fahrgäste

Verfahren : Wir müssen das gesamte Formular neu erstellen und dabei den Code für Farbe, Motorgröße und Getriebeart wiederholen.

OOP : Wir erweitern einfach die Fahrzeugklasse um eine Busklasse und fügen die Methode numberOfPassengers hinzu.

Szenario 2 : Anstatt die Farbe in einer Datenbank zu speichern, wie wir es früher getan haben, möchte unser Kunde aus irgendeinem Grund, dass die Farbe per E-Mail an ihn geschickt wird.

Verfahren : Wir ändern drei verschiedene Formulare: Autos, Lastwagen und Busse, um die Farbe per E-Mail an den Kunden zu senden, anstatt sie in der Datenbank zu speichern.

OOP : Wir ändern die Farbmethode in der Klasse vehicle und da die Klassen car, truck und bus alle die Klasse vehicle erweitern (oder von ihr erben, um es anders auszudrücken), werden sie automatisch aktualisiert.

Szenario 3 : Wir wollen von einem generischen Auto zu spezifischen Marken übergehen, zum Beispiel: Nissan und Mazda.

Verfahren : Wir erstellen ein neues Formular für jede Marke, wiederholen den gesamten Code für die allgemeinen Fahrzeuginformationen und fügen den spezifischen Code für jede Marke hinzu.

OOP : Wir erweitern die Klasse car um eine Klasse nissan und eine Klasse mazda und fügen Methoden für jeden Satz eindeutiger Informationen für diese Automarke hinzu.

Szenario 4 : Wir haben einen Fehler im Bereich der Übertragungsart unseres Formulars gefunden und müssen ihn beheben.

Verfahren : Wir öffnen und aktualisieren jedes Formular.

OOP : Wir legen die Methode transmissionType in der Klasse vehicle fest, und die Änderung bleibt in jeder Klasse, die von ihr erbt, erhalten.

Wie Sie aus den obigen Szenarien ersehen können, hat die Verwendung eines OOP-Stils erhebliche Vorteile gegenüber der prozeduralen Programmierung, vor allem, wenn Ihr Umfang zunimmt. Bedenken Sie die Einsparungen, die wir durch OOP in Bezug auf wiederholten Code, Flexibilität und Wartung erzielen würden, wenn wir auch Formulare für Boote, Motorräder, Flugzeuge, Go-Karts, ATVs, Schneemobile usw. hinzufügen müssten.

Objekte und Methoden sind auch viel einfacher zu testen als die prozedurale Programmierung, indem man Unit-Tests zum Testen der Ergebnisse verwendet.

Bedeutet dies, dass man niemals prozedurale Programmierung verwenden sollte? Nicht unbedingt. Wenn Sie ein Mockup oder eine Proof-of-Concept-Anwendung erstellen, haben Sie vielleicht nicht die Zeit, alles objektorientiert zu machen. Daher denke ich, dass es besser wäre, für einen Prototyp prozedurale Programmierung zu verwenden, aber es wäre am besten, das Produktionsprodukt in OO-Manier zu erstellen.

1 Stimmen

Meiner Meinung nach ist das ein bisschen zu formell für einen Anfänger... aber es ist schön aufgeschrieben ;-)

1 Stimmen

Wenn ich die Frage noch einmal lese, denke ich, dass Sie wahrscheinlich Recht haben. Es würde wahrscheinlich helfen, wenn sie zumindest eine wenig Programmierung erleben. Die Frage, die damit im Forum beantwortet wurde, bezog sich auf prozedurale und OOP-Stile, so dass es vielleicht nicht genau passt...

0 Stimmen

Ich kann jedoch die erforderlichen Voraussetzungen erfüllen, um dies zu verstehen, bevor ich es verwenden würde.

16voto

Chetan S Punkte 23115

Ich verwende das Beispiel der "hüpfenden Bälle". Stellen Sie sich vor, Sie haben eine Schachtel mit einem hüpfenden Ball darin.

Sie können es auf 2 Arten programmieren:

Eine Möglichkeit besteht darin, eine Schleife laufen zu lassen, die aktuelle Position des Balls zu verfolgen, die nächste Position zu berechnen, auf Kollisionen zu prüfen, von der aktuellen Position zu löschen, ihn an der neuen Position zu zeichnen und dies zu wiederholen.

Die andere Möglichkeit besteht darin, den Ball seine eigene Position und Orientierung verfolgen zu lassen und ihm beizubringen, die nächste Position zu berechnen, sich dorthin zu bewegen und Kollisionen zu bewältigen. Führen Sie dann die Schleife aus und sagen Sie dem Ball, dass er sich immer wieder selbst aktualisieren soll.

Nun stellen Sie sich vor, Sie haben 100 Bälle. Dann gibt es schwere Bälle, leichte Bälle und explodierende Bälle. Das sind einfache Bälle mit zusätzlichen Eigenschaften. Würden Sie dann immer noch Methode 1 anwenden?

0 Stimmen

Das ist eine ausgezeichnete Beschreibung. Gut gemacht.

12voto

BobbyShaftoe Punkte 27949

Nun, Sie sollten Beispiele anführen. Ein Beispiel, das die meisten Menschen verstehen, ist das der Referenz-Videospiele. Sie haben also Monsterobjekte und Monster haben bestimmte Eigenschaften wie Farbe, Größe, Form, Anzahl der Arme und so weiter. Dann haben einige Monster verschiedene "Fähigkeiten" wie z. B. Feuer speien, Waffen abschießen und so weiter. Das sind alberne Beispiele, aber leicht zu verstehen. Ich denke, das ist für einen Neuling einfacher zu erklären als all das Gerede über "Quadrate", "Kreise" und so weiter.

0 Stimmen

Ich stimme dem nicht ganz zu, da es eine weit verbreitete falsche Vorstellung davon gibt, dass "Objekt" "etwas, das man auf dem Bildschirm sehen kann" bedeutet (in der Regel Schaltflächen, Textfelder usw.), und die Verwendung von Videospielmonstern (die auf dem Bildschirm sichtbar sind) würde dem Vorschub leisten.

0 Stimmen

Ich stimme zu, dass diese Art von Diskussion für junge Menschen sehr interessant ist. Ich beabsichtige, sie in meinen künftigen Klassen zu verwenden.

0 Stimmen

Nun, ich habe gesehen, dass es oft verwendet wird und nicht wirklich das Problem hat, Objekte mit sichtbaren Dingen zu verwechseln. Ich denke, die Vorteile überwiegen die Nachteile. Es ist kein großer Sprung zu begrifflichen/abstrakten/nicht sichtbaren Objekten. Ich denke, es ist einfacher zu verstehen, da ich gesehen habe, dass es im Unterricht erfolgreich eingesetzt wird.

6voto

S.Lott Punkte 371691

Verschwenden Sie keine Zeit mit der "Definition" von OOP.

Verwenden Sie einfach eine OOP-Sprache für alle Ihre Beispiele.

Objekte sind trivialerweise offensichtlich. Die reale Welt ist voll von Objekten.

Definieren" Sie keine Objekte. Zeigen Sie einfach Programmierbeispiele, dann wird die "Objekthaftigkeit" offensichtlich.

Menschen ohne Programmierkenntnisse haben keine dummen Erwartungen, die auf prozeduraler Programmierung beruhen.

Personen, die COBOL oder Basic gelernt haben, werden Probleme haben.


Dies hängt zum Teil von der Sprache ab. Einige Sprachen machen OOP schwer.

In C++ zum Beispiel ist die "Klasse" nur eine Definition. Sie existiert nicht als diskretes Objekt zur Laufzeit.

In Java und C++ sind einige Dinge Objekte, aber einige "primitive" Typen sind keine Objekte.

Einige Sprachen machen OOP einfacher.

In Python und Smalltalk ist alles ein Objekt. Es gibt keine primitiven Typen, die das Wasser trüben. Wenn Sie OO in einer Sprache wie Python lernen, ist die Objekthaftigkeit klar und offensichtlich, weil sie alles durchdringt. Genau wie in der realen Welt, wo es überall Objekte gibt.

0 Stimmen

Wenn Objekte trivialerweise offensichtlich sind, warum sind dann so viele Entwickler so schlecht darin, gute Objekte auszuwählen? In vielen Fällen handelt es sich gar nicht um Objekte.

0 Stimmen

@Dunk: weil viele Programmierer zuerst prozedurale Programmierung gelernt haben: VB oder C oder so etwas.

0 Stimmen

Ich bin mir nicht sicher, ob Objekte trivialerweise offensichtlich sind, aber ich denke, Sie haben die richtige Idee. Definieren Sie es nicht, tun Sie es einfach. Präsentieren Sie es als die Art und Weise, wie der Code geschrieben werden sollte. Dann kommen Sie später zurück und erklären, was Sie die ganze Zeit getan haben (und welche anderen Paradigmen es gibt).

5voto

joel.neely Punkte 30189

Eine Sportmannschaft. Die Spieler auf dem Spielfeld/auf dem Platz können in Bezug auf die Positionen, die sie spielen, festgelegt werden. Allerdings kann die gesamte Mannschaft mehrere Mitglieder haben, die eine bestimmte Position spielen können.

Jede Position ist wie eine Klasse in OO; sie spezifiziert eine Reihe von Verantwortlichkeiten. Die Teammitglieder sind Instanzen dieser Klassen.

Die Spielzüge im Spielbuch sind Muster. Jedes von ihnen gibt an, wie ein bestimmtes Ergebnis durch die Interaktion von (Instanzen von) Positionen (Klassen) erreicht werden kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X