Code in Hinsicht auf Lesbarkeit optimieren

JavaMeetsBlueJ

Bekanntes Mitglied
Hallo Java-Forum,
der folgende Code beschschreibt ein simples Programm und ist meiner Meinung nach pinibel kommentiert. Mich interessiert einfach, was da noch fehlt, bzw. was ich da noch besser machen kann.
MfG

Klasse Main:
Java:
public class Main {

	
	public static void main(String[] args) {
		GUI fenster = new GUI();             // ein Fenster wird erzeugt
		

	}

}

Klasse GUI:
Java:
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class GUI extends JFrame{
	
	// Variablen anlegen und Objekte der Steuerelemente erzeugen
	
	JPanel panel1 = new JPanel();
	JButton addiereButton = new JButton("Addieren");
	JButton subtrahiereButton = new JButton("Abziehen");
	JButton button3 = new JButton("Sperren");
	JTextField txtfield = new JTextField("0",20);
	boolean locked = false;
	
public GUI()
{
	// Fensterattribut festlegen
	setSize(500,100);
	setResizable(false);
	setLocationRelativeTo(null);
	setTitle("Titel");
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	//-----------------------------ActionListener erzeugen----------------------------------------
	
	ActionListener al = new ActionHandler(this);
	
	//---------------------------------Steuerelemente dem Fenster hinzufügen-------------------------------------
	add(panel1);
	panel1.add(addiereButton);
	panel1.add(subtrahiereButton);
	panel1.add(button3);
	
	addiereButton.addActionListener(al);
	subtrahiereButton.addActionListener(al);
	button3.addActionListener(al);
	
	panel1.add(txtfield);
	//-------------------------------------Fenster sichtbar machen---------------------
	setVisible(true);
}

/**
 * ändert den Inhalt des Textfelds txtfield
 * @param zahl Zahl, die in dem Textfeld steht
 */
public void setTextFieldText(int zahl) 
{
    txtfield.setText("" + zahl);	
}

/**
 * verhindert das Editieren von txtfield
 */
public void sperreTextfield()
{
	txtfield.setEditable(false);
	locked = true;
	button3.setText("Entsperren");
}

/**
 * ermöglicht das Editieren von txtfield
 */
public void entsperreTextfield()
{
	txtfield.setEditable(true);
	locked = false;
	button3.setText("Sperren");
}

}

Klasse ActionHandler:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class ActionHandler implements ActionListener {

	 GUI fenster;
	 int zahl;
	 
	 
	public ActionHandler(GUI fenster)
	{
		this.fenster = fenster;                             // Übergabe der Referenz des Fensters
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		// falls addiereButton geklickt wurde
		if (e.getSource().equals(fenster.addiereButton)) 
		{
			zahl++;
			fenster.setTextFieldText(zahl);
		}
		
		// falls subtrahiereButton geklickt wurde
		else if (e.getSource().equals(fenster.subtrahiereButton))
			{
			zahl--;
			fenster.setTextFieldText(zahl);
			}
		
		// falls buuton3 geklickt wurde
		else if(e.getSource().equals(fenster.button3))
		{
			if(fenster.locked == false)  // wenn txtfield editierbar
			{
				fenster.sperreTextfield();
			}
			else if(fenster.locked)        // wenn txtfield nicht editierbar
			{
				fenster.entsperreTextfield();
			}
		}
		

		
	}

}
 
Zuletzt bearbeitet:
C

Constructor

Gast
Du könntest z.B. mal Conventions und Clean-Code in betracht ziehen, denn in deiner main ist schon ein großer Fehler : deine GUI erbt von JFrame (schon schlecht genug für sich alleine), also hat das setVisible() NICHTS in dessen Konstruktor zu suchen. Stattdessen sollte deine main eher so aussehen :
Java:
GUI gui=new GUI();
gui.setVisible(true);
Ist an sich zwar genau so Käse weil wozu von JFrame erben aber im Vergleich zu setVisible im Konstrukor callen immer noch besser.
 

JavaMeetsBlueJ

Bekanntes Mitglied
Du könntest z.B. mal Conventions und Clean-Code in betracht ziehen, denn in deiner main ist schon ein großer Fehler : deine GUI erbt von JFrame (schon schlecht genug für sich alleine), also hat das setVisible() NICHTS in dessen Konstruktor zu suchen. Stattdessen sollte deine main eher so aussehen :
Java:
GUI gui=new GUI();
gui.setVisible(true);
Ist an sich zwar genau so Käse weil wozu von JFrame erben aber im Vergleich zu setVisible im Konstrukor callen immer noch besser.

- Wieso sollte GUI nicht von JFrame erben?
-Gilt das nur für setVisible() oder auch für alle anderen Methoden genauso?

Bin halt noch nicht so lange dabei und freue mich da über jedes Feedback ;)
MfG
 
G

Gast2

Gast
- Wieso sollte GUI nicht von JFrame erben?
Weil du JFrame nicht um innovativ neue Funktionalität erweiterst ;)
Es reicht völlig aus wenn GUI eine Instanz von JFrame verwaltet.

-Gilt das nur für setVisible() oder auch für alle anderen Methoden genauso?
In dem Fall nur für setVisible(). Der Konstruktor ist dafür zuständig das Objekt zusammenzubauen. Das Anzeigen gehört da nicht unbedingt mit dazu.
 

JavaMeetsBlueJ

Bekanntes Mitglied
Ok das mit dem JFrame ist mir jetzt auch klar, nur wie sieht das jetzt aus mit den Buttons, sollen die auch private sein, weil der ActionListener dann nicht auf sie zugreifen kann/darf... es ist doch total umständlich für jeden Button ne Getter-Methode zu machen.
Beispiel:
Java:
public JButton gibMirButton1()
{
return button1;
}

MfG
 
G

Gast2

Gast
Das ist aber der gängige Weg ;)

Ich würde deinen ActionListener aber eher als anonyme Klassen realisieren, vor allem weil das ja nur je zwei Zeilen Code sind die du da ausführen willst.
 

JavaMeetsBlueJ

Bekanntes Mitglied
Ja das mit anonymen Klasse wieß ich, nur ich versteh noch nicht so ganz diese Art von Klassen und bleibe gerade eher dabei, den ActionListener zu implementieren, weil ich deisen Weg zu 100% nachvollziehen kann und ungerne Sachen code, wo ich weiß es geht, aber ohne zu wissen wie... .

Schade, dass das mit dme Button so umständlich gehalten wird, aber COnvention sind Conventions und je eher man sich dran gewöhnt, desto besser;)

Kann man sich hieran ruhig orientieren?

Einstieg in Java. Das Praxis-Training - Das Video-Training von Galileo Computing

MfG
 
Zuletzt bearbeitet:
T

tommysenf

Gast
Hi,

hier ein paar eigene Erfahrungen aus großen Softwareprojekten.

1. Das A und O für verständlichen Code sind meiner Meinung nach gute Variablen und Methodennamen.

Code:
    JPanel panel1 = new JPanel();
    JButton addiereButton = new JButton("Addieren");
    JButton subtrahiereButton = new JButton("Abziehen");
    JButton button3 = new JButton("Sperren");
    JTextField txtfield = new JTextField("0",20);

addiereButton und subrahiereButton sind sind gut gewählt, wer den Variablennamen liest weiss sofort, was gemacht wird. panel1, button3 und txtfield sind verbesserungswürdig:

Code:
    JPanel grundPanel = new JPanel();
    JButton addiereButton = new JButton("Addieren");
    JButton subtrahiereButton = new JButton("Abziehen");
    JButton sperrButton = new JButton("Sperren");
    JTextField ergebnisTextField = new JTextField("0",20);

2. Sichtbarkeit

Das GUI Elemente nicht private gemacht werden, sonder package deklariert sind, ist meiner Erfahrung nach gängige Praxis die ich schon oft erlebt habe und würde von mir toleriert werden, da es den GUI code meines Erachtens auch kompakter und lesbarer macht.

locked ist jedoch eine Eigenschaft und daher definitiv auf private zu setzen. Also:

Java:
public class GUI extends JFrame {
    ...
    private boolean locked = false;
    ...

    public void setLocked(boolean state) {
       this.locked = state;
    }

    public boolean isLocked() {
       return locked;
    }

3. Lesbarer Code

Guter Code liest sich wie natürliche englische Sprache und sollte auch so geschrieben werden.
Beispiel:

Allein, durch die Einführung des getters isLocked() können wir aus

Java:
// falls buuton3 geklickt wurde
        else if(e.getSource().equals(fenster.button3))
        {
            if(fenster.locked == false)  // wenn txtfield editierbar
            {
                fenster.sperreTextfield();
            }
            else if(fenster.locked)        // wenn txtfield nicht editierbar
            {
                fenster.entsperreTextfield();
            }
        }

folgendes machen:

Java:
         // falls buuton3 geklickt wurde
        else if(e.getSource().equals(fenster.button3)) {
            if(fenster.isLocked()) {  // wenn txtfield nicht editierbar
                fenster.entsperreTextfield();
            } else {
                fenster.sperreTextfield();
            }
        }

4. Kommentare

Inline-Kommentare sollten

1. nicht redundant sein
2. so wenig wie möglich nötig sein

Ein Kommentar ist meist ein Zeichen für schlecht formulierten Code oder oft auch einfach überflüssig:

Java:
ActionListener al = new ActionHandler(this); //ActionListener erzeugen
if(fenster.isLocked()) {  // wenn txtfield nicht editierbar

Sind meiner Meinung nach redundant und können ersatzlos gestrichen werden. Das Problem mit diesen Kommentaren ist, das sie bei Codeänderungen oft nicht gepflegt werden und irgendwann ist der Kommentar dann eventuell sogar falsch,was viel schlechter ist als gar kein Kommentar.

Andere Kommentare lassen sich über Methoden einpflegen. Das macht den Code Lesbar und der "Kommentar" wird dann auch mitgewartet:

Java:
        else if(sperrButtonClicked(e)) {
            if(fenster.isLocked()) { 
                fenster.entsperreTextfield();
            } else {
                fenster.sperreTextfield();
            }
        }
...

       private boolean sperrButtonClicked(ActionEvent click) {
          return klick.getSource().equals(fenster.sperrButton)
       }

Auch Kommentare die eine Gliederung darstellen, zeigen meist nur, dass man das Ganze besser in extra Methoden auslagern sollte:

Java:
]public GUI()
{
// Fensterattribut festlegen
    setSize(500,100);
    setResizable(false);
    setLocationRelativeTo(null);
    setTitle("Titel");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    //-----------------------------ActionListener erzeugen----------------------------------------
    
    ActionListener al = new ActionHandler(this);
    
    //---------------------------------Steuerelemente dem Fenster hinzufügen-------------------------------------
    add(panel1);
    panel1.add(addiereButton);
    panel1.add(subtrahiereButton);
    panel1.add(button3);
    
    addiereButton.addActionListener(al);
    subtrahiereButton.addActionListener(al);
    button3.addActionListener(al);
...
}

Wird zu:

Java:
public GUI() {
  initializeWindow();
  ActionListener actionListener = new ActionHandler(this);
  initalizeActions(actionListener);
}

private void initalizeWindow() {
    setSize(500,100);
    setResizable(false);
    setLocationRelativeTo(null);
    setTitle("Titel");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
...

Ansonsten würde ich dir noch raten, dir gerade bei Gui Anwendungen einmal das MVC-Pattern anzuschauen, um ein besseres Design deiner Klassen zu erreichen. Weiterhin bevorzuge ich englische Bezeichner, da Java und die Klassenbibliothek der englischen Sprache entstammen und der Code meines erachtens dann besser lesbar ist als in "Denglisch".
 
G

gatsantwort

Gast
Das ist aber der gängige Weg ;)

Schade, dass das mit dme Button so umständlich gehalten wird, aber COnvention sind Conventions und je eher man sich dran gewöhnt, desto besser;)

Nein, das ist NICHT der gängige Weg! Der gängige Weg ist deine Instanzvariablen private zu machen und keine getter und setter Methoden zur Verfügung zu stellen. Gerade bei GUIs ist es mir völlig unverständlich warum es eine Methode getXYZButton geben sollte...
 

JavaMeetsBlueJ

Bekanntes Mitglied
Danke, ich hatte nämlich gestern garkeinen Bock mehr weiterzumachen, weil ich mich langsam an Conventions gewöhnen möchte und es mir echt sehr umständlich ershcien, jetzt hab ich wieder Mut;)
Ja das mit dem MVC hab ich mir auch noch vorgenommen.... evtl werde ich nachher noch den code meines BMI-Rechners posten, an dem ich gerade sitze, wenn mir das jemand an dem Beispiel veranschaulichen könnte,wäre das super, falls nicht, muss ich halt einfach nachlesen. Danke

MfG
 
M

MVC-rate

Gast
Ich gebe noch zu bedenken dass das MVC-Pattern lediglich EIN mögliches Pattern ist wie man sein Programm strukturieren kann. Es ist jetzt aber auch nicht "DAS" Pattern, also nicht die Lösung auf alles. Bei GUIs macht es sich aber meist ganz gut.
 

JavaMeetsBlueJ

Bekanntes Mitglied
Also, ich sitze gerade an meinem BMI-Rechner, um alles zu üben, was ich bisher kann, das Problem ist nur folgendes:

Wenn ich die Methode, die ich für die Berechnung brauche, in den ActionListener mit rein tu, ist das von Design her absolut schlecht, aber alles funktioniert.

Mein Ziel ist es, die Methode in eine Extra Klasse "Berechnungen" zu packen, wo die Logik drin ist.

Hier tun sich folgende Probleme auf: Ich kann an eine Klasse selber keine Referenzen auf andere Objekte speichern, zumindest weiß ich nicht wie das geht-> ich bekomme eine NullPointerException, wenn ich die Methoden in der Klasse Berechnungen ausführe, die auf Methoden des Fensters zugreifen.

Wenn ich jetzt aus der Klasse Berechnungen ein Objekt erzeuge, und danach eines vom ActionListener, bekomm ich auch eine NullpointerException, was ich allerdings überhaupt nicht verstehe, da im GUI-Konstruktor zuerst ein Berechnungen-Objetkt und danach ein ActionListener erzeugt wird.

Hat da jemand einen Tip für mich, wie ich das lösen könnte?

(Ja ich weiß, dass der Post nicht mehr zur Kathegorie gehört, aber ich weiß nicht wohin damit. ggf. einfach verschieben *sorry*)
[EDIT]Das Problem hab ich von selbst gelöst(geiles Feeling;)) Back to Topic[/EDIT]
MfG
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
tomzen Programm ignoriert in der Ausführung Code Java Basics - Anfänger-Themen 8
O Obfuscateter Code lässt sich nicht ausführen? Java Basics - Anfänger-Themen 7
M Code aus IntelliJ in "Textform" für Word-Paper? Java Basics - Anfänger-Themen 10
T Kann mir jemand wörtlich erklären, was in dem Code genau passiert? Java Basics - Anfänger-Themen 1
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
terashy VS Code Project run error Java Basics - Anfänger-Themen 10
JaZuDemNo Code Erklärung Java Basics - Anfänger-Themen 3
M Connect-4-Code analysieren Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
T Fehlercode bei code der das Alter ausrechnet Java Basics - Anfänger-Themen 2
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
jhfjeh Strukturgramm in code Java Basics - Anfänger-Themen 11
D Tipps zum Code Java Basics - Anfänger-Themen 24
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
Say Stelle in Code herausfinden, wie geht man vor? Java Basics - Anfänger-Themen 12
Say do-While Code Ausführung Java Basics - Anfänger-Themen 3
W Rückfrage zur Programmgestaltung (clean code) Java Basics - Anfänger-Themen 12
M intelliJ auf neuem PC, plötzlich kein Code Java Basics - Anfänger-Themen 3
Pinhg Sound in Greenfoot Code einbinden Java Basics - Anfänger-Themen 2
C Java boolean Code läuft nicht Java Basics - Anfänger-Themen 5
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
A Wie könnte man diesen Code kürzer machen ? Java Basics - Anfänger-Themen 7
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
S Hilfe bei Umänderung von Java Code Java Basics - Anfänger-Themen 16
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
K Wie kann man diesen Code schnell und effizient interpretieren (Man hat nur 4 Minuten) Java Basics - Anfänger-Themen 3
R ISBN-10-Code überprüfen Java Basics - Anfänger-Themen 7
I Bitte um Hilfe zu unterstehenden Code Java Basics - Anfänger-Themen 6
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
I HTML Code säubern Java Basics - Anfänger-Themen 4
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
N Java-Code abwärtskompatibel machen Java Basics - Anfänger-Themen 4
J Erste Schritte Was mache ich in meinem Code falsch. Java Basics - Anfänger-Themen 3
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
S Compiler-Fehler Nicht adressierbarer Code ( Non-addressable code ) Java Basics - Anfänger-Themen 5
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
A Code Problem Java Basics - Anfänger-Themen 6
C Fehler im Code Java Basics - Anfänger-Themen 10
A Zu einem bestimmten Ort im Code springen Java Basics - Anfänger-Themen 11
L Ist der Code richtig Java Basics - Anfänger-Themen 3
josfe1234 code vereinfachen Java Basics - Anfänger-Themen 15
nonickatall Ausführbarkeit von Code testen bzw. Remote Debugging Java Basics - Anfänger-Themen 4
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
G Programm Code Java Basics - Anfänger-Themen 5
C Code zusammenfassen Java Basics - Anfänger-Themen 5
I Erklärung zum Java Code Java Basics - Anfänger-Themen 2
T Programmablaufsplaninterpretation in Code umformen Java Basics - Anfänger-Themen 1
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
AlexVo String zu Java Anweisung getString("*** java code ***") Java Basics - Anfänger-Themen 19
M ISBN-Code Java Basics - Anfänger-Themen 26
B Zeitgleiches Arbeiten am Code mit mehreren Personen? Java Basics - Anfänger-Themen 7
S Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt? Java Basics - Anfänger-Themen 23
N Kann man den Code vereinfachen? Java Basics - Anfänger-Themen 25
marcooooo Code erklären Java Basics - Anfänger-Themen 28
marcooooo Code erklären Java Basics - Anfänger-Themen 4
S Advent of Code Day4 Java Basics - Anfänger-Themen 4
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
Gaudimagspam Caesars Code entziffern in Java Java Basics - Anfänger-Themen 8
Lukasbsc Wie kann ich meinen Code optimieren? Java Basics - Anfänger-Themen 4
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
I Input/Output Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 3
T Main startet nicht bei vorgegebenen Code Java Basics - Anfänger-Themen 41
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
J Fehler im Code, aber ich weiß nicht wieso! Java Basics - Anfänger-Themen 6
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
M Code nur für Cracks? Crack the Passwort Übung Java Basics - Anfänger-Themen 7
parrot Code entferneJedeZweiteZiffer Java Basics - Anfänger-Themen 6
G Code kürzen Java Basics - Anfänger-Themen 5
Bluedaishi Source Code Signieren Java Basics - Anfänger-Themen 22
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
L Best Practice Code refactern Java Basics - Anfänger-Themen 30
G code kürzen Java Basics - Anfänger-Themen 16
A Code umschreiben Java Basics - Anfänger-Themen 6
Torsten.E JavaFX mit Visual Studio Code verwenden Java Basics - Anfänger-Themen 1
C Beispiel-Code mit Pair wird nicht compiliert. Java Basics - Anfänger-Themen 8
X Reverse algorithm engineering (Java code) Java Basics - Anfänger-Themen 6
T Bufferedwriter code Nullpointerexception Java Basics - Anfänger-Themen 4
V Switch Methode macht Code kaputt Java Basics - Anfänger-Themen 18
R Was muss ich an meinem Code ändern? Java Basics - Anfänger-Themen 2
S Bewertet meinen Code - Part 1 Java Basics - Anfänger-Themen 8
M Java Code Verständnis Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben