[CODECHECK] Erstes Programm

Rolli

Mitglied
Hallo zusammen,

ich habe eine Klasse geschrieben, mit der Operationen auf Brüche durchgeführt werden können. Funktioniert soweit auch, allerdings sind im Code sicher viele Designfehler. Ich würde euch bitten mal drüber zu schauen und mir Anregungen zu geben, wie man etwas besser machen können. Z.b. Exceptions zu benutzen, aber auch wie intern mit den Objekten umgegangen wird, denke da kann man noch viel besser machen!

Java:
public class Bruch {

	private int zaehler;
	private int nenner;
	
	public Bruch(int a, int b) {
		
		this.setZaehler(a);
		if (pruefeNenner(b) == false) {
			System.out.println("Nenner darf nicht <= 0 sein...!");
			System.exit(0);
		} else {
			this.setNenner(b);
		}

	}
	
	public int getZaehler() {
		return zaehler;
	}
	
	public int getNenner() {
		return nenner;
	}
	
	public void setZaehler(int a) {
		zaehler = a;
	}
	
	public void setNenner(int b) {
		if (pruefeNenner(b) == false) {
			System.out.println("Nenner darf nicht <= 0 sein...!");
			System.exit(0);
		} else {
			nenner = b;
		}
	}
	
	// addiert zwei Brueche und liefert dann das Ergebnis zurueck
	public Bruch addieren(Bruch b) {
		
		Bruch[] brueche = new Bruch[] { this.normieren(), b.normieren() };
		int nenner = brueche[0].getNenner() * brueche[1].getNenner();
		
		// auf Hauptnenner bringen
		for (Bruch temp : brueche) {
			temp.setZaehler( ( nenner / temp.getNenner() ) * temp.getZaehler() );
			}
		
		Bruch ret = new Bruch (brueche[0].getZaehler() + brueche[1].getZaehler(), nenner);
		return ret.normieren();
	}
	
	// subtrahiert zwei Brueche und liefert dann das Ergebnis zurueck
	public Bruch subtrahiere(Bruch b) {
		
		Bruch[] brueche = new Bruch[] { this.normieren(), b.normieren() };
		int nenner = brueche[0].getNenner() * brueche[1].getNenner();
		
		// auf Hauptnenner bringen
		for (Bruch temp : brueche) {
			temp.setZaehler( ( nenner / temp.getNenner() ) * temp.getZaehler() );
			}
		
		Bruch ret = new Bruch (brueche[0].getZaehler() - brueche[1].getZaehler(), nenner);
		return ret.normieren();
	}
	
	// multipliziert zwei Brueche und liefert dann das Ergebnis zurueck;
	public Bruch multiplizieren(Bruch b) {
		Bruch[] brueche = new Bruch[] { this.normieren(), b.normieren() };
		Bruch ret = new Bruch(brueche[0].getZaehler() * brueche[1].getZaehler(),
							   brueche[0].getNenner() * brueche[1].getNenner());
		
		return ret.normieren();
		
	}
	
	// dividiert zwei Brueche und liefert dann das Ergebnis zurueck;
	public Bruch dividieren(Bruch b) {
		Bruch[] brueche = new Bruch[] { this.normieren(), b.normieren() };
		Bruch ret = new Bruch(brueche[0].getZaehler() * brueche[1].getNenner(),
							   brueche[0].getNenner() * brueche[1].getZaehler());
		
		return ret.normieren();
		
	}
	
	// Wenn Nenner nicht in Ordnung ist, wird false zurueckgegeben
	private static boolean pruefeNenner(int nenner) {
		if (nenner <= 0) {
			return false;
		} else {
			return true;
		}
	}
	
	// nimmt einen Bruch entgegen und normiert diesen
	private Bruch normieren() {
		
		Bruch temp = new Bruch(this.getZaehler(), this.getNenner());
		int ggt = ggt(Math.abs(temp.getZaehler()), temp.getNenner());
		temp.setZaehler(temp.getZaehler() / ggt);
		temp.setNenner(temp.getNenner() / ggt);
		return temp;
						
	}
	
	private static int ggt(int x, int y) {
		while (y != 0) {
			int temp = x % y;
			x = y;
			y = temp;
		}
		
		return x;
	}
}

Main

Java:
public class Main {

	public static void main(String[] args) {
		Bruch c;
		Bruch a = new Bruch(-3,5);
		Bruch b = new Bruch(2,1);
		c = a.addieren(b);
		System.out.println(c.getZaehler()+"/"+c.getNenner());
		

	}

}

Wenn ich bei manchen Methodenaufrufen das this weglasse, fügt der Compiler das dann automatisch wieder an?

Dank euch schon mal

Viele Grüße
 
G

gman

Gast
[c] System.exit(0);[/c] würde ich aus dem Konstruktor und "setNenner" rausschmeissen und durch
[c]throw new IllegalArgumentException("Nenner darf nicht <= 0 sein!");[/c] ersetzen. Den Rest guck
ich mir in Ruhe nochmal an.
 
G

gman

Gast
Hi, ich hab nochmal n bischen was zum Konstruktor. Mein Netbeans hat da was interessantes
angemeckert ;-)

Du solltest Zähler und Nenner im Konstruktor nicht über die Setter-Methoden besetzen, denn
diese könnten ja von einer Unterklasse überschrieben werden und man kann dann ja nicht sicher
wissen ob der Konstruktor noch so funktioniert wie gewünscht. Also eher sowas:

Java:
    public Bruch(int a, int b) {
        this.zaehler = a;
        if(pruefeNenner(b)) {
            this.nenner = b;
        } else {
            throw new IllegalArgumentException("Nenner darf nicht <= 0 sein!");
        }
    }

Da du das "normieren" fast überall benutzt könntest du es auch gleich im Konstruktor erledigen.
Dann musst du die Methode auch so umschreiben, das die Parameter vom Konstruktor verwendet
werden und kein neues Objekt von Bruch erzeugt wird (konstruieren im Konstruktor ist mitteldämlich).
 

fjord

Bekanntes Mitglied
Für ein erstes Programm sieht das doch schonmal gar nicht schlecht aus. :)

Du prüfst sowohl im Konstruktor als auch in setNenner, ob der Nenner ein gültiger Wert ist. Doppelten Code am Besten vermeiden. Du kannst im Konstruktor einfach setNenner nutzen.

Beim Prüfen würde ich, wie du auch schon gesagt hast, Exceptions benutzen. Für ein ungültiges Argument bietet sich da häufig die IllegalArgumentException an. In dem Zusammenhang stellt sich mir auch die Frage, warum der Nenner nicht negativ sein darf?

Dann würde ich noch vorschlagen die Klasse immutable zu machen. Das bedeutet, nachdem man ein Objekt erstellt hat, kann man es nicht mehr ändern. Dafür müsstest du lediglich setZaehler und setNenner private machen. Der Vorteil an immutable Klassen ist, dass sie automatisch threadsicher sind.

/edit:
Zu dem Punkt von gman: man könnte die Klasse auch final machen, damit sie nicht überschrieben werden kann.

/edit2:
ganz vergessen: this kannst du weglassen. Du brauchst es zum Beispiel, wenn du innerhalb einer Funktion eine Variable mit demselben Bezeichner wie eine Klassenvariable hast.
 
Zuletzt bearbeitet:
G

gman

Gast
@fjord: Nun, mit privaten Settern hätte sich das "Problem" ja auch gelöst. Und diese Klasse ist eigentlich prädestiniert
dafür Immutable zu sein, hast recht.
 

Rolli

Mitglied
Hi,

dank euch für die Anregungen und das drüber schauen. Eine Frage zu this habe ich aber noch

Java:
Bruch[] brueche = new Bruch[] { this.normieren(), b.normieren() };

in Zeile 43. Ist das this hier Pflicht oder nicht? Wenn ich es weglasse, wird es dann automatisch vom Complier eingefügt?

Und sollte man intern mit dem Objekt arbeiten oder besser intern mit neuen Objekten arbeiten und wenn das Ergebnis dann feststeht es entweder dem eigentlichen Objekt übergeben oder ein neues returnen? Wenn ich intern mit dem aufrufenden Objekt arbeite verändere ich ja die Dinge direkt an dem Objekt, was evtl. nicht gewünscht ist durch den Aufrufer, weil der danach noch mit dem alten Zustand weiterarbeiten möchte?!
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Lass es doch weg und probiere es aus ;) Aber ja, du kannst es weglassen.
Ob du das Objekt veränderst oder liegt, liegt ganz bei dir. Aber wenn, dann überall. Wenn du eine immutable Klasse machst (wie String) dann darfst du niergenswo das Objekt verändern, ansonsten solltest du nicht irgendwo doch ein neues Objekt zurückgeben.

Was mir noch einfällt ist die unnötige Verwendung von Arrays. Wozu machst du zuerst alle Werte in ein Array und arbeitest damit? Du hast doch eh nur 2 Werte bei den Rechenoperationen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Alen123 Erstes Arbeiten mit Methoden. Java Basics - Anfänger-Themen 5
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
S Mein erstes eigenes Projekt - Aufbau und Strukturierung Java Basics - Anfänger-Themen 6
I Letztes, erstes Element vom Array Java Basics - Anfänger-Themen 9
X Array erstes und letztes Element tauschen Java Basics - Anfänger-Themen 2
J erstes Vorkommen eines Chars aus einem String entfernen Java Basics - Anfänger-Themen 3
J erstes Vorkommen eines chars entfernen Java Basics - Anfänger-Themen 1
O Erstes Programm: Matrizen Multiplikation Java Basics - Anfänger-Themen 10
H java erstes projekt Java Basics - Anfänger-Themen 502
M OOP Mein erstes Textadventure... Java Basics - Anfänger-Themen 3
K Erstes kleines Spieleprojekt - Java GUI in HTML einbinden Java Basics - Anfänger-Themen 3
D Auswahl und Ausgabe erstes Programm Java Basics - Anfänger-Themen 8
M Mein erstes Programm Java Basics - Anfänger-Themen 3
V Erste Schritte Erstes Project - Hilfe Java Basics - Anfänger-Themen 9
T erstes kleines Programm Java Basics - Anfänger-Themen 17
M Erste Schritte Erstes Programm mit Compiler öffnen Java Basics - Anfänger-Themen 4
M Mein erstes Java Programm Java Basics - Anfänger-Themen 5
J Erstes Applet läßt sich nicht anzeigen Java Basics - Anfänger-Themen 2
E Erstes "kleines" Programm Java Basics - Anfänger-Themen 5
M Erstes Textrollenspiel funktioniert...nicht. Java Basics - Anfänger-Themen 2
L Erstes Projekt aus zwei Projekten Java Basics - Anfänger-Themen 1
T mein erstes Java projekt Java Basics - Anfänger-Themen 8
1 Mein erstes Programm, HELP!! Java Basics - Anfänger-Themen 2
T OOP Mein erstes Java-Spiel - Schiffe versenken! Java Basics - Anfänger-Themen 2
M Erstes Prog. OS Abfrage Java Basics - Anfänger-Themen 9
E Mein erstes Java Projekt - Sauberer code? Java Basics - Anfänger-Themen 28
A Erstes Programm: Polynom-Klasse Java Basics - Anfänger-Themen 15
B Erstes Element eines Vectors erhalten Java Basics - Anfänger-Themen 5
D Mein erstes Programm flackert Java Basics - Anfänger-Themen 5
W Erste Schritte erstes Programm Java Basics - Anfänger-Themen 40
A Textdatei einlesen - erstes Zeichen falsch Java Basics - Anfänger-Themen 20
I Liste Remove erstes Element Java Basics - Anfänger-Themen 5
W Erstes eigens Programm - Klassen- und Schüler Verwaltungsprogramm Java Basics - Anfänger-Themen 5
M Erstes "sinnvolles" Programm Java Basics - Anfänger-Themen 11
A Erstes Programm - Problem beim Ausführen als jar Java Basics - Anfänger-Themen 3
B Methoden Mein erstes Programm - und gleich Probleme Java Basics - Anfänger-Themen 6
J Bald erstes Java Buch durchgearbeitet - Wie gehts nun weiter? Java Basics - Anfänger-Themen 6
T Erstes Zeichen aus String löschen Java Basics - Anfänger-Themen 8
J erstes Prog./Klasse - Konstruktur/Objekterstellung funktioniert nicht Java Basics - Anfänger-Themen 25
M Erstes Programm und Fehlermeldung Java Basics - Anfänger-Themen 5
B erstes Java-Applet Java Basics - Anfänger-Themen 7
M Erstes Zeichen in einem String in Großbuchstaben wandeln Java Basics - Anfänger-Themen 3
M Sammlung von Anfängerfragen für mein erstes Programm Java Basics - Anfänger-Themen 15
C Erstes Arraylist Element in for Schleife überspringen Java Basics - Anfänger-Themen 6
G Erstes Java-Programm Java Basics - Anfänger-Themen 10
E Erstes Programm - Problem mit Exception Java Basics - Anfänger-Themen 3
G Feststellen, ob erstes Zeichen eines Strings eine Ziffer ist Java Basics - Anfänger-Themen 11
M Serialisierung erstes Beispiel Java Basics - Anfänger-Themen 4
A erstes größeres Projekt Java Basics - Anfänger-Themen 14
P Mein erstes JAR-File Java Basics - Anfänger-Themen 8
G erstes Zeichen eines Strings herausfinden Java Basics - Anfänger-Themen 3
G erstes element einer haspmap Java Basics - Anfänger-Themen 5
G erstes Arbeiten mit Collections Java Basics - Anfänger-Themen 17
G erstes Arbeiten mit Packages Java Basics - Anfänger-Themen 2
T Erstes RPG: KeyAdapter Problem Java Basics - Anfänger-Themen 3
M erstes Zeichen ersetzen Java Basics - Anfänger-Themen 2
C Konstruktor wird nicht als erstes aufgerufen! Java Basics - Anfänger-Themen 11
L Suche Verbesserungsvorschläge für mein erstes Programm Java Basics - Anfänger-Themen 34
Bierhumpen mein erstes großes Programm. Was ändern? verbessern? Java Basics - Anfänger-Themen 12
O mit Regex erstes Zeichen überprüfen Java Basics - Anfänger-Themen 3
A Mein erstes Programm Java Basics - Anfänger-Themen 6
D JNDI-DataSource erstes mal benutzen Java Basics - Anfänger-Themen 4
T Erstes Programm Java Basics - Anfänger-Themen 7
B Erstes Programm :-/ Java Basics - Anfänger-Themen 3
C Erstes kleines Problem - string in chat ? Java Basics - Anfänger-Themen 9
M Erstes Element einer Enumeration? Java Basics - Anfänger-Themen 6
A Erstes Buch durchgelesen, wie weiter vorgehen? Java Basics - Anfänger-Themen 8
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
M Java Mail Programm Java Basics - Anfänger-Themen 4
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
M Mini Jar-Programm Java Basics - Anfänger-Themen 51
G JTable Listselectionlistener friert das Programm ein Java Basics - Anfänger-Themen 8
M Das Programm stellt nichts dar Java Basics - Anfänger-Themen 2
K Programm compilierbar aber nicht ausführbar... Java Basics - Anfänger-Themen 21
Z Programm Ideen Java Basics - Anfänger-Themen 8
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
T Programm stürzt ab Java Basics - Anfänger-Themen 40
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
Jul1n4tor Programm mit Scanner und If-Statements Java Basics - Anfänger-Themen 2
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
K Ist das Programm schlecht bzw. schlampig programmiert ? Java Basics - Anfänger-Themen 9
Zrebna Kann Java Programm nicht in Konsole ausführen Java Basics - Anfänger-Themen 1
K Warum läuft das Programm nicht(bzw. nicht richtig) Java Basics - Anfänger-Themen 4
M Von Eclipse zum richtigen Programm Java Basics - Anfänger-Themen 1
nbergmann IntelliJ: Wie lade ich ein fertiges Programm aus dem Lehrbuch? Java Basics - Anfänger-Themen 26
D Anfängerfrage zu meinem Programm. Java Basics - Anfänger-Themen 15
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 22
I Jetty starten von Programm (Main) Java Basics - Anfänger-Themen 27
Kydo Programm Beschreibung Java Basics - Anfänger-Themen 3
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben