OOP Wie benutze ich die Main Funktion richtig?

Baboon

Mitglied
Hallo,

ich sehe häufig Programme wie folgt strukturiert sind, dass es eine "Hauptklasse" gibt in der alle anderen Klasse initialisiert werden. Die Main-Funktion befindet sich dann in der Datei mit der "Hauptklasse" und initialisiert diese Klasse.

Zum beispiel habe ich Snake programmiert. Da habe ich eine Klasse die heißt bei mir einfach "Snake". Dazu noch eine die heißt Hero und Point. Hero ist die Schlange und Point ist dieser Punkt den man fressen muss.

Die main funktion macht einfach:
Java:
public static void main(String[] args){
       new Snake();
}

Der Snake konstruktor macht dann das:
Java:
public Snake(){
        Hero hero = new Hero(param);
        Point point = new Point(param);
        ...
}

So, meine Frage ist. Ist das sinnvoll? Mein Professor hat kurz mal gesagt, das sowas nicht gut ist.
Warum und wie es richtig ist hat er nicht gesagt. Ich hoffe es ist deutlich geworden was ich meine.

LG und danke schonmal
 
Zuletzt bearbeitet von einem Moderator:

VfL_Freak

Top Contributor
Moin,

nun ja, was willst Du denn mit den beiden neuen Objekten machen ??

Einige Hinweise:
  1. So erzeugst Du zwei lokale Objekte, die außerhalb von Snake nicht gültig sind!
  2. alle Aktionen nur innerhalb des Konstruktors auszuführen, würde jeglichem OOP-Gedanken widersprechen!
  3. Dein Parameter 'param' fällt hier ziemlich vom Himmel ..... ;)
Hier noch ein paar nette Links zur main-Methode:
http://www.cs.princeton.edu/courses/archive/spr96/cs333/java/tutorial/java/anatomy/main.html
http://javabeginners.de/Grundlagen/main.php
http://spinfo.phil-fak.uni-koeln.de/spinfo-java-mainmethode.html?&L=0

Gruß Klaus
 
K

kneitzel

Gast
Also das geht schon etwas in die richtige Richtung, nur eben sollte ein Konstruktor eben nur ein Objekt erzeugen und keine weiteren Aktionen durchführen. Also Code immer dahin, wohin er gehört.

Wenn Du ein Auto herstellst, dann fährt das nicht nach München um dort etwas abzuholen.

Also wäre eher etwas wie folgt sinnvoll:
Code:
public static void main (String[] args) {
  SnakeGame game = new SnakeGame();
  game.run();
}
Halt so in der Art. Der Konstruktor erzeugt nur ein Objekt und dann wird irgendwas aufgerufen.

Oft gibt es auch mehrere Stati. Ein Spiel könnte also erstellt werden, initialisiert werden, dann ablaufen und dann in einem Ende Status sein. So gesehen gibt es dann evtl. unterschiedliche Funktionen:
- Konstruktor, der aufgerufen wird, wenn das Spiel erstellt wird. Da wird aber dann noch kein Spielbrett generiert.
- init() - da wird dann z.B. das Spielbrett generiert. Hat den Vorteil, dass man ein Spiel ggf. neu initialisieren kann.
- Dann läuft das Spiel. Da sind dann Funktionen denkbar, die vor einem Zug und nach einem Zug ausgeführt werden und der Zug selbst.
- Und dann eine Funktion, die das Ende beschreibt.

Das ist aber nur ein einfaches Beispiel, das ich mal grob skizziert habe. Oft hat man bei Applikationen zentrale Objekte. Ein Client hat ein Hauptfenster oder ein Server hat eine zentrale Verwaltung, die dann z.B. die Netzverbindungen verwaltet, die Business Objekte und all sowas....
 

Sin137

Mitglied
Ergänzung -> .... die außerhalb des Konstruktors von Snake nicht gültig sind!



Würde er sein erzeugtes Snake Objekt auch noch in einer Variablen hinterlegen, könnte er über dieses Objekt außerhalb des Konstruktors auf die zwei zugreifen!
ggf. er deklariert die zwei Variablen nicht in der Methode, sondern hinterlegt diese in der Klasse.
 

Baboon

Mitglied
Ich hab hier mal versucht den Aufbau des Programms ein bisschen anzureißen und meinen Konstruktor ausführlicher dargestellt.

Ist komischer Pseudocode gemischt in einem noch komischeren UML diagramm, aber ich habs echt versucht:confused:
Der original Quellcode ist hier: https://github.com/Baboon9/Snake

Wenn ich mir das so ansehe, dann weiß ich eigentlich garnicht warum ich nicht einfach alles static mache..
Es gibt dort einfach nur 2/3 Klassen die nicht static sein können
 

Anhänge

  • konstruktor.png
    konstruktor.png
    27,9 KB · Aufrufe: 30

JStein52

Top Contributor
Dein Konstruktor von Snake sieht ja schon ein bisschen anders aus als oben gepostet. Aber trotzdem spielt sich scheinbar das ganze Spiel im Konstruktor ab ?? Ich würde da mal auf @kneitzel verweisen und nur die Initialisierungen da drin vornehmen und für den Rest eine run-Methode machen.
 
K

kneitzel

Gast
Also bezüglich Objektorientiertem Design: Erstell richtige Objekte und benenne die Klassen entsprechend. Snake ist ja keine Schlange - das ist ja ein ganzen Spiel oder so.
Und dann wirklich Code immer dahin, wo er hin gehört. Konstruktor erstellt nur das Objekt und initialisiert einen Zustand. Es werden keine Aktionen durchgeführt.

Und dann implementierst Du das Objekt selbst. Was gehört alles dazu? Ein Auto hat Räder, einen Motor, einen Tacho, eine Richtung und Geschwindigkeit, ... Und was für Sachen kann das Auto machen? Beschleunigen, Lenken, Bremsen, Geschwindigkeit kann man abfragen, ....
Das wird dann alles implementiert. Ich kenne Dein Spiel nicht, aber es gibt ja so Snake Spiele, wo eine Schlange über den Bildschirm wandert und dabei Dinge frisst und dabei immer länger wird. dann hat so eine Schlange eine Richtung, eine Lokation des Kopfes, belegte Felder (Körper), ... Die Schlange kann abbiegen nach rechts oder links.

Evtl. kannst du ja auch ähnlich an Deine Applikation heran gehen.
 

Baboon

Mitglied
@JStein52 Ja, ich wollte eigentlich garnicht mit dem kompletten Programm anfangen, deswegen habe ich Sachen gekürzt die ich für unwichtig hielt. Aber dann war wohl noch nicht klar was ich eigentlich mit den Klassen machen will und woher der parameter kam. Gut, das der Konstruktor nur die Initialisierung erledigen sollte sehe ich ein.

Das Programm spielt sich nicht nur im Konstruktor ab. Es gibt auch noch andere Funktionen in der Klasse. Es ist einfach Systemarchitektonischer Müll den ich da mal gemacht habe. Das wollte ich jetzt mal aufräumen.

Die Klasse Snake kümmert sich eigentlich nur wirklich um das Fenster. Alles andere hätte entweder static sein sollen oder in der Main initialisiert. Wie ich das im moment sehe. Eine "Game" oder "Snake Game" klasse wäre wohl womöglich auch überflüssig. Diese Endlosschleife im Konstruktor der bisherigen Version muss allerdings auf jeden fall da sein und am besten in der genannten run funktion stehen. Wichtig ist, dass das Spiel neu initialisiert werden kann, wenn es zuende ist. Dafür sollte es eine init Funktion auch geben. Komme wohl um diese Game klasse nicht drum rum.

@kneitzel Ja, es ist einfach das klassiche Snake Spiel gemeint, wo ein Quadrat gesteuert werden kann. Das quadrat kann mit Punkten kollidieren. Kollidiert die Schlange mit einem Punkt wird sie länger. Nach einer Zeitspanne wird das letzte Element der Schlange weg genommen und an erster Stelle der Schlange gesetzt wobei die Position des umgesetzten Elements abhängig von der Richtung die der Benutzer eingibt ist. Wenn die Schlange mit einem Element ihrer selbst kollidiert ist das Spiel vorbei. Kollidiert sie mit einem Punkt wird an einer freien Stelle ein neuer gesetzt.

Der Anwendungsfall könnte so aussehen:

Das Programm wird gestartet
Ein Fenster wird erstellt
Die Schlange wird auf dem Fenster plaziert
Ein Punkt wird auf dem Fenster plaziert
Warten auf Benutzereingabe
Die Bewegungsrichtung der Schlange wird geändert
Der Timer läuft aus
Die Das letzte Element der Schlange wird an die erste Stelle verschoben
Das letzte element der Schlange wird neu positioniert
Die Schlange kollidiert mit einem Punkt
-Die länge der Schlange erhöht sich um 1
-Auf richtigen Zeitpunkt warten um neues Element anzufügen
-Punkt neu platzieren
Die Schlange kollidiert mit sich selbst
-Auf Nutzereingabe warten
-- Spiel neu initialisieren
-- Fenster schließen

Daraus würde ich Die Klassen Fenster, Schlange, Punkt, Kollisionsdetektion, Timer, Benutzereingabe herleiten.


Ist ja schön und gut. Aber alle genannten Klassen könnten auch genauso gut static sein. Aber dann heißt es wieder "Das hat nichts mit Objektorientierung zu tun", "das ist zu viel Sichtbarkeit, das macht Fehler". Naja... ich werde auf jedenfall die Snake Klasse anpassen und mehr in die Main auslagern und in Game und Window Klassen teilen.

Danke an alle!
 

mrBrown

Super-Moderator
Mitarbeiter
Ist ja schön und gut. Aber alle genannten Klassen könnten auch genauso gut static sein. Aber dann heißt es wieder "Das hat nichts mit Objektorientierung zu tun", "das ist zu viel Sichtbarkeit, das macht Fehler". Naja... ich werde auf jedenfall die Snake Klasse anpassen und mehr in die Main auslagern und in Game und Window Klassen teilen.
Anstatt nach gründen zu suchen, warum es nicht static sein sollte, such lieber nach Gründen, warum man es static machen sollte.

Das mag man zu Anfang manchmal als Einschränkung sehen, man verliert damit meistens aber mehr, als man gewinnt. Grad sowas wie Snake ist perfekt für OO, und vor allem im Hinblick auf größere Projekte die irgendwann kommen ist es sinnvoll, sich direkt vernünftig OO und MVC anzueignen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Zwei verschiedene Intellij Projekte, wie benutze ich wechselseitig objekte Java Basics - Anfänger-Themen 8
K Wie benutze ich richtig "this"? Java Basics - Anfänger-Themen 14
D Was ist cronjob und wie benutze ich es? Java Basics - Anfänger-Themen 3
N Mehrfach von Klassen benutze Methode in Interface auslagern? Java Basics - Anfänger-Themen 3
F Wie benutze ich mein java programm ohne editor? Java Basics - Anfänger-Themen 2
B Wie benutze ich den -Xlint- Befehl für "deprecated API& Java Basics - Anfänger-Themen 7
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
N Throw an Main Methode übergeben Java Basics - Anfänger-Themen 7
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
I Jetty starten von Programm (Main) Java Basics - Anfänger-Themen 27
Denix The public type Main must be defined in its own fileJava(16777541) Java Basics - Anfänger-Themen 13
D Array in Main Methode aus anderer Klasse aufrufen Java Basics - Anfänger-Themen 3
G jButton führt Main Methode nicht richtig aus Java Basics - Anfänger-Themen 3
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
C60 Methoden Main-Methode erkennt meine Arrays nicht. Java Basics - Anfänger-Themen 7
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
W Verschiedene Methoden in einer Klasse in der Main aufrufen? Java Basics - Anfänger-Themen 8
S Array über ein Ausgabemethode in main ausgeben Java Basics - Anfänger-Themen 31
C Kein Zugriff auf Klassenmethoden in Main Methode Java Basics - Anfänger-Themen 23
N Wozu nutzt man in der Main Methode das args Array? Java Basics - Anfänger-Themen 10
NaZuRe Geld(Wert) von der public static void main in die public static void Blackjack Java Basics - Anfänger-Themen 2
H Warum kann man keine Parameter in die main-Methode packen? Java Basics - Anfänger-Themen 4
J In main() Datei geöffnet, von anderer Funktion beschreiben Java Basics - Anfänger-Themen 3
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
KogoroMori21 Methode in der main ausgeben Java Basics - Anfänger-Themen 2
s_1895 zu viele Zeilen in der Main Methode Java Basics - Anfänger-Themen 4
C Methodenrückgabe wird in der main nicht berücksichtigt Java Basics - Anfänger-Themen 2
B Wie kann ich etwas vor der Main-Methode ausführen? Java Basics - Anfänger-Themen 21
K Übergabe des Wertes einer Variable aus main() in eine Klassenmethode Java Basics - Anfänger-Themen 8
K Übergabe von Werten (zweidimensionales Array) aus einer Methode an zweidimensionales Array in main() Java Basics - Anfänger-Themen 3
T Main startet nicht bei vorgegebenen Code Java Basics - Anfänger-Themen 41
G main Methode Java Basics - Anfänger-Themen 5
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
1 main-Methode erweitern, Nachfrage nach wiedeholung Java Basics - Anfänger-Themen 2
J main methode Java Basics - Anfänger-Themen 1
B No Main Classes Found Java Basics - Anfänger-Themen 7
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
E Was kommt in ein Objekt und was in die Main Methode? Java Basics - Anfänger-Themen 8
D java main methode kann nicht kompiliert werden (Erstellen eines Objekts) Java Basics - Anfänger-Themen 6
M String außerhalb der main-Methode Java Basics - Anfänger-Themen 4
scratchy1 ArrayOutOfBoundException in main-Methode Java Basics - Anfänger-Themen 17
B File öffnen in src/main/webapp Java Basics - Anfänger-Themen 4
P Parameterübergabe, von Methode zu Methode zu main Java Basics - Anfänger-Themen 4
J Kapselung Array in Set ändern und in Main ausgeben lassen Java Basics - Anfänger-Themen 4
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
V Collections Objekte einer ArrayList in der main() ausgeben Java Basics - Anfänger-Themen 9
D Compiler-Fehler Aufrufen einer Methode von Main Java Basics - Anfänger-Themen 4
G Was als main Method Java Basics - Anfänger-Themen 6
M Methode mit Array als Parameter an Main übergeben Java Basics - Anfänger-Themen 1
W Exception in Main abfangen oder in der Methode? Java Basics - Anfänger-Themen 10
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
J Compiler-Fehler Java findet main Klasse nicht Java Basics - Anfänger-Themen 16
B Parameterübergabe in main Java Basics - Anfänger-Themen 1
A Variablen Main Klasse soll auf eine andere Klasse zugreifen Java Basics - Anfänger-Themen 3
I java.lang.ArrayIndexOutOfBoundsException at lösung.main Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J Frage zu: public static void main (String[]args) Java Basics - Anfänger-Themen 1
J Parameter in main verwenden Java Basics - Anfänger-Themen 3
M Methodenaufruf in der Main Datei funzt nicht Java Basics - Anfänger-Themen 13
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
G Instanzvariable in main-Methode verboten? Java Basics - Anfänger-Themen 3
M Objekt starten von der main-Methode Java Basics - Anfänger-Themen 1
S Fehler: Editor does not contain a main type Java Basics - Anfänger-Themen 3
G Programm wird nicht ausgeführt: Editor does not contain a main type Java Basics - Anfänger-Themen 10
A Methode aufrufen in main-Methode Java Basics - Anfänger-Themen 5
B Linux - Error: Could not find or load main class application.Main Java Basics - Anfänger-Themen 28
C Erste Schritte (Netbeans) no main classes found Java Basics - Anfänger-Themen 5
U Klassen IntelliJ14.1.1 Ultimate startet eine Main-Klasse NICHT MEHR Java Basics - Anfänger-Themen 0
P Methoden private int[] in main Java Basics - Anfänger-Themen 16
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
AssELAss Klassen Java Klasse in main-methode ausführen Java Basics - Anfänger-Themen 7
R Methoden Nicht statische Methode aus Main aufrufen Java Basics - Anfänger-Themen 2
P could not find main class obwohl da Java Basics - Anfänger-Themen 17
J Methode in main-Methode aufrufen Java Basics - Anfänger-Themen 5
M Klassen Main Methode in einer anderen Klasse aufrufen Java Basics - Anfänger-Themen 13
TheMenox Methoden Auslagerung von Code aus der "main" Methode sinnvoll? Java Basics - Anfänger-Themen 70
quecksilver if-Abfrage in main ausführen Java Basics - Anfänger-Themen 4
J Exception in thread "main" Java Basics - Anfänger-Themen 1
S Methode auf Main zugreifen Java Basics - Anfänger-Themen 5
D String aus Main in Klasse übergeben Java Basics - Anfänger-Themen 4
S Methoden main-Methode integrieren Java Basics - Anfänger-Themen 2
K Methoden Programm ohne Main Methode starten Java Basics - Anfänger-Themen 2
I Fehlermeldung: Java does not contain a main type Java Basics - Anfänger-Themen 1
B ja ja schon wieder einer mit einer public static void main(string[] args) Frage... Java Basics - Anfänger-Themen 8
F Erste Schritte (Gelöst) Anfängerfrage Arraylist ausserhalb der Main Methode Java Basics - Anfänger-Themen 2
N Variablen Variable in Main deklarieren und in anderer Methode nutzen Java Basics - Anfänger-Themen 12
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
R window-Klasse, main-loop und unausschaltbares anti-aliasing Java Basics - Anfänger-Themen 0
T Mehrere Methoden in der main-Methode verknüpfen und aufeinander anwenden Java Basics - Anfänger-Themen 2
P Compiler-Fehler Could not load or find main class fehler Java Basics - Anfänger-Themen 15
S Selection does not contain a main type! Java Basics - Anfänger-Themen 5
A Methoden Zugriff auf eingelesene Variablen in der main Methode (ohne Änderung der Parameterliste) Java Basics - Anfänger-Themen 4
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
P Compiler-Fehler could not find or load main class Java Basics - Anfänger-Themen 5
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
U Umschreiben ohne main methode ;-) Java Basics - Anfänger-Themen 8
A Fehlermeldung beim aufruf der main Methode Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben