Laden...

Wie schaffe ich es OOP zu begreifen und zu lernen?

Erstellt von PierreDole vor 4 Jahren Letzter Beitrag vor 4 Jahren 3.139 Views
P
PierreDole Themenstarter:in
74 Beiträge seit 2017
vor 4 Jahren
Wie schaffe ich es OOP zu begreifen und zu lernen?

Moin,
ich bin auf der Suche nach guter Lektüre zum Thema Code-Gestaltung. Ich sags mal direkt: ich hasse meinen Code. Ich habe die prozedurale Programmierung gelernt (angefangen in den 90ern und Mitte der 2000er aufgehört) und tue mir heute mit der OOP schwer. Ich komme irgendwie nicht aus der Denkweise / den Mustern der damals erlernten prozeduralen Programmierung heraus. Ich neige dazu alles in einer langen Klasse zu schreiben, und wenn ich eine zweite erstelle, dann wird die genauso lang. 80% der Zeit bin ich am Überlegen, wie ich den Code besser gestalten kann, anstatt zu programmieren. Wie verschachtele ich die Klassen? Wie spreche ich sie an? Von außen! Nein, lieber eine Methode in der Klasse, die mir das fertige Ergebnis der Klasse liefert..... ist zum Verzweifeln

Ich habe schon viele Anläufe hinter mir OOP zu verinnerlichen, komme aber nicht über diese eine Schwelle. Zum einen sind Tutorials sehr demotivierend, da sie immer mit dem Basics anfangen (Was sind Klassen? Was ist Vererbung? usw.) und ich das schon alles kenne (habe allen Ernstes mal ein Java Zertifikat gemacht). Zum anderen finde ich nichts, was mir eben diese eine Frage verständlich beantwortet.
Ich habe mein Projekt ruhen lassen und einige Artikel zum Thema Software Architecture gelesen, die zwar interessant waren, aber auch nur Allgemeinplätzchen gewesen sind.

Und ganz ehrlich, ich weiß nicht mal wonach ich suche. Suche ich nach Software Architecture, nach Design Pattern, Clean Code, oder was ganz anderen?

Ich hoffe, jemand kennt paar Antworten.

C
2.121 Beiträge seit 2010
vor 4 Jahren

Du suchst Beispiele für OOP.

Was willst du mit Patterns und sonstigen Architektur Tipps, wenn du nicht weißt warum und wie du das ganze Konzept überhaupt machen sollst.

Als nächstes brauchst du ein Projekt in dem sich OOP wirklich lohnt. Wenn du mit aller Kraft versuchst in einem Miniprogramm alle OOP Dinge umzusetzen die du kennst, wird das auf dich völlg unsinnig wirken.
Das ist das Problem vieler Beispiele. Da wird eine Basisklasse erstellt und erweitert, ohne dass irgendein tieferer Sinn dahinter steckt. Dass da niemand ruft "aha dazu brauche ich das also" ist kein Wunder. Viel eher ist zu erwarten "wo ist jetzt der Mehrwert in diesem Beispiel?".

Am besten wäre es zu wissen was dein aktuelles Projekt macht. Da wäre ein Aha-Effekt vielleicht am schnellsten zu erreichen.

16.807 Beiträge seit 2008
vor 4 Jahren

Du wirst weder ein Buch noch ein Tutorial finden, das genau auf Deinem Wissensstand aufbaut.
Lektüren und Videos setzen sich eine Zielgruppe; und das sind i.d.R. bei OOP einfach die Beginner.
Daher natürlich auch: Was ist eine Klasse?

Letzten Endes ist Software Architektur vor allem eines: Erfahrung.
Du kannst Dir soviel Basics wie Du willst reinziehen - und das solltest Du auch tun - ohne Erfahrung wirst Du die Theorie leider nicht anwenden können.
Merkt man auch immer wieder auf entsprechenden Konferenzen / Vorträgen, wenn ein Sprecher nur theorietisches und kein praktisches Wissen hat.
Und ohne Anwendung wirst Du niemals ein guter Architekt, egal ob Infrastruktur Architekt, Software Architekt oder gleich Solution Architekt.

Bücher, die ich generell empfehle:* Design Patterns. Elements of Reusable Object-Oriented Software.

Letzten Endes bleibt es aber immer: Verständnissache.
Dir wird all das Zeug nichts bringen, wenn Du die Konzepte nicht verstehst; dann kannst auch einfach Code aus Beispielen kopieren.

An Deiner Stelle würde ich auch nicht so arrogant (bewusst das Wort gewählt) an ein Buch gehen und sagen: das demotiviert mich, weil ich "es schon kenne" - ich lese ab und zu bewusst Einsteigerlektüren und denk mir: wtf, wieso wusste ich das nicht?

P
PierreDole Themenstarter:in
74 Beiträge seit 2017
vor 4 Jahren

Ja, genau, das erlebe ich sehr oft. Ich sehe Beispiele, die vereinfacht einen Aufbau darstellen und ich mich dann nur frage: wie wende ich das jetzt auf meinen Code an?

Ich habe ein Hud für iRacing erstellt, welcher einige Telemetriedaten anzeigt. Geschwindigkeit, RPMs, Fuel level, Laps, usw. Das Ding berechnet auch die Schaltpunkte und hat einen Spotter (Anzeige, die mir Bescheid gibt wenn ein Auto neben mir fährt, damit ich ihn nicht überm Haufen fahre).
Das ist tatsächlich ein sehr kleines Projekt, da ich alle Daten von einem Wrapper bekomme und sie quasi nur formatiert anzeigen lassen muss. Paar Berechnungen und "Spielereien" sind noch drin und das wars dann auch. Eigentlich wollte ich noch viel mehr reintun, aber dann habe ich die Lust dran verloren, eben wegen dem Code.
Sicherlich könnte man hier vieles in andere Klassen auslagern, mit fehlen aber halt die Ideen und Ansätze wie ich das machen könnte. Ich meine, ich könnte es machen, aber das bringt mich nicht weiter, da ich mich dann frage, ob es in der Form richtig ist oder ich totalen Unsinn fabriziert habe.

Es war nicht arrogant gemeint, vielleicht habe ich mich unglücklich ausgedrückt. Ich habe bei meinen Versuchen über die besagte Sehwelle zu kommen, einige solcher Tutorials angefangen zu lesen. Es kam nur Frust auf.
Ich bin am Programmieren und merke ich komme so nicht weiter, bzw, das ist nicht gut, wie ich es mache und versuche dann Informationen zu finden, die mir weiterhelfen. Wenn ich dann seitenweise lese, was nicht einmal annähend in die Richtung geht, wo sich mein Problem befindet, und ich schon erahne, daß die nächsten zig Seiten auch nicht in diese Richtung gehen werden, dann wird es mit der Zeit für mich demotivierend. Da denk ich mir auch nur: nee, das ist nicht das, was ich suche. Und stelle mir vor, daß es irgendwo im Netz einen Artikel geben muss, der sich genau mit diesem Problem auseinandersetzt. Ich meine, ich bin bestimmt nicht der einzige damit.

16.807 Beiträge seit 2008
vor 4 Jahren

Ja, genau, das erlebe ich sehr oft. Ich sehe Beispiele, die vereinfacht einen Aufbau darstellen und ich mich dann nur frage: wie wende ich das jetzt auf meinen Code an?

Du musst aber auch von der Erwartung wegkommen, dass Du Code einfach übernehmen kannst.
Deswegen heisst der Beruf auch "Entwickler" oder je nachdem auch Ingenieur, weil man selbst überlegen, adaptieren und umsetzen muss.
Ansonsten wäre unser Job sinnfrei.

Sicherlich könnte man hier vieles in andere Klassen auslagern, mit fehlen aber halt die Ideen und Ansätze wie ich das machen könnte.

Basierend auf der Aussage deutet aber vieles darauf hin, dass Du den Sinn von Klassen eben nicht verstanden hast.

aber das bringt mich nicht weiter, da ich mich dann frage, ob es in der Form richtig ist oder ich totalen Unsinn fabriziert habe.

Aus Fehlern lernt man.

Ich habe bei meinen Versuchen über die besagte Sehwelle zu kommen, einige solcher Tutorials angefangen zu lesen. Es kam nur Frust auf.

Was meinst Du wie mir es geht, wenn ich was neues lerne, zB. eine neue Sprache.
Ich muss dann auch vor Frust eine Pause machen - und dann nochmal ansetzen.

Aber den eigenen Antrieb können wir Dir halt auch nur schlecht beibringen.

Wenn ich dann seitenweise lese, was nicht einmal annähend in die Richtung geht, wo sich mein Problem befindet, und ich schon erahne, daß die nächsten zig Seiten auch nicht in diese Richtung gehen werden, dann wird es mit der Zeit für mich demotivierend.

Würde jetzt mal in Raum werfen, dass das auch unmöglich ist.
Du wirst selten einen Treffer finden, der Dein aktuelles Problem löst - das sieht man hier im Forum auch oft.

Oft ist das im Endeffekt ein Folgefehler eines völlig falschen Ansatzes, weil man Konzepte nicht verstanden hat.
Und da helfen dann durchaus grundlegende Artikel, die eben Dein spezifisches Problem nicht lösen - aber Dein generelles.

5.657 Beiträge seit 2006
vor 4 Jahren

Für die erste grobe Übersicht bezüglich der Strukturierung ist evtl. dieser Artikel hilfreich:
[Artikel] Drei-Schichten-Architektur

Wenn du den Code schreibst, solltest du auch gleich Unit-Tests mit anlegen. Das hilft, weil du dadurch gezwungen bist, deinen Code richtig zu strukturieren, damit er überhaupt ohne größeren Aufwand testbar ist.
[Artikel] Unit-Tests: Einführung in das Unit-Testing mit VisualStudio

Ansonsten, wie meine Vorredner sagen: Erfahrung. Man lernt immer aus den Fehlern des vorherigen Projektes, um dann neue Fehler im nächsten Projekt zu machen.

Und ich finde es auch wichtig, ein Projekt zu planen, bevor man anfängt zu programmieren. Man kann sich vorher überlegen, was schief gehen könnte, und dann eine Lösung dafür finden, bevor man tausende Zeilen Code geschrieben hat.

Trotzdem muß man hin und wieder bereits geschriebenen Code wegschmeißen und neu schreiben. Da hilft es, wenn er gut strukturiert ist, und man nur das neu schreiben muß, was nicht funktioniert, und nicht gleich den gesamten Code.

Weeks of programming can save you hours of planning

C
1.214 Beiträge seit 2006
vor 4 Jahren

Ich möchte mal zwei Punkte aus eigener Erfahrung anbringen.

  1. Was mich hier seinerzeit weitergebracht hatte, waren tatsächlich Designpatterns. Ich hatte Delphi programmiert, OOP "verstanden", aber den Nutzen nicht erkannt, deswegen zu 90% prozedural programmiert. Erst als ich das Design Patterns Buch von der GoF gelesen habe, habe ich mir öfter gedacht, cool, so hätte ich das auch machen können. Und dann hätte das auch plötzlich Sinn ergeben, von vornherein Klassen zu haben, und nicht Listen von Structs.
  2. Du schreibst, dass das was du findest, sich nicht direkt auf dein Problem anwenden lässt. Das ist zwar sehr oft richtig, und du musst vor allem lernen zu abstrahieren. Aber auch hier habe ich die Erfahrung gemacht, dass man für erstaunlich viele Probleme tatsächlich fertige Lösungen findet, evtl. muss man dafür nur umdenken und seinen Code umstrukturieren. Nur als Beispiel, ich hatte an etwas gebastelt, bei dem ich Undo/Redo haben wollte und hätt nie gedacht, dass ich dafür etwas finde, ist doch etwas sehr spezielles, wie das bei mir aufgebaut ist (Google war damals noch fast ein Geheimtipp, so leicht ist man nicht an Informationen gekommen). Ich war dann recht erstaunt, dass es dafür ganz einfache Patterns gibt, die auch bei mir problemlos funktioniert hätten.
C
2.121 Beiträge seit 2010
vor 4 Jahren

Eigentlich wollte ich noch viel mehr reintun, aber dann habe ich die Lust dran verloren, eben wegen dem Code.

Da wäre interessant was für ein Code das ist, was du an ihm warum ändern willst.

Wenn du 10 Datenfelder zum Thema Geschwindigkeit und Drehmoment usw hast, und 8 Datenfelder zu Temperatur, dann noch einiges zur Position anderer Fahrzeuge etc, dann könntest du diese Felder in separate einzelne Klassen packen. Das kann hilfreich sein, wenn du dadurch mehr Übersicht bekommst. Code der die Daten umrechnet wie deine genannten Berechnungen und Spielereien kommt dann in die Klasse zu den Daten die er bearbeitet.

Kann aber auch völlig nutzlos sein.
Du schreibst es geht nur um die Anzeige verschiedener Datenfelder.
Wenn du dir jetzt denkst, ich übernehme ein Datenfeld einmal vom Wrapper und dann lese ich es an einer anderen Stelle einmal wieder aus, mehr passiert da nicht, also wozu soll ich das in verschiedene Codeteile aufsplitten... dann kann das durchaus auch ein Argument sein.
Schön brav - und sinnlos, grundlos - alles umzusetzen was man hört, ist nicht ratsam. Dann hast du am Ende zig Codedateien und Klassen mit nur wenig Inhalt, nutzt Interfaces "wegen der Erweiterbarkeit" weil du das mal wo gelesen hast - ohne Plan was bei dir überhaupt erweiterbar sein könnte usw.

Wenn ich dann seitenweise lese, was nicht einmal annähend in die Richtung geht, wo sich mein Problem befindet

Wo befindet es sich denn?
Ich habe das Gefühl du willst gerade irgendetwas anders machen, hast aber keine Idee wie anders und nicht mal warum es überhaupt anders gemacht werden soll. Und nachdem von uns anderen niemand weiß was du bisher machst, stoßen wir mit Tips natürlich spätestens jetzt an eine Grenze.
Kannst du ein Beispiel zeigen wie es jetzt ist, sowie was dir daran nicht gefällt?

1.029 Beiträge seit 2010
vor 4 Jahren

Hi,

kann mich zwar sicher nicht als Profi bezeichnen - auf der anderen Seite:
Wenn dir dein eigener Code nicht gefällt ist das wichtigste Grundkriterium doch erfüllt.

Ich mach das häufig, dass ich Projekte die ich vor längerer Zeit erstellt hatte öffne. In vielen Fällen kann ich die Dinger nicht mehr zumachen ohne zu korrigieren was mir nun schon peinlich ist. (Und in vielen Fällen zieht das auch einen Neustart des Projekts nach sich...)

Kann dir nur empfehlen dir immer wieder Artikel über DesignPattern anzuschauen - schau dir auch andere Projekte auf GitHub an - arbeite dich in die Klassenstrukturen anderer rein und versuche tiefgreifende Funktionen zu verstehen und ggf. abzuändern - gerade in komplexeren Systemen.

LG

M
368 Beiträge seit 2006
vor 4 Jahren

OOP ist ein Ansatz die Erfahrungen/ Beobachtungen/... der menschlichen analogen Welt auf die Welt des Rechners (Strom fliesst oder fliesst nicht) zu übertragen. WIE man die Software zusammenstellt / modelliert oder die Sinnhaftigkeit derselben ist dem Rechner (im Ggs. zum Menschen) dabei egal. Aber siehe noch den einen Beitrag von java-forum.org .

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

5.941 Beiträge seit 2005
vor 4 Jahren

Hallo PierreDole

Du kannst als Praxisübung auch ein kleines Projekt durchführen. Für mich war früher ein Snake sehr geeignet. Einmal so wie gewohnt, prozedural. Und dann versucht per OOP umzusetzen.

Das geht gut, weil du die einzelnen Teile in Klassen modelieren kannst. Ich fand das eine gute Übung.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

F
10.010 Beiträge seit 2004
vor 4 Jahren

Wau Peter, Dich gibt es noch 😉

P
1 Beiträge seit 2020
vor 4 Jahren

Hi PierreDole,

ich kann deine Beschreibung sehr gut nachvollziehen, da es mir sehr ähnlich ging respektive ich eine sehr ähnliche Historie hatte.

Ich würde dir die beiden folgenden Video-Kurse empfehlen wollen:

C# OOP Fundamentals

C# Intermediate: Classes, Interfaces and OOP

Wenn du die motiviert anschaust, würde ich einen Durchbruch deinerseits fast garantieren...

Cheers

Edit: Und natürlich, wie bereits oben empfohlen, simultan ein Projekt zur Anwendung der neuen Kenntnisse durchführen