Java simpler calculator..?

09/22/2016 11:20 AR0K#1
Moin ich habe ne richtig schlechte Aufgabenstellung erhalten und soll diese nun machen.

Quote:
Aufgabe:

Erstelle die Klasse Calculator:

Attribute int a,b (mit getter und setter)
Methode calculate(int type)
für type gibt es den Wert ADD oder SUB

Erstelle eine main-Methode um die Klasse zu testen
So wie ich die Aufgabe verstehe, erhält man 3 Eingaben,
2 Zahlen und die Aktion dazu. Nun soll ich mit den 2 Zahlen
ein Calculator Objekt erstellen welches im Konstruktor zwei
Int erwartet, diese werden via set-Methoden als a und b festgelegt.
Danach soll die Methode calculate() aufgerufen werden mit einer
Kennzeichnung welche Rechnung zutun ist.
Diese holt sich via get-Methoden die beiden Werte a und b und
berechnet diese entsprechend des Parameters und gibt das Ergebnis zurück.


Meine Frage ist, wie sieht die Methode calculate() aus, kann mir jmd erklären wie ich jetzt add und sub kennzeichne?
09/22/2016 13:05 algernong#2
Da type vom Typ int ist, kannst du natürlich nur Zahlen übergeben, zum Beispiel "0" für "ADD" und "1" für "SUB".

Eine erste Version könnte also so aussehen:
Code:
public int calculate(int type) {
    if (type == 0) { 
        return a + b;
    } else if (type == 1) {
        return a - b;
    } else { 
        // Fehlerbehandlung, z.B. IllegalArgumentException werfen 
    }
}
Natürlich kannst du statt if/else auch switch/case nehmen.

So ist der Code aber noch schlecht, denn ein Aufruf meinCalc.calcuate(0); sagt einer zweiten Person (die die Funktion calculate() nicht selber geschrieben hat) überhaupt nichts. Für was soll die "0" stehen?
Solche Zahlen nennt man auch "Magic Numbers". Das sind in diesem Kontext also Zahlen mit einer ganz bestimmten Bedeutung, die aber nicht ersichtlich ist.

Lösung: Konstanten für 0 (ADD) und 1 (SUB) einführen. Zuerst deklarierst du also zwei neue Attribute mit den Modifiers public, final und static:
Code:
public static final int ADD = 0;
public static final int SUB = 1;
Dann ersetzt du die Zahlen 0 und 1 einfach durch die Konstanten also
Code:
public int calculate(int type) {
    if (type == ADD) {
        return a + b;
    } else if (type == SUB) {
        return a - b;
    } else {
        // Fehlerbehandlung
    }
}
und verwendest die Konstanten auch bei jedem Aufruf, also zum Beispiel
Code:
meinCalc.calculate(Calculator.ADD);
09/24/2016 20:59 Garuga#3
algernog hat bereits eine gute Lösung vorgestellt.

Im letzten Satz der Aufgabe taucht "testen" auf. Nun ist die Frage, sollt ihr JUnit Tests benutzen oder lediglich eine einfache Ausgabe erzeugen?


Wenn ihr JUnit benutzen sollt, dann kannst du beispielsweise auf "assertTrue(boolesche Bedingung)" zurückgreifen um deine Ergebnisse zu validieren. In der main-Methode sollte also am Ende sowas wie hier stehen:
Code:
assertTrue(20 == meinCalc.calculate(ADD));
assertTrue(4 == meinCalc.calculate(SUB);
Ansonsten solltest du zumindest mehr Informationen in der Konsole ausgeben damit überhaupt ersichtlich wird, was du addierst oder subtrahierst.
Code:
System.out.println("12+8 = " + meinCalc.calculate(ADD));
System.out.println("12-8 = " + meinCalc.calculate(SUB));
EDIT: Der Threadkürzel JS steht für JavaScript. Das hat nicht annäherend mit Java zu tun ;)
09/27/2016 18:29 algernong#4
Ich würde statt assertTrue() direkt assertEquals() verwenden, denn dann wird bei einem Fehler automatisch ausgegeben, welcher Wert erwartet und welcher tatsächlich berechnet wurde.
So spart man sich die manuelle Ausgabe.
10/01/2016 09:19 XYZ-Cannon#5
Quote:
Originally Posted by Garuga View Post
algernog hat bereits eine gute Lösung vorgestellt.

Im letzten Satz der Aufgabe taucht "testen" auf. Nun ist die Frage, sollt ihr JUnit Tests benutzen oder lediglich eine einfache Ausgabe erzeugen?


Wenn ihr JUnit benutzen sollt, dann kannst du beispielsweise auf "assertTrue(boolesche Bedingung)" zurückgreifen um deine Ergebnisse zu validieren. In der main-Methode sollte also am Ende sowas wie hier stehen:
Code:
assertTrue(20 == meinCalc.calculate(ADD));
assertTrue(4 == meinCalc.calculate(SUB);
Ansonsten solltest du zumindest mehr Informationen in der Konsole ausgeben damit überhaupt ersichtlich wird, was du addierst oder subtrahierst.
Code:
System.out.println("12+8 = " + meinCalc.calculate(ADD));
System.out.println("12-8 = " + meinCalc.calculate(SUB));
EDIT: Der Threadkürzel JS steht für JavaScript. Das hat nicht annäherend mit Java zu tun ;)
In der Aufgabe wird nirgends nach J-Unit Tests gefragt. Wäre auch bisschen oversized.
"Erstelle eine main-Methode um die Klasse zu testen."

Damit wird das einfache Aufrufen der calculate Methode (mit den Parametern Add/Sub) über die main Methode gemeint sein.