Codedesign und andere Kritikpunkte

Status
Nicht offen für weitere Antworten.

Mostly_Harmless

Aktives Mitglied
Hallo,

ich bin noch relativ unerfahren in der OOP. Vor allem in Fragen Code-Design kenne ich mich noch nicht gut aus.

Daher poste ich euch hier mal den Quellcode meines vor Kurzem geschriebenen Minesweeper-Spiels, in der Hoffnung, dass der ein oder andere Zeit und Lust findet, sich ihn mal anzuschauen, und mir Verbesserungsvorschläge geben kann.
Insbesondere bei den beiden Klassen "Menu" und "GUI", die - wie zumindest der Name der zweiten Klasse vermuten lässt - für die grafische Ausgabe zuständig sind, bin ich mir unsicher was die Instanzvariablen angeht. Ob man also die einzelnen GUI-Elemente als Membervariablen speichert oder ob es da andere elegantere Möglichkeiten gibt.

Natürlich wäre ich auch über jede Kritik dankbar, die sich nicht aufs Design bezieht. :)

Also - was habe ich eurer Meinung nach alles besonders schlecht (oder auch besonders gut :) ) gelöst?

Hier der Link zum Code.

Btw, wie kann man hier Dateien an den Beitrag anhängen?
 
S

SlaterB

Gast
> Btw, wie kann man hier Dateien an den Beitrag anhängen?

ich glaub gar nicht

-------

ich habe mal ganz kurz reingeschaut und
a) keine großen Membervariablen-Wiederholungen a la
Jbutton button1
Jbutton button2
Jbutton button3
Jbutton button4
gesehen sowie
b) keine großen Code-Wiederholungen,

somit bist du schon weit über Durchschnitt von unsicheren Anfängern,
da kann der Rest eigentlich gar nicht mehr schlecht sein,

-----


was mir grob weniger gut auffiel:
Menu extends JFrame
GUI extends JFrame

hat dein Spiel zwei unterschiedliche Grafikfenster? (nicht ausprobiert)
wenns nur ein Fenster ist, dann sollte es nur eine JFrame-Klasse geben,
besonders komisch ist das bei deinem expliziten Hinweis,
dass nur die zweite Klasse GUI für Darstellung zuständig sein soll

-----

Code:
private void refreshButton( int h, int w ) {
		if ( this.mines.getMarked( h, w ) ) {
    		this.butArray[h][w].setBackground( Color.blue );
    	} else if ( ! this.mines.getVisible(h, w) ) {
        	this.butArray[h][w].setBackground( Color.darkGray );
        } else {
        	this.butArray[h][w].setBackground( this.getContentPane().getBackground() );
        	this.butArray[h][w].setEnabled( false );
            
            int val = this.mines.getValue( h, w );
            switch ( val ) {
                case 0:
                	this.butArray[h][w].setText( "" );
                    break;
                case Minefield.MINE:
                	this.butArray[h][w].setText( "M" );
                    break;
                default:
                	this.butArray[h][w].setText( "" + val );
                    break;
            }
        }

doch ein bisschen Wiederholung ;) :
definiere dir einmal am Anfang der Methode
JButton b = this.butArray[h][w];
dann kannst du im weiteren Verlauf immer b schreiben statt 7x 'this.butArray[h][w]'
 

Mostly_Harmless

Aktives Mitglied
SlaterB hat gesagt.:
ich habe mal ganz kurz reingeschaut und
a) keine großen Membervariablen-Wiederholungen a la
Jbutton button1
Jbutton button2
Jbutton button3
Jbutton button4
gesehen sowie
b) keine großen Code-Wiederholungen,

Bin zwar nicht unbedingt schreibfaul, aber das wäre dann trotzdem zu viel für mich bei einer Größe von 16x30 Feldern. :lol:

SlaterB hat gesagt.:
somit bist du schon weit über Durchschnitt von unsicheren Anfängern,
da kann der Rest eigentlich gar nicht mehr schlecht sein,

Keine voreiligen Schlüsse ziehen bitte. ;-)

SlaterB hat gesagt.:
was mir grob weniger gut auffiel:
Menu extends JFrame
GUI extends JFrame

hat dein Spiel zwei unterschiedliche Grafikfenster? (nicht ausprobiert)
wenns nur ein Fenster ist, dann sollte es nur eine JFrame-Klasse geben,
besonders komisch ist das bei deinem expliziten Hinweis,
dass nur die zweite Klasse GUI für Darstellung zuständig sein soll

Ja, sind zweit unterschiedliche Fenster, von denen aber immer nur eins geöffnet ist.
Menu (hier ist auch die main-Methode) zeigt ein kleines Fenster an, in dem man die Höhe, Breite und Anzahl der Minen eingeben kann. Klickt man dann auf "Start" wird das Fenster geschlossen und es öffnet sich ein Fenster der Klasse GUI, was dann das eigentliche Spielfeld anzeigt.

SlaterB hat gesagt.:
doch ein bisschen Wiederholung ;) :
definiere dir einmal am Anfang der Methode
JButton b = this.butArray[h][w];
dann kannst du im weiteren Verlauf immer b schreiben statt 7x 'this.butArray[h][w]'

Na das ist ja keine wirkliche Wiederholung in dem Sinne wie man sie vermeiden sollte denke ich. Ist halt nur weniger Schreibarbeit. ;-)
Aber ob ich jetzt 7x b schreibe oder einmal this.butArray[h][w] und das dann 6x kopiere... :lol:
 

Andreas29

Bekanntes Mitglied
Hi,

dabei geht es weniger um Schreibfaulheit (b sind weniger Buchstaben als die andere Lösung) sondern vielmehr um Sicherheit. Wenn du dein Array jetzt mal verändern willst musst du die Änderung in deiner Version an 7 Stellen macht. Wenn du dir eine Variable hälst, brauchst du nur eine Stelle ändern. 7 Änderungen, 7 Fehlermöglichkeiten gegen 1 Änderung 1 Fehlermöglichkeit. Je weniger Fehlermöglichkeiten, desto besser meiner bescheidenen Möglichkeit nach.

Grüße,
Andreas
 

Mostly_Harmless

Aktives Mitglied
Ok, danke, hab die Stelle jetzt entsprechend geändert.

Hat sonst noch wer mal in den Code reingeschaut und kann mir Tipps geben? :)

Edit: Achja, was ich noch fragen wollte: Wie kann man die Zahlen in den JButtons noch größer darstellen?
Wenn ich die Schriftgröße erhöhe, wird statt der jeweiligen Zahl nur "..." angezeigt, obwohl der JButton Platz genug hätte, um die Zahl zu zeigen. Hab noch keine Methode gefunden, mit der ich den Rand verkleinern kann, sodass der Text den gesamten JButton füllen darf.
 

Ark

Top Contributor
Ich mache es generell so, dass ich eine Main-Klasse anlege, die diverse Informationen über die Software bereithält (Name, Versionsnummer, Autor usw.), über die Verwendung per Konsole informiert und vor allem die main()-Methode enthält. Bei deinen Klassen hatte ich arge Schwierigkeiten, selbst bei Syntaxhervorhebung die main()-Methode ausfindig zu machen.

Ark

EDIT:
Code:
this.easy.setActionCommand( "easy" );

//blubb

if ( cmd.equals("easy") ) {
Stell dir nur einmal vor, du wolltest "easy" in "einfach" (oder irgendetwas anderes) ändern: du müsstest es an mehreren Stellen tun. Das ist nicht so ganz das Wahre. ;) Und noch weiter: Stell dir vor, du wolltest noch mehr Modi als "easy", "medium" usw. anbieten, vielleicht sogar so weit, dass man als Nutzer selbst "Spielbretter" speichern kann: Dann würde Code wie
Code:
            	if ( cmd.equals("easy") ) {
            		this.mode = new Mode( Mode.EASY );
            	} else if ( cmd.equals("medium") ) {
            		this.mode = new Mode( Mode.MEDIUM );
            	} else if ( cmd.equals("hard") ) {
            		this.mode = new Mode( Mode.HARD );
            	}
gegen unendlich streben. ;) Besser ist es, bei Auswahl eines Spielbretts nur die Parameter zu setzen, als hätte man sie selbst eingegeben (so wird das ja schon gemacht), aber dann, wenn das Spielfeld berechnet werden soll, wirklich nur diese Parameter (Breite, Höhe, Minenzahl) abzunehmen, ohne wieder auf diese verschiedenen Modi zurückzugreifen.

Ark
 

Zed

Bekanntes Mitglied
Mostly_Harmless hat gesagt.:
Ok, danke, hab die Stelle jetzt entsprechend geändert.

Hat sonst noch wer mal in den Code reingeschaut und kann mir Tipps geben? :)

Edit: Achja, was ich noch fragen wollte: Wie kann man die Zahlen in den JButtons noch größer darstellen?
Wenn ich die Schriftgröße erhöhe, wird statt der jeweiligen Zahl nur "..." angezeigt, obwohl der JButton Platz genug hätte, um die Zahl zu zeigen. Hab noch keine Methode gefunden, mit der ich den Rand verkleinern kann, sodass der Text den gesamten JButton füllen darf.

http://java.sun.com/javase/6/docs/api/javax/swing/AbstractButton.html#setMargin(java.awt.Insets)
 

Mostly_Harmless

Aktives Mitglied
Ark hat gesagt.:
Ich mache es generell so, dass ich eine Main-Klasse anlege, die diverse Informationen über die Software bereithält (Name, Versionsnummer, Autor usw.), über die Verwendung per Konsole informiert und vor allem die main()-Methode enthält. Bei deinen Klassen hatte ich arge Schwierigkeiten, selbst bei Syntaxhervorhebung die main()-Methode ausfindig zu machen.

Ich finds zwar nicht so wichtig überall meinen Namen reinzuschreiben, aber eine Main-Klasse wäre vielleicht wirklich ganz nützlich. ;) Zumindest bei größeren Projekten (dies ist ja noch relativ überschaubar).

Ark hat gesagt.:
Code:
this.easy.setActionCommand( "easy" );

//blubb

if ( cmd.equals("easy") ) {

Stell dir nur einmal vor, du wolltest "easy" in "einfach" (oder irgendetwas anderes) ändern: du müsstest es an mehreren Stellen tun. Das ist nicht so ganz das Wahre. ;)

Daran hab ich auch schon gedacht, mir ist aber keine Lösung dazu eingefallen.
Außer, dass ich dafür extra noch neue Instanz- bzw. Klassenvariablen anlegen könnte, aber wird das dann nicht zuviel?

Ark hat gesagt.:
Und noch weiter: Stell dir vor, du wolltest noch mehr Modi als "easy", "medium" usw. anbieten, vielleicht sogar so weit, dass man als Nutzer selbst "Spielbretter" speichern kann: Dann würde Code wie

Code:
            	if ( cmd.equals("easy") ) {
            		this.mode = new Mode( Mode.EASY );
            	} else if ( cmd.equals("medium") ) {
            		this.mode = new Mode( Mode.MEDIUM );
            	} else if ( cmd.equals("hard") ) {
            		this.mode = new Mode( Mode.HARD );
            	}

gegen unendlich streben. ;) Besser ist es, bei Auswahl eines Spielbretts nur die Parameter zu setzen, als hätte man sie selbst eingegeben (so wird das ja schon gemacht), aber dann, wenn das Spielfeld berechnet werden soll, wirklich nur diese Parameter (Breite, Höhe, Minenzahl) abzunehmen, ohne wieder auf diese verschiedenen Modi zurückzugreifen.

Das war auch der Grund, weshalb ich für den Schwierigkeitsgrad eigens die Klasse Mode angelegt hab.
So kann ich leicht neue vordefinierte Schwierigkeitsstufen hinzufügen. Aber abfragen, welcher Mode nun gewählt wurde und den dann dementsprechend erzeugen muss ich doch irgendwie.

Danke euch allen für die Antworten! :)
 

fjord

Bekanntes Mitglied
Ich hab jetzt nicht in deinen Code gesehen, sondern nur die paar Ausschnitte aus diesem Thread. Mir ist aber aufgefallen, dass du sehr häufig this benutzt. Wenn du innerhalb einer Klasse auf Instanz- oder Klassenvariablen oder -methoden zugreifst, musst du kein this benutzen. Ausnahme ist, wenn eine Variable durch eine lokale Variable verdeckt wird.
 

Mostly_Harmless

Aktives Mitglied
Ich hab jetzt nicht in deinen Code gesehen, sondern nur die paar Ausschnitte aus diesem Thread. Mir ist aber aufgefallen, dass du sehr häufig this benutzt. Wenn du innerhalb einer Klasse auf Instanz- oder Klassenvariablen oder -methoden zugreifst, musst du kein this benutzen. Ausnahme ist, wenn eine Variable durch eine lokale Variable verdeckt wird.

Ich weiß, dass es nicht nötig ist.
Ich machs aber trotzdem, damit sofort deutlich wird, dass es sich um eine Instanzvariable handelt. ;-)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Wie füge ich eine Liste so in eine andere Liste ein, dass der Index der Elemente derselbe bleibt? Java Basics - Anfänger-Themen 7
Rookar Mit Button andere java öffnen Java Basics - Anfänger-Themen 4
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
javalux123 Keylistener auf andere Fenster Java Basics - Anfänger-Themen 3
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
C Int an andere Klasse übergeben Java Basics - Anfänger-Themen 26
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
M Wie kann eine Methode eine andere Methode um Werte wie z.B. 1 erhöhen? Java Basics - Anfänger-Themen 6
C In String, Buchstaben ersetzen durch andere Buchstaben Java Basics - Anfänger-Themen 26
E Warum lässt sich eine Klasse nicht starten, wenn eine andere Klasse in dem Modul fehlerhaft ist? Java Basics - Anfänger-Themen 1
S Objekt aus Arraylist in andere Arraylist kopieren? Java Basics - Anfänger-Themen 2
jonny_2k12 Wie kann ich eine ArrayList aus einer Klasse in eine andere übergeben? Java Basics - Anfänger-Themen 21
M Integer aus aus einer Klasse in andere speichern Java Basics - Anfänger-Themen 12
A Selbe Aufgaben stellung, andere Lösung Java Basics - Anfänger-Themen 7
S ArrayList in andere Klasse übernhemen Java Basics - Anfänger-Themen 5
Y Java andere Klasse aufrufen Java Basics - Anfänger-Themen 6
J Combobox füllen mit Wertausgabe von andere Klasse Java Basics - Anfänger-Themen 3
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
E Methode soll andere Methode der selben Klasse aufrufen Java Basics - Anfänger-Themen 28
B Mit webservice a) String auf Webseite ausgeben b) Weiterleitung auf andere Seite Java Basics - Anfänger-Themen 10
J Übergabe von Parametern an andere Methoden Java Basics - Anfänger-Themen 5
scratchy1 Kann man in einer Methode eine andere aufrufen? Java Basics - Anfänger-Themen 2
G JTextField per Button speichern und an andere Klasse übergeben Java Basics - Anfänger-Themen 2
R Weitergabe von Arrays aus Methoden in andere Klasse Java Basics - Anfänger-Themen 5
M JTable an andere Klasse übergeben Java Basics - Anfänger-Themen 2
neerual Klassen Wie rufe ich Klassen, die andere Klassen extenden in einer Test Unit auf? Java Basics - Anfänger-Themen 10
E Variable (Vektor) in andere Methode übergeben Java Basics - Anfänger-Themen 4
F Input/Output die eine txt-Datei funktioniert die andere nicht Java Basics - Anfänger-Themen 8
W Klassen greifen auf andere Klassen zu Java Basics - Anfänger-Themen 1
L Klassen Objekt aus einer Warteschlange in eine andere übergeben, geht nicht? Java Basics - Anfänger-Themen 6
A Variablen Main Klasse soll auf eine andere Klasse zugreifen Java Basics - Anfänger-Themen 3
F OOP Instanz einer Klasse an eine andere weitergeben Java Basics - Anfänger-Themen 16
J Klassen Variablen in andere Klassen oder Methoden übernehmen Java Basics - Anfänger-Themen 1
S verweis auf andere Klasse fehler Java Basics - Anfänger-Themen 3
D Klassen Wert aus JTextfield in JLabel (andere Klasse) darstellen. Java Basics - Anfänger-Themen 60
JavaNewbie2.0 Strings in andere Klassen importieren. Java Basics - Anfänger-Themen 2
M Methoden Int einer Methode an eine andere Methode übergeben Java Basics - Anfänger-Themen 4
J Best Practice Auf DefaultTableModel in andere Klasse zugreifen Java Basics - Anfänger-Themen 4
J Werte an eine andere Klasse übergeben Java Basics - Anfänger-Themen 4
I Zähler, der erst wieder zählt nachdem Pixel wieder andere Farbe hat Java Basics - Anfänger-Themen 2
M Variablen Eine etwas andere if Abfrage ! Java Basics - Anfänger-Themen 10
P Variablen Wie kann ich eine lokale Variable in eine andere Methode einfügen? Java Basics - Anfänger-Themen 27
P auf eine andere Klasse zugreifen Java Basics - Anfänger-Themen 12
F Ja Nein Abfrage und andere Probleme Java Basics - Anfänger-Themen 5
A Nach Druck eines Buttons reagieren andere Button nicht Java Basics - Anfänger-Themen 3
TheMenox Methoden Bestimmung an welche Methode eine andere Methode ihren Wert weitergeben soll Java Basics - Anfänger-Themen 35
P Variablen einer Methode in andere Method übergeben Java Basics - Anfänger-Themen 6
V Andere Schreibweise für % Modulo Java Basics - Anfänger-Themen 9
L Variable an andere Klasse weitergeben - Was mache ich falsch? Java Basics - Anfänger-Themen 2
O Übergabe in eine andere Klasse Java Basics - Anfänger-Themen 3
T Integer Wert in andere Methode übergeben Java Basics - Anfänger-Themen 2
Z Zugriff auf andere Methoden Java Basics - Anfänger-Themen 12
F double[] an andere Methode übergeben Java Basics - Anfänger-Themen 1
N Variablen ändern wenn eine andere geändert wird Java Basics - Anfänger-Themen 7
J 2 dimensionales Array an andere Methode übergeben? Java Basics - Anfänger-Themen 1
T Kommandozeilenparameter in andere Methode Java Basics - Anfänger-Themen 17
D Bestimmte Werte von Objekten aus einer ArrayList in eine andere ArrayList kopieren Java Basics - Anfänger-Themen 14
W Wert an andere Klasse übergeben Java Basics - Anfänger-Themen 8
I Java Eingabe aus einer anderen Klasse in eine andere an Konstruktor übergeben Java Basics - Anfänger-Themen 4
T Array in andere Klasse verwenden Java Basics - Anfänger-Themen 3
W Klassen Auf andere Klassenobjekte zugreifen Java Basics - Anfänger-Themen 20
W Variable an andere Klasse übergeben Java Basics - Anfänger-Themen 3
J JComboBox in andere Klasse Java Basics - Anfänger-Themen 2
E OOP Methode an andere Methode übergeben / OOP Anfänger Java Basics - Anfänger-Themen 4
K Erste Schritte Classe in andere Einfügen?? Java Basics - Anfänger-Themen 12
U Inhalt von JTextfield an andere Klasse weitergeben Java Basics - Anfänger-Themen 13
O Java Interfaces für andere Programmiersprachen zur Verfuegung stellen? Java Basics - Anfänger-Themen 2
S Aus einer Klasse eine andere laden Java Basics - Anfänger-Themen 6
L Variable andere Variable und z.B. Preis zuordnen Java Basics - Anfänger-Themen 7
M Variablen übergeben an andere Klasse Java Basics - Anfänger-Themen 9
O Dezimalzahl in andere Zahlensysteme Java Basics - Anfänger-Themen 5
M Datei an andere Datei komplett anhängen Java Basics - Anfänger-Themen 11
S Methoden Rückgabewert einer Methode als Parameter an eine andere Methode übergeben, geht das? Java Basics - Anfänger-Themen 5
J Kann ein Objekt andere Objekte beinhalten ? Java Basics - Anfänger-Themen 33
S TextArea, RandomAccessFile, Apend und andere Tricks... Java Basics - Anfänger-Themen 7
O Variabeln aus einer andere Klasse dauerhaft einen anderen Wert übergeben Java Basics - Anfänger-Themen 5
K Best Practice In Klassen auf andere Objekte mit variablen Namen zugreifen Java Basics - Anfänger-Themen 6
O Methode in andere Klasse verlegt, "auslesen" einer HTML Seite verschnellert - Problem. Java Basics - Anfänger-Themen 4
K Zugriff einer Klasse auf eine andere Andere -> bad operand for binary operator Java Basics - Anfänger-Themen 5
S Klassen Mit Mainklasse auf andere zugreifen Java Basics - Anfänger-Themen 3
L Strings in andere Klassen "übergeben" Java Basics - Anfänger-Themen 3
N Probleme mit Class in andere Class adden (Cardlayout) Java Basics - Anfänger-Themen 2
P Eingabe aus JTextField/Area an eine andere Klasse übergeben. Java Basics - Anfänger-Themen 2
B Methode in andere Klasse verschieben Java Basics - Anfänger-Themen 9
G ResultSet übergeben bzw. in andere Variable übernehmen Java Basics - Anfänger-Themen 6
G Projekte importieren und andere Fragen Java Basics - Anfänger-Themen 3
Joew0815 Klassen Andere Klassse in Main starten Java Basics - Anfänger-Themen 8
M Daten in DB oder andere möglickeiten. Java Basics - Anfänger-Themen 5
S Erste Schritte import für andere Klassenfiles verfügbar machen? (Java unter Eclipse) Java Basics - Anfänger-Themen 8
N Klassen auf den Action Listener in einer andere Klasse zugreifen Java Basics - Anfänger-Themen 6
W objektorientierte Programmierung - String in andere Klasse übergeben Java Basics - Anfänger-Themen 13
D Methoden Methode über andere Klasse aufrufen Java Basics - Anfänger-Themen 7
H Wie while Schleife in andere Klasse verlagern? Java Basics - Anfänger-Themen 11
B Variablenübergabe an andere Klasse, Ausgabe Java Basics - Anfänger-Themen 3
W Übergabe Stringzeilen von serieller Schnittstelle in andere Klasse Java Basics - Anfänger-Themen 3
U Zugriff auf andere Packages Java Basics - Anfänger-Themen 10

Ähnliche Java Themen


Oben