OOP Schwierigkeiten bei Klassendiagrammen/OOP-Struktur

Bile Demon

Bekanntes Mitglied
Hallo Leute,

habe mich soeben in diesem Forum registriert und ich hoffe ich bin hier richtig. Ich würde gerne meine Erfahrungen mit anderen teilen und gleichzeitig noch vieles dazulernen.

Als kleinen Einstand habe ich auch sofort eine (wenig konkrete, aber dennoch ernstgemeinte) Frage an die erfahreneren Java-Programmierer.

Hintergrund ist, dass ich mit Java zwar täglich zu tun und bereits viel Erfahrung damit habe, aber selten komme ich dazu, ein (großes) Projekt wirklich von Anfang bis Ende aufzubauen. Meistens arbeite ich an fertigen Projekten und dann auch nur an kleinen Teilen davon.

Zur Zeit plagt mich ein grundsätzliches Problem beim Planen gut strukturierter Java-Software. Mein letztes Projekt (ein Spiel) hat zwar anfangs wunderbar geklappt, und hat auch Spaß gemacht, aber so nach und nach musste ich mir eingestehen, dass der Code aus OOP-Sicht absoluter Murks war. Viele Klassen mussten Aufgaben bewältigen, für die sie eigentlich nicht zuständig sein sollten, weil die benötigten Variablen nur dort bekannt waren und ich keine intelligente Möglichkeit gesehen habe, die Objektreferenzen über mehrere Klassen hinweg "durchzuschleifen". So wurden Teile der Spiellogik in der Klasse GameWindow (extends JFrame) umgesetzt, Grafikoperationen mussten teilweise wieder in völlig anderen Klassen durchgeführt werden, weil die Klasse für Grafikoperationen die Klasse für Gegnerfiguren nicht kannte usw. Ist jetzt schwer zu erklären, weil ich auch keine Codebeispiele habe. Mein Problem war, dass ich keine Spaghetti-Aufrufhierarchie wollte, und ich wollte auch nicht ständig mit Objektreferenzen jonglieren.

Manchmal fange ich damit an, mir Klassendiagramme einfallen zu lassen, aber schon nach einigen Minuten lasse ich es wieder sein, weil ich schnell den Überblick verliere, welches Objekt eine Referenz auf welches andere Objekt braucht, um wichtige Dinge abfragen zu können, und ich dann sowieso irgendwann merke, dass das so nichts wird, weil ich wieder zuviele Querverweise aufgebaut und ständig this-Referenzen übergeben muss. Am Ende würde mein Klassendiagramm vielleicht wie ein gigantisches Spinnennetz aussehen, oder wie ein Plan der Londoner U-Bahn.

Irgendwann bin ich erlöst worden, als mir eingefallen ist, dass es ja noch statische Methoden und Variablen gibt, die ich überall verwenden kann, ohne mir Gedanken machen zu müssen, wem was bekannt ist. Inzwischen bin ich schon soweit, beinahe alles mit static zu versehen, damit jede Klasse alles weiß, und ich nicht wieder vor dem Problem stehe, eine Objektreferenz über 4 Klassen hinweg durchreichen zu müssen, weil ich am Anfang nicht daran gedacht habe.

Lange Geschichte, aber wahres Problem. Leider keine Codebeispiele um zu verdeutlichen was ich meine. Gibts Leute mit ähnlichen Schwierigkeiten? Bin ich OOP-unfähig? Gibts da Faustregeln, auf die man sich besinnen kann, wenn man keine Idee hat? Wer das Problem nicht verstehen kann und die Fragen dämlich findet, der muss mich jetzt nicht unbedingt flamen. Würde ich zu schätzen wissen :)

Vielen Dank
 
G

Gast2

Gast
Das ist völlig normal, da muss jeder mal durch ;)

Irgendwann bin ich erlöst worden, als mir eingefallen ist, dass es ja noch statische Methoden und Variablen gibt, die ich überall verwenden kann, ohne mir Gedanken machen zu müssen, wem was bekannt ist. Inzwischen bin ich schon soweit, beinahe alles mit static zu versehen, damit jede Klasse alles weiß, und ich nicht wieder vor dem Problem stehe, eine Objektreferenz über 4 Klassen hinweg durchreichen zu müssen, weil ich am Anfang nicht daran gedacht habe.
Das mag auf den ersten Blick vielleicht so ausschauen dass du dir damit Komplexität sparst und dir dein Programm "runder" vorkommt, aber es ist der falsche weg... :D

Für das "rumreichen" der Referenzen gibt dependency injection Frameworks, z.b. Goole Guice. Da kannst du dich ja mal einlesen, dann werden nen paar Sachen eventuell etwas klarer. Ansonsten lies dir Bücher zu dem Thema durch, da haben sich schon viele Leute kluge Gedanken drüber gemacht.
 

GUI-Programmer

Top Contributor
Mal ne Frage: Über welche Größe eines Projekts spreche wir hier? 3-10 Klassen? 10-30? 30-100? Oder gar noch mehr?
Und über wie viele Zeilen Code? <2000? 2000-10000? >10000?
 

Badmeister

Mitglied
Generell würde ich mit der Verwendung von statischen Variablen und Singelton-Strukturen eher sparsam umgehen. Die Referenzen in den Konstruktoren immer weiterzureichen ist natürlich auch nicht der richtige Weg.

Sollten viele deiner Klassen ähnliche Strukturen habe, dann loht es sich meist Interfaces in die Struktur einzubinden. Also eine gewisse Generalisierung vorzunehmen.
Ist dem nicht so, solltest du zumindest versuchen deinen Code sehr modular zu entwickeln. Das Bedeutet, das deine Klassenstruktur nachher eher einer "Baumstruktur" und nicht einem Graphen oder Netz gleicht, in der jede Klasse irgendwie jede "kennt".

Ein guter Ansatz, der mir oft geholfen hat bei komplexeren Programmen, war immer die folgende Überlegung: "Was benötigt ein Modul (Code bestehen aus mehreren Klassen, die eine gemeinsame Aufgabe haben) für Eingaben, und was sind die Ausgaben --> also die "Schnittstellen". Dies ermöglicht dir den Überblick zu behalten.

konkret bei Spielen ist das sehr gut Möglich:

Trennung von Engine und Spiel --> Schnittstellen (Interface wie Drawable oder Moveable..., abstract class GameObject...) für Kommunikation
Aufbau der Engine (Kern, Logic und Graphic unabhängig voneinander (FPS und UPS) - IO Steuerung, Netzwerk... muss alles unabhängig voneinander sein (Baumstruktur) --> nur so hast du während der Entwicklung überhaupt nur die Chance den Überblick zu behalten).

Ich hoffe ich konnte dir irgendwie weiterhelfen, oder zumindest eine Idee geben.

Mit freundlichen Grüßen,
Badmeister
 

Bile Demon

Bekanntes Mitglied
Hallo EikeB, hallo Badmeister,

vielen Dank für eure Antworten. Eure Anregungen und Tipps werd ich mir mal hinter die Ohren schreiben. Von Dependency Injection habe ich auch schon etwas gehört, aber nie verstanden, wofür man sowas einsetzt. Auch die Idee mit der Baumstruktur klingt gut, das muss ich mir mal in Ruhe überlegen.
Und selbst wenn alles nicht hinhaut, meine Programme tun ja schließlich genau das was sie sollen. Der Rest kommt hoffentlich mit der Zeit. Ich darf nur meinen Code niemandem zeigen :)

GUI-Programmer: Also privat komme ich selten über 20-25 Klassen hinaus. Für größere Projekte fehlt mir dann doch irgendwann die Geduld. Über die Anzahl Zeilen kann ich nichts Konkretes sagen. Wahrscheinlich auch allerhöchstens 10000.
 

Dune

Mitglied
Hallo Leute,

ich habe ähnliche Probleme, stehe sogar noch ein Stück weiter am Anfang als Bile Demon.

Die Hinweise mit Baumstruktur und Modul-denken werde ich auf jeden Fall berücksichtigen, jedoch ist man gerade privat ja oft an dem Punkt einer kleinen Idee die eigentlich erst mit nach 2-5 weiteren Klassen auch weiter reift.
Darum meine Frage... einfach drauflos hacken oder wie weit sollte ein Basis vorhanden sein?
Thema: Klassendiagramm
...um anschließend nicht 98% vom Code zu refaktorisieren.

Ich habe wenig Projekterfahrung und bin noch auf der Suche nach dem richtigen feeling.

wenn jetzt immernoch jemand schreibwütig ist, eine weitere Frage:
wie geht ihr an große Projekte( > 50 Klassen) ran um euch einzulesen (ausgenommen den Debugger :autsch:)
 

Ähnliche Java Themen

Neue Themen


Oben