Wie übe ich objektorientiertes Programmieren? [geschlossen]

13

Ich habe immer in prozeduralen Sprachen programmiert und bewege mich derzeit in Richtung Objektorientierung. Das Hauptproblem, mit dem ich konfrontiert bin, ist, dass ich keinen Weg sehe, um die Objektorientierung auf effektive Weise zu üben. Ich werde meinen Punkt erklären. Als ich PHP und C gelernt habe, war es ziemlich einfach zu üben: Es ging nur darum, etwas auszuwählen und über einen Algorithmus für dieses Ding nachzudenken.

In PHP zum Beispiel war es wichtig, sich hinzusetzen und zu denken: "Nun, um nur zu üben, lassen Sie mich eine Anwendung mit einem Administrationsbereich erstellen, in dem Leute Produkte hinzufügen können." Das war ziemlich einfach, es war eine Frage des Algorithmus, um einen Benutzer zu registrieren, den Benutzer anzumelden und die Produkte hinzuzufügen. In Kombination mit PHP-Funktionen war dies eine gute Möglichkeit zum Üben.

In der Objektorientierung haben wir viele zusätzliche Dinge. Es geht nicht nur darum, über einen Algorithmus nachzudenken, sondern die Anforderungen genauer zu analysieren, Anwendungsfälle zu schreiben, Klassendiagramme, Eigenschaften und Methoden zu ermitteln, die Abhängigkeitsinjektion und vieles mehr einzurichten.

Der Hauptpunkt ist, dass in der Art, wie ich die Objektorientierung gelernt habe, ein gutes Design von entscheidender Bedeutung zu sein scheint, während in prozeduralen Sprachen eine vage Idee ausreichte. Ich sage nicht , dass wir in prozeduralen Sprachen gute Software ohne Design schreiben können, nur um es zu üben, ist es machbar, während es in der Objektorientierung nicht machbar scheint, auf ein gutes Design zu verzichten, auch nicht zum Üben.

Dies scheint ein Problem zu sein, denn wenn ich jedes Mal üben muss, um Tonnen von Anforderungen, Anwendungsfällen usw. herauszufinden, scheint dies kein guter Weg zu sein, um die Objektorientierung zu verbessern, da dies erforderlich ist Ich möchte jedes Mal, wenn ich üben gehe, eine Idee für eine App haben.

Was ist aus diesem Grund ein guter Weg, um die Objektorientierung zu üben?

user1620696
quelle
1
Während meiner ersten Studienjahre war das Buch "Thinking in Java" von Bruce Eckel eine großartige Einführung in OOP. Es war die empfohlene Lektüre sowohl für Programmieranfänger als auch für Personen mit prozeduralem Entwicklungshintergrund - vielleicht hilft es Ihnen.
Ivaylo Slavov
3
PHP ist objektorientiert; Du hast es einfach nicht benutzt. php.net/manual/en/language.oop5.php
Robert Harvey
Sie können dieselbe App auch einfach mit einem OOP-Ansatz erneut implementieren. Immerhin ist es nur ein Werkzeug. Die Empfehlung von unten, ein GOF-Buch zu haben und zu versuchen, Ihren vorhandenen Verfahrenscode objektorientiert zu überdenken, kann ebenfalls eine gute Praxis sein.
JensG
Machen Sie zu Beginn kleine Spiele (ohne Grafiken), Kartenspiele oder ähnliches und versuchen Sie, Klassen in diesen Spielen wiederzuverwenden. stackoverflow.com/questions/1301606/…
grizwako

Antworten:

20

In der Objektorientierung haben wir viele zusätzliche Dinge.

Nein, tust du nicht ...

Es geht nicht nur darum, über einen Algorithmus nachzudenken, sondern die Anforderungen genauer zu analysieren, Anwendungsfälle zu schreiben, Klassendiagramme, Eigenschaften und Methoden zu ermitteln, die Abhängigkeitsinjektion und vieles mehr einzurichten.

Keines dieser Dinge ist notwendig, um objektorientiertes Programmieren zu üben.

Das war ziemlich einfach, es war eine Frage des Algorithmus, um einen Benutzer zu registrieren, den Benutzer anzumelden und die Produkte hinzuzufügen.

Bei der objektorientierten Programmierung müssen Sie nicht an die Algorithmen für diese Schritte denken, sondern darüber nachdenken, welche Objekte für diese Schritte erforderlich sind - welche Funktionalität Sie benötigen, welchen Status Sie dafür benötigen und welche Art von Schnittstelle Sie verfügbar machen möchten an den Benutzer. Genau wie bei der prozeduralen Programmierung.

Der einzige Unterschied besteht darin, dass Sie sich nicht auf die von Ihnen benötigten Funktionen und deren Funktionsweise konzentrieren, sondern darauf, wie die Funktionen und der Status in Verantwortlichkeiten zusammengefasst sind und wie diese Verantwortlichkeiten interagieren.

Wie üben? So wie Sie die prozedurale Programmierung üben: Wählen Sie ein Problem aus und lösen Sie das Problem mithilfe von Klassenbündeln. Finden Sie heraus, wie das gelutscht hat, und wiederholen Sie die Lektionen.

Telastyn
quelle
3
+1 "Finde heraus, wie das gelutscht hat" So codiere ich: Voller Scham und Selbsthass ... kämpfe immer darum, aus früheren Projekten zu lernen.
WernerCD
1
Ich mag den Ansatz. Anstatt zu kompliziert zu sein und zu versuchen, alles auf einmal zu lernen, beginnen Sie mit kleineren Schritten und wiederholen Sie den Vorgang, indem Sie das gesamte gewonnene Wissen anwenden.
SuperM
6

Gute Frage. Was Sie damit sagen, ist natürlich, dass das Üben von OOP tatsächlich das Üben all dieser Dinge (Anforderungsanalyse, Anwendungsfälle, Entwurfsmuster usw.) bedeutet, was wahr ist und auf den ersten Blick entmutigend erscheint.

Mein Rat wäre, Ihre Übungsstunden mit zwei Dingen zu beginnen: testgetriebener Entwicklung und dem Prinzip der Einzelverantwortung .

Dann fangen Sie einfach an, wie Sie es mit PHP / C getan haben: Überlegen Sie sich, was Sie dafür brauchen, und implementieren Sie diese Dinge nacheinander. Bedenken Sie jedoch, dass Sie mit den Tests beginnen müssen (was Sie dazu zwingt, die richtigen Schnittstellen zu definieren, da sonst die Testbarkeit sofort leidet) und dass TDD einen Rot-Grün-Refaktor-Zyklus impliziert. Mit anderen Worten, Sie haben ein kleines bisschen Funktionalität, und sobald es funktioniert, überarbeiten Sie, um ein richtiges OO-Design zu erhalten, wenn Sie es nicht von Anfang an geschafft haben (was Sie nicht tun werden).

Erinnern Sie sich bei diesem Refactoring-Schritt immer an die SRP. Wenn Sie Ihrem Objekt eine zweite Verantwortung hinzugefügt haben, ist es Zeit, etwas Neues zu erstellen.

Wenn Sie sich so weiterentwickeln, müssen Sie sich bewusst sein, dass Ihre endgültige Lösung sich erheblich von Ihrer ursprünglichen Lösung unterscheidet. Ihre Lernkurve wird auch ziemlich steil sein. Beispielsweise lernen Sie nicht, was ein Factory-Muster ist, sondern Sie erkennen die Notwendigkeit für etwas, das Instanzen Ihrer Klasse auf unterschiedliche Weise erstellt. Wenn Sie also noch nie von objektorientierten Entwurfsmustern gehört haben, sollten Sie diese parallel lesen.

Frank
quelle
1
Sie sagen also im Grunde "TDD und GOF lernen"
Robert Harvey
3

Wenn Sie gerade erst mit OOP anfangen, können Sie sich amüsieren und offline üben, indem Sie sich nahezu jedes reale System ansehen und überlegen, was die Objekte sind und in welcher Beziehung sie zueinander stehen und welche Methoden / Schnittstellen sie unterstützen und Wie würden Sie sie in einer Klassenhierarchie und als Sammlung instanziierter Objekte darstellen und wie würden die Objekteigentumsverhältnisse sein und so weiter (Anmerkung: Ich erwähne das Wort "Algorithmen" im obigen überhaupt nicht). Zeichnen Sie viele Diagramme (lernen Sie ein bisschen UML oder ähnliches), bevor Sie sich Gedanken über das Codieren machen.

Dies wird Ihnen helfen, ein viel besseres Verständnis für IS-A- und HAS-A- Beziehungen zu entwickeln. Dies ist wahrscheinlich die wichtigste Klassifikation in jedem OOP-Design (und trotzdem scheint es immer noch etwas zu sein, mit dem viele erfahrene OOP-Sprachprogrammierer zu kämpfen haben ). Wenn Sie IS-A / HAS-A beherrschen, gibt es auch IS-IMPLEMENTED-IN-TERMS-OF (was ich auch als IS-KIND-OF-A bezeichnet habe: ^)

