If verbessern

fleckdalm

Bekanntes Mitglied
Ich habe folgenden code geschrieben:

Java:
public class OhmBL {
    private int sst,ws,sp;

   public OhmBL(int sst,int ws,int sp){
       this.sst=sst;
       this.ws=ws;
       this.sp=sp;
   }

   public void berechnen(){
       if(sst==0&&ws==0&&sp==0||sst==0&&ws==0||ws==0&&sp==0||sp==0&&sst==0||sst!=0&&ws!=0&&sp!=0){
           JOptionPane.showMessageDialog(null, "Es muss genau 1 Textfeld leer sein");
       }
       else{
           if (sst==0){
               sst=sp/ws;
           }
           else{
               if(ws==0){
                   ws=sp/sst;
               }
               else{
                   if (sp==0){
                       sp=ws*sst;
                   }
               }
           }
       }

   }

   public int getSst(){
       return sst;
   }

   public int getWs(){
       return ws;
   }

   public int getSp(){
       return sp;
   }

        

}

Das Programm soll mithilfe des Ohmschen Gesetzes immer das jeweils leere Feld auffüllen. Es funktioniert so auch aber ich glaube das man die IF anweisung (und auch den restlichen code) sicher besser schreiben kann. Wie gesagt es funktioniert es geht mir nur darum mir vielleicht ein paar Tipps zu holen um beim Programmieren besser zu werden.
mfg Fleckdalm
 
S

SlaterB

Gast
evtl einfacher:
int b1 = wert1 == 0 ? 0 : 1;
int b2 = wert2 == 0 ? 0 : 1;
int b3 = wert3 == 0 ? 0 : 1;
int sum = b1+b2+b3;
-> sum muss genau 2 sein

zu empfehlen:
in einem großen if-Block mit && und || gemischt lieber Klammern setzen, egal ob es derzeit geht oder nicht

Geschmackssache:
beim Test in Zeile 12 return; zum Abbruch statt else,
wenn immer nur ein Feld 0 sein kann, dann kannst du dir die weiteren else-Verschachtelungen auch sparen und nur 3x if schreiben,
oder verwende } else if {
 

Andi_CH

Top Contributor
Mein Vorschlag (ist halt auch Geschmackssache ;-) )

Java:
import javax.swing.JOptionPane;

public class OhmBL {
	private int sst,ws,sp;

	public OhmBL(int sst,int ws,int sp){
		this.sst=sst;
		this.ws=ws;
		this.sp=sp;
	}

	public void berechnen() {
		int nrOfNull = 0;
		if (sst==0)
			nrOfNull += 1;
		if (ws==0)
			nrOfNull += 1;
		if (sp==0)
			nrOfNull += 1;
		if(nrOfNull != 1){
			JOptionPane.showMessageDialog(null, "Es muss genau 1 Textfeld leer sein");
		} else if (sst==0) {
			sst=sp/ws;
		} else if(ws==0) {
			ws=sp/sst;
		} else if (sp==0) {
			sp=ws*sst;
		}
	}

	public int getSst(){
		return sst;
	}

	public int getWs(){
		return ws;
	}

	public int getSp(){
		return sp;
	}
}
 
B

bygones

Gast
find ich in keiner weise schöner....

zu empfehlen:
in einem großen if-Block mit && und || gemischt lieber Klammern setzen, egal ob es derzeit geht oder nicht
das auch nicht - bei großen if blöcken definitiv in eine Methode auslagern....

Java:
if(sst==0&&ws==0&&sp==0||sst==0&&ws==0||ws==0&&sp==0||sp==0&&sst==0||sst!=0&&ws!=0&&sp!=0){
           JOptionPane.showMessageDialog(null, "Es muss genau 1 Textfeld leer sein");
       }
ich versteh die if bedingung nicht wirklich, daher geh ich vom text aus, was du testen willst. Deine ints (btw schreckliche Variablennamen....) dürfen in der Summe genau 1 sein ?! dann schreibs doch so
Java:
if  ( sst + wws + sp != 1) {
    JOptionPane....
}
bzw noch besser
Java:
if  ( moreThanOneFieldFilled() ) {
    JOptionPane....
}
den else zweig würde ich auch wieder in eine gut benannte Methoden auslagern und dort die if-else abfrage machen
 

Ezra

Bekanntes Mitglied
Das geht auch:
Java:
public void berechnen(int sst, int sp, int ws) {
		if (sst == 0 && ws != 0 && sp != 0) {
			sst = sp / ws;
		} else if (ws == 0 && sst != 0 && sp != 0) {
			ws = sp / sst;
		} else if (sp == 0 && ws != 0 && sst != 0) {
			sp = ws * sst;
		} else {
			JOptionPane.showMessageDialog(null,
					"Es muss genau 1 Textfeld leer sein");
		}
	}

Deine ints (btw schreckliche Variablennamen....) dürfen in der Summe genau 1 sein ?!
Unsinn. Warum sollten sie?
 
M

maki

Gast
Sehe das wie bygones, die Variablennamen sind eine Katastrophe, in der berechne Methode wird "alles" gemacht, von der Berechung, bis zur Prüfung ob Textfelder leer sind und ausgabe eines Dialoges für die Fehlermeldung.
 

Andi_CH

Top Contributor
ich versteh die if bedingung nicht wirklich, daher geh ich vom text aus, was du testen willst. Deine ints (btw schreckliche Variablennamen....) dürfen in der Summe genau 1 sein ?!

Es ist sehr klar beschrieben, dass genau ein Feld leer, also 0, sein muss.

Das Programm soll mithilfe des Ohmschen Gesetzes immer das jeweils leere Feld auffüllen.

Daraus lässt sich schliessen, dass die anderen Felder einen beliebigen Wert != 0 haben.

Es ist mir schleierhaft wie man das mit einer Summe lösen will!

(Ungeschickt ist nur, dass das Ohmsche Gesetzt auch für Spannung = 0 und Widerstand != 0, sowie für Strom = 0 und Widerstand != 0 definiert ist, aber das lassen wir mal)

Das Ganze an die echten Bezeichnungen angepasst:

Java:
import javax.swing.JOptionPane;

public class OhmBL {
	private int strom, widerstand, spannung;

	public OhmBL(int strom, int widerstand, int spannung){
		this.strom = strom;
		this.widerstand = widerstand;
		this.spannung = spannung;
	}
	
	private boolean valuesAreValid() {
		int nrOfNull = 0;
		if (strom==0) nrOfNull += 1;
		if (widerstand==0) nrOfNull += 1;
		if (spannung==0) nrOfNull += 1;
		return (nrOfNull == 1);
	}

	public void berechnen() {
		if (!valuesAreValid()) {
			JOptionPane.showMessageDialog(null, "Es muss genau 1 Textfeld leer sein");
		} else if (strom == 0) {
			strom = spannung / widerstand;
		} else if (widerstand == 0) {
			widerstand = spannung / strom;
		} else if (spannung == 0) {
			spannung = widerstand * strom;
		}
	}

	public int getStrom(){
		return strom;
	}

	public int getWiderstand(){
		return widerstand;
	}

	public int getSpannung(){
		return spannung;
	}
}

Ja, ich habe echt keine Hemmung ein if und das einzige Statement auf eine Zeile zu schreiben!
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Mal was ganz anderes: Man könnte etliches machen mit Summe und 0-Test und so... aber ... ich würde mal postulieren, dass diese Abfrage ohnehin nicht dort hingehört. Die Abfrage, ob irgendwelche TextFields(!) leer sind, und das Anzeigen einer JOptionPane(!) gehört nicht in die "Modell-Klasse" (wenn man die denn so nennen will) sondern ins GUI. Und DORT ist die Abfrage auch um einiges leichter, und in Anlehung an Andi_CH's Einwand auch sinnvoller: Man kann mit
if (textField.getText().trim().equals("")) ...
prüfen, ob das TextField LEER ist, und andernfalls mit
Double.parseDouble(textField.getText().trim()) ...
einen Double rauslesen, der auch 0 sein darf. Das OhmBL wird nur erstellt, wenn alles passt (d.h. wenn ein TextField leer ist).
 

Andi_CH

Top Contributor
Logisch sollte das schon bei der Eingabe geprüft werden - egal ob Konsole oder GUI.
Aus einer Businessklasse wie dieser ein Pane zu öffnen ist sehr unschön.

Hier würde ich, wenn überhaupt, nur noch die Überprüfung einbauen ob der Widerstand 0 ist und eine Exception (es gibt glaub InvalidParameters) werfen oder es gleich auf die DivisionByZero ankommen lassen.

Als Übungsbeispiel ist es schon ok - aber nur als das :D
 

Marco13

Top Contributor
Hmja, aber was soll damit geübt werden? Bisher schwirrt in meinem Hinterkopf sowas rum wie
Java:
interface OhmBL { /* getter für U,R,I */ }
class OhmBLBuilder
{
    /** ... throws IllegalArgumentException if ... something is 0 or so ...*/
    public static OhmBL createFromRU(int widerstand, int strom) { ... }
    public static OhmBL createFromUI(int strom, int spannung) { ... }
    public static OhmBL createFromRI(int widerstand, int spannung) { ... }

...
Kümmert sich um alles, kann nicht falsch verwendet werden... :bahnhof: Aber ist vielleicht nicht so wichtig...
 
B

bygones

Gast
Es ist sehr klar beschrieben, dass genau ein Feld leer, also 0, sein muss.
sagen wirs so, obs in der Doku irgendwo beschrieben ist - ist mir so ziemliech wurscht.

Es geht darum, dass man beim "auf den code schauen" sehen soll, was diese if abfrage erledigt - und da bin ich absolut der meinung das ist in keiner weise der fall. Mein Summenbeispiel basierte eben auf der annahme dass es summentechnisch machbar ist.

Dennoch bleib ich bei meiner meinung dass die sonstigen geposteten Antworten hier (außer marcos Builder, aber das ist ja schon ne weiterführung) es nicht schöner / besser machen
 

fleckdalm

Bekanntes Mitglied
Das war nur eine HÜ und wir sollten es so auf 2 Klassen aufteilen. Es ist möglich das das Beispiel nicht viel sinn macht aber es ist ja auch nur zur Übung.
Ich verstehe zwar (noch) nicht alles was ihr mir hier geschrieben habt aber einiges ist auch einleuchtend.
Also Danke für eure vielen Antworten!!
mfg Fleckdalm
 

Ähnliche Java Themen


Oben