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?
quelle
Antworten:
Nein, tust du nicht ...
Keines dieser Dinge ist notwendig, um objektorientiertes Programmieren zu üben.
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.
quelle
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.
quelle
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 ...
quelle
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.
quelle
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.
quelle
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.
quelle