2009-02-04 12 views
6

Während ich einige Programmierbücher lese, bemerke ich, dass die Autoren sagen, dass Sie in OOP vielleicht etwas verwirrt sind, während Sie die Grundidee von OOP verstehen.OOP Konzepte Verwirrung?

Und Hölle ja !. Ich hatte etwas Verwirrung. Hattest du das gleiche und was macht diese Verwirrung für Programmierer (selbst erfahrene Programmierer) ?!

Und wenn du es hättest, wie konntest du das schlagen ?!

Dank

+0

Könnten Sie bitte näher erläutern, was Sie verwirrend finden? – Rik

+0

+1 zu Rik. Kannst du uns mehr erzählen? –

+0

Was ist die Grundidee in OOP und warum finden Sie es verwirrend? Für mich ist es "Klassen sollten die einzigen Module sein" und es ist nicht verwirrend. –

Antwort

4

Die Animal Trope funktioniert, wenn es für die meisten Menschen zu erklären.

(Weitere nützliche Links here und here)

+1

Bis sie in die reale Welt kommen und entdecken, dass Menschen (zu Recht) Vererbung für meiden Zusammensetzung. 'cow.moo()' -> 'soundService.makeSound (Kuh)' :) –

1

Ich denke, dass vor allem Programmierer, die in der Entwicklung mit funktionsorientierten Sprachen erlebt wurden, hatten Probleme, die Konzepte der OOP zu verstehen. Zumindest war es sehr verwirrend für mich und ich habe eine ganze Menge Dinge programmiert, während ich eine OOP-Sprache (Java) benutzte.

Aber ich denke auch, dass der OOP Ansatz eine großartige Sache für Anfänger ist, weil dieser Ansatz sehr "natürlich" ist.

+0

JavaScript ist großartig für dieses, weil es eine Funktionssprache und eine HOHE OOP Sprache ist, also könnte es gerade die beste Übergangssprache – UnkwnTech

+0

sein Ich weiß, was du meinst :) Zu Lernzwecken ist es schade, dass du damit keine Anwendung erstellen kannst. Daher denke ich, dass Delphi für diese Übertragung gut ist, weil es Ihnen ermöglicht, sowohl funktional als auch objektorientiert zu entwickeln. – dajood

3

Ein großer Teil der Verwirrung, wenn OOP lernen von dem Versuch kommt die richtige Beziehung zwischen Objekten und Klassen von Objekten zu holen, vor allem, ob:

  • ObjectenthältSome other Object (oder Object1hat eine Object2)
  • Objectist eine Instanz vonClass

Wenn ich ein gutes Beispiel denken kann, die einen Fall zeigt, wo entweder angemessen sein könnte, werde ich es hinzufügen ...

+0

+1 für has-a vs ist-a – annakata

0

Dank für Ihre Antworten danken.

Ich denke, geben Beispiele funktioniert am besten, aber nicht jedes Mal, oder?!

Ich hörte den Schöpfer von C++, als er sagte, es braucht Zeit und Geduld, und Sie werden es besser verstehen, indem Sie es versuchen.

+0

Sehr wahr, aber solange Sie durch diese Praxis Ihr theoretisches Verständnis reflektieren. Das wird die Dinge auf lange Sicht viel konkreter machen. – Mystic

1

Ich hatte nie wirklich Verwirrung, aber ich lernte das Programmieren entlang der Zeitachse, die es entwickelte. Also hatte ich Assembly, C, C++, Java, C# und viele andere, die hier nicht relevant sind. Was Sie umfassen müssen, ist, dass alles durch ein Objekt ausgedrückt werden soll und ein Objekt Informationen enthält, die sich selbst beschreiben (Eigenschaften) und dass sie damit verbundene Aufgaben ausführen können (Methoden i.E .: Car.GetAllCars();).

Für Vererbung und Polymorphismus und den ganzen Rest empfehle ich üben. übe alles - seit Übung macht den Meister. Versuchen Sie, die Beispiele in allen Büchern zu entwickeln.

1

Sobald Sie die oo Grundlagen verstehen, werfen Sie einen Blick auf Design-Muster und Design-Prinzipien (z. B. durch Lesen Head First Design Patterns). Es wird Ihnen beibringen, wie Sie tatsächlich die Werkzeuge verwenden sollten, die oo Ihnen gibt. Dies ersetzt zwar nicht die praktische Erfahrung, kann aber den Lernprozess beschleunigen.

+0

+1 für den Vorschlag, dass Buch :) – Mystic

2

Ja, ich habe anfangs ein wenig Verwirrung erlebt. Das war damals, als OO gerade Mainstream wurde, also gab es eine Menge Bücher, die das Thema behandelten, aber es nicht gut für Leute erklärten, die nicht wussten, was es war. Als Ergebnis habe ich angefangen zu denken, dass ein Objekt und eine Klasse weitgehend austauschbar sind und eine neue Klasse für jedes Objekt definieren, das ich erschaffen wollte.