Im Ernst, nächste Reise zum Supermarkt, stellen Sie sich vor, jemand hat Sie beauftragt, eine OOP-Simulation des Ortes zu schreiben ...

timday
quelle
Wenn Sie Software schreiben, um Biologen dabei zu helfen, radioaktiv markierte Tiger aufzuspüren, spielt die Tatsache, dass ein Tiger ein Tier ist und Streifen aufweist, keine Rolle und wird in der Software nicht berücksichtigt. Aber wenn Sie an einen Tiger in der Zusammenfassung und in Begriffen von ist-ein und hat-ein denken, ist das, was Sie bekommen.
Michael Shaw
1
Aber deshalb schlage ich diese Art von Übung vor, weil sich schnell herausstellen sollte, dass Tiger und Streifen für eine gute Lösung irrelevant sind, während Dinge wie die Frage, ob eine verfolgte Koordinate von GPS, Inertialnagivation oder Funk-Triangulation stammt, möglicherweise eine Rolle spielen Seien Sie die Art von Dingen, die ein Tracker-OOP-Design erfassen sollte. Wenn ich sage "Schau dir ein System der realen Welt an", dann meine ich einen Blick über die rein physikalischen Eigenschaften hinaus. Beispielsweise müsste die Supermarktsimulation sicherlich abstraktere Konzepte wie "Warteschlangen" enthalten, nicht nur die offensichtlichen "Karren" und "Käufer".
9.
1

Was ich aus meiner C-Zeit (weit zurück in der Vergangenheit) erinnere, war, dass wir Funktionen und Prozeduren in Abhängigkeit von ihrer Verantwortung in verschiedene Dateien aufgeteilt haben. Ich behaupte nicht, dass das perfekt ist oder so, aber es war ein guter Ausgangspunkt, als ich anfing, in objektorientierten Sprachen zu programmieren. Vielleicht können Sie mit dem Konvertieren von Dateien in Objekte beginnen.

In Bezug auf OOP dreht sich wirklich alles um Übung und das Streben nach Verbesserung. Selten bekommt es jemand von Grund auf richtig. Daher finden während des gesamten Projektlebenszyklus Iterationen statt.

Vladimir Kocjancic
quelle
0

Fügen wir eine Terminologie, objektorientierte Analyse und objektorientiertes Design hinzu , wie es Peter Coad in den neunziger Jahren getan hat.

Zusammen bilden diese eine Software-Engineering-Disziplin OOAD , die den Programmierer beim Schreiben und Testen von Code unterstützen kann. Die objektorientierte Programmierung kann dann die richtige Granularität aufweisen und die Programmiersprachenfunktionen geschickt einsetzen, um die auf Projektebene festgelegten funktionalen Ziele und Entwurfsanforderungen zu erfüllen.

Manchmal handelt es sich um ein Ein-Personen-Projekt, und dann müssen Sie alle Hüte tragen (aber nicht unbedingt alle gleichzeitig). Ich bin ein großer Fan von testgetriebener Entwicklung für meine eigenen persönlichen Projekte (siehe Franks Empfehlung), aber es geht nicht nur um objektorientierte Softwareentwicklung.

In einem Teamprojekt ist eine gute Aufgabenteilung ein Schlüssel für eine erfolgreiche Umsetzung. Die geschickte Verwendung objektorientierter Entwurfsmuster erleichtert das Teamverständnis, indem die für Analysen, Datenfeeds und Geschäftslogik erforderlichen sichtbaren Schnittstellen begrenzt werden, um ein verwendbares Framework gemeinsam zu nutzen.

Hardmath
quelle
0

"Nun, um nur zu üben, lassen Sie mich eine Anwendung mit einem Administrationsbereich erstellen, in dem Benutzer Produkte hinzufügen können." Das war ziemlich einfach, es war eine Frage des Algorithmus, um einen Benutzer zu registrieren, den Benutzer anzumelden und die Produkte hinzuzufügen.

Warum nicht dasselbe nur diesmal mit Benutzerobjekten und Produktobjekten? Wenn Sie eine Sprache verwenden, die sowohl prozedurale als auch OO unterstützt, können Sie versuchen, Objekte basierend auf der prozeduralen Standardbibliothek wie ein Dateiobjekt zu implementieren.

Steinmetalle
quelle