Erste Schritte Feedback zum ersten Anfängerprogramm

Jack84

Mitglied
Hallo alle miteinander 🙂

ich habe beschlossen Java programmieren zu lernen und bin gerade dabei das bisher gelernte an einem einfach Beispiel - einem Taschenrechner - umzusetzen. Ich würde mich sehr freuen wenn jemand einen Blick drauf werfen könnte und mir anschließend etwas Feedback gibt z. B. was gut und was weniger gut ist. Vielen Dank dafür schon mal im Voraus.

Ach ja, die innere Klasse hat nichts weiter zu bedeuten. Ich wollte es einfach mal ausprobieren.

Java:
package calc.main;

import java.util.Scanner;

public class tr {

    public static void main(String[] args) {

        new Rechner();
    }

}

class Rechner{
    private double erg;
    private String operator;
    Scanner eingabe = new Scanner(System.in);

    Rechner() {
        zahlEingeben();
    }
  
    private void zahlEingeben() {
        System.out.print("Zahl eingeben: ");
        erg = eingabe.nextDouble();
        operatorEingeben();
    }
  
    private void operatorEingeben() {
        System.out.print("Rechenoperator: ");
        operator = eingabe.next();
        calculate();
    }
  
    private void calculate() {
        switch(operator) {
        case "+":
            addiere(zweiteZahl());
            break;
        case "-":
            subtr(zweiteZahl());
            break;
        case "*":
            multpl(zweiteZahl());
            break;
        case "/":
            divid(zweiteZahl());
            break;
        case "=":
            System.out.println("Ergebnis: -> " + erg);
            break;
        default:
            System.out.println("fehler");
        }
        System.out.println("Ergebnis: -> " + erg);
        operatorEingeben();
    }
  
    private double zweiteZahl() {
        System.out.print("nächste Zahl eingeben: ");
        return eingabe.nextDouble();
    }
  
    private void addiere(double zahl) {
        erg = erg + zahl;
    }
  
    private void subtr(double zahl) {
        erg = erg - zahl;
    }
  
    private void multpl(double zahl) {
        erg = erg * zahl;
    }
  
    private void divid(double zahl) {
        erg = erg / zahl;
    }  
}
 
Das ist der Ablauf der Eingabe:

Zahl
Rechenoperator
nächste Zahl
Rechenoperator
nächste Zahl
Rechenoperator
nächste Zahl
...

Ich habe also nie wieder die Möglichkeit, die erste Zahl einzugeben.
 
+ ordentlich formatierter Quelltext
+ Aufteilung auf verschiedene Funktionen
+ ganz gute Namensgebung

- Ablauf startet im Konstruktor des Rechners
- Die Funktionen "zahlEingeben" und "operatorEingeben" und auch "calculate" machen mehr als der Name vorgibt, tatsächlich steckt die gesamte Ablauflogik darin verteilt.
- Verteilte Ablauflogik. Besser wäre es dem Rechner eine Funktion z.B. "start()" zu spendieren und dort den Ablauf in einer Schleife zu realisieren.
 
Erst einmal vielen Dank für euer Feedback. Ich hätte da jetzt aber ein paar Rückfragen dazu:

@krgewb
Dein Einwand war durchaus berechtigt. So wie das Programm jetzt aufgebaut ist, lässt es sich nicht von neuem starten. Es muss also jedes mal beendet und anschließend neu gestartet werden. Das ist eine Funktion die ich noch einbauen muss.

@temi
Warum ist es schlecht Programmbeginn aus dem Konstruktor heraus zu starten? Und wie würde so eine Start Methode aussehen? Würde diese nicht ebenfalls "nur" die Methode zahlEingeben() enthalten? Anschließend rufen sich die Methoden doch gegenseitig auf. Oder hab ich das missverstanden?
 
Warum ist es schlecht Programmbeginn aus dem Konstruktor heraus zu starten?
Ich halte das nicht für günstig, weil der Sinn des Konstruktors, wie der Name schon sagt, die Erzeugung eines Objektes ist. Für den Anwender der Klasse ist es dann überraschend, wenn damit gleich das Programm gestartet wird.
Java:
public static void main(String[] args) {
        Rechner rechner = new Rechner();
        rechner.start();
}

Würde diese nicht ebenfalls "nur" die Methode zahlEingeben() enthalten? Anschließend rufen sich die Methoden doch gegenseitig auf.
In diesem Fall würde die Methode zahlEingeben() genügen, aber ich finde deine Lösung nicht gelungen, weil die Methoden mehr tun, als ihr Name verspricht und durch diese Verschachtelung, der Code nicht sehr eingängig ist.
Besser wäre z.B. etwas in dieser Art:
Java:
public void start(){
     ersteZahlEingeben();
     while(operatorEingeben()){
          weitereZahlEingeben();
     }
     ergebnis();
}
 
Nochmals vielen Dank für das Feedback. Ich möchte als nächstes einen grafischen Taschenrechner basteln und da würde ich versuchen deine Vorschläge umzusetzen. 🙂
 

Zurück
Oben