Ich habe es endlich verstanden, indem ich auf LambdaMOO herumgespielt habe, einem MUD (denke World of Warcraft, aber ohne Grafiken) mit einer objektorientierten Programmiersprache im Spiel. Ironischerweise unterscheidet MOOCode nicht zwischen Klassen und Objekten - Objekte erben direkt von anderen Objekten. (Es hatte eine Konvention von Objekten, die als "Basisklassen" verwendet werden sollten, um "Generic Foo" genannt zu werden, um sie von bestimmten (Instanz-) Foos zu unterscheiden, aber das ist so nahe an einer Klassen-/Objektunterscheidung hatte.

+1

Dies ist auch, wie ich kam, um OOP vollständig zu verstehen! LambdaMOO für den Sieg. – Brendan

+0

"Ironischerweise unterscheidet MOOCode nicht zwischen Klassen und Objekten - Objekte erben direkt von anderen Objekten" - OOP benötigt keine Klassen. Was Sie beschreiben, heißt [prototypbasiert] (https://en.wikipedia.org/wiki/Prototype-based_programming) OOP, und JavaScript ist ein Beispiel für eine populäre Sprache, die diesen Ansatz verwendet. –

+0

@ el.pescado - Die Ironie, auf die ich mich bezog, ist, dass ich den Unterschied zwischen Klassen und Objekten durch das Arbeiten mit einer Sprache, in der diese Unterscheidung nicht existiert, verstanden habe. Man würde erwarten, dass ein solches Verständnis dadurch entsteht, dass man eine Sprache lernt, die eine starke Unterscheidung zwischen einer Sprache macht, die sie als austauschbar betrachtet. Ich wollte nicht sagen (oder andeuten), dass MOOCode keine "echte" OOP ist. –

3

OOP nimmt einen "problemorientierten" Ansatz zur Programmierung im Gegensatz zu der traditionelle "maschinenorientierte" Ansatz in Sprachen wie C und Pascal verwendet. Das Lernen von OOP kann ziemlich schwierig sein, wenn Sie ausführlich in prozeduralen/funktionalen Sprachen programmiert haben. Es ist für diese Programmierer, dass die Dinge eher verwirrend sind. Wenn Sie neu in der Programmierung sind, werden Sie wahrscheinlich Dinge viel weniger verwirrend finden, da Sie mit einem neuen Geist beginnen.

Nachdem ich das gesagt habe, habe ich viele Programmierer gesehen, die ausführlich mit Sprachen wie Java gearbeitet haben und behaupten, gute OOP-Programmierer zu sein, wenn sie wirklich weit davon entfernt waren. Sicher verwenden sie Java-Sprachfunktionen wie Schnittstellen, Vererbung usw. und erstellen Objekte, die Instanzen von Klassen sind, und senden eine Nachricht an ein Objekt. Die meisten Leute benutzen eine Menge OOP-Jargon, weil sie ihm ausgesetzt sind. Aber wenn es darum geht, eine einfache Anwendung zu schreiben, entlarvt ihr resultierender Code ihr schlechtes Verständnis.

Ich rate Ihnen, nicht in Jargon allein gefangen zu werden. Frage und lerne die zugrundeliegenden Konzepte gewissenhaft. Sie könnten Ihr erstes Semi-Nirvana (wie ich) haben, wenn Sie Polymorphie lernen und die Vorteile, die es für die Wiederverwendbarkeit des Codes bringt. Ein weiteres Seminirvana, wenn Sie die Kompromisse zwischen Wiederverwendung durch Vererbung und Wiederverwendung über Komposition verstehen. Am Ende werden Sie wissen, dass Sie OOP gut verstanden haben, wenn Sie in der Lage sind, gut zu entwerfen, oder besser gesagt, ein gutes OO-Design ist ein gutes Maß dafür, wie gut Sie OOP verstehen.

Wenn Sie OOP ernst nehmen, sollten Sie die ersten beiden Kapitel der GOF book on Design Patterns lesen. Es mag ein wenig schwierig für neue Programmierer sein, aber es legt den Kern des Denkens hinter OOP. Dieses Buch ist eine wichtige Referenz, die jeder ernsthafte OOP-Programmierer haben sollte. Wenn Sie die Konzepte in diesem Buch gut verstehen, halten Sie sich für einen guten OO-Programmierer.

+0

Ich und andere Leute haben Semi-Nirvana erreicht [lernen über das Tell Do not Ask-Prinzip] (http://programmers.stackexchange.com/a/59209/93338). – Piovezan

2

In der Tat denke ich, viel zu viel Gewicht wird auf das "Klasse" -Konzept gelegt.

Der größte Sprung nach vorn in meinem Verständnis war beim Lesen über das "Sag, frag nicht" -Prinzip.

Ich habe erst begonnen, Objektorientierung zu fühlen, wenn ich mit Enten-typisierten Umgebungen wie Ruby, JavaScript, Python usw. experimentiere und nach 8 Jahren glücklich Lastwagenladungen von Klassen in C++ erstelle.

Statisch typisierte Sprachen eignen sich hervorragend für Produktionscode, aber Sie zahlen viel Aufwand, wenn Sie versuchen, ein Gefühl für die Objektorientierung zu bekommen.

Auch neben dem häufig verwendeten Begriff OOP, oft vergisst man, dass zuerst kommt OO A und OO D.