Verbesserungsvorschläge

thelegend27

Aktives Mitglied
Hallo Forum,
Habe nun eure Verbesserungsvorschläge vom letzten Mal versucht umzusetzen. Ich würde mich nun über weitere Kritik/Verbesserungsvorschläge/etc. freuen.

Zum Programm:
Es soll eine Bank sein die über eine Gui den Benutzer ein Konto anlegen , sich darin einloggen, Geld darauf abheben/einzahlen und Geld überweisen lässt.

Hier die Klassen des Programms:

main-Klasse:
Java:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package finalgui2;

/**
*
* @author Ahmet
*/
public class FinalGUI2 {

    /**
     * @param args the command line arguments
     */

     public static void main(String[] args) {
        // TODO code application logic here
        Gui gui = new Gui();
        gui.setVisible(true);
    }
 
 
}

die Account-Klasse:
Java:
package finalgui2;

import java.io.Serializable;

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

/**
*
* @author Ahmet
*/
public class Account implements Serializable{

    private final String iban;
    private final String pin;
    private final String user;
    private double balance;

    Account(String ibn, String pn, String usr) {
        iban = ibn;
        pin = pn;
        user = usr;
        balance = 0;

    }

    public String getIban() {
        return iban;
    }

    public String getPin() {
        return pin;
    }

    public String getUser() {
        return user;
    }

    public double getBalance() {
        return balance;
    }

    public void deposit(double value) {
        balance += value;
    }

    public void withdraw(double value) {
        balance -= value;
    }

    public void transfer(Account reciever, double value) {
        this.withdraw(value);
        reciever.deposit(value);
    }

}
die AccountManager-Klasse:
Java:
package finalgui2;

import java.io.Serializable;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Ahmet
*/
public class AccountManager {

    public static AccountManager accMan = new AccountManager();
    private int regIndex;
    private int currAccount;
    private final ArrayList<Account> accounts;
    private boolean added;

    AccountManager() {
        if (SaveLoad.sl.checkFiles()) {
            if (SaveLoad.sl.loadAccounts() == null) {
                accounts = new ArrayList<>();
            } else {
                accounts = SaveLoad.sl.loadAccounts();
            }
            if (SaveLoad.sl.loadRegIndex() == -2) {
                regIndex = -1;
            } else {
                regIndex = SaveLoad.sl.loadRegIndex();
            }
            regIndex = SaveLoad.sl.loadRegIndex();
        } else {
            accounts = new ArrayList<>();
            regIndex = -1;
        }

    }
    public boolean getAdded(){
    return added;
    }

    public boolean addAccount(String usr) {
        added = true;
        boolean runned = false;
        if (!InputChecker.inCheck.checkForNumb(usr)) {
            String ibn, pin;
            if ((accounts.isEmpty()) || (findAccount(usr) < 0)) {
                ibn = String.valueOf((int) (Math.random() * (9999 - 1000) + 1000));
                pin = String.valueOf((int) (Math.random() * (9999 - 1000) + 1000));

            } else {
                do {
                    ibn = String.valueOf((int) (Math.random() * (9999 - 1000) + 1000));

                } while ((ibn.equals(accounts.get(findAccount(ibn)).getIban())));

                pin = String.valueOf((int) (Math.random() * (9999 - 1000) + 1000));
            }

            Account acc = new Account(ibn, pin, usr);
            accounts.add(acc);
            regIndex++;
            runned = true;
        }
        return runned;
    }

    public int findAccount(String iban) {
        int foundIndex = -1;
        for (Account acc : accounts) {
            if (acc.getIban().equals(iban)) {
                foundIndex = accounts.indexOf(acc);
            }
        }
        if (!(foundIndex >= 0)) {
            foundIndex = -1;
        }

        return foundIndex;
    }

    public String getIban(int indx) {
        return accounts.get(indx).getIban();
    }

    public String getPin(int indx) {
        return accounts.get(indx).getPin();
    }

    public int getRegIndex() {
        return regIndex;
    }

    public int tryLogin(String iban, String pin) {
        int indx = findAccount(iban);
        int state = 0;
        if (indx > -1) {
            if (accounts.get(indx).getIban().equals(iban) && accounts.get(indx).getPin().equals(pin)) {
                currAccount = indx;
                state = 1;
            } else if (!(accounts.get(indx).getPin().equals(pin))) {
                state = 3;
            }

        } else if (indx <= -1) {
            state = 2;
        }
        return state;

    }

    public String getBalance() {
        return Double.toString(accounts.get(currAccount).getBalance());
    }

    public ArrayList getAccounts() {
        return accounts;
    }

    public boolean deposit(String value) {
        boolean sucess;
        if (InputChecker.inCheck.checkDouble(value)) {
            accounts.get(currAccount).deposit(Double.parseDouble(value));
            sucess = true;
        } else {
            sucess = false;
        }

        return sucess;
    }

    public boolean withdraw(String value) {
        boolean sucess;
        if (InputChecker.inCheck.checkDouble(value)) {
            accounts.get(currAccount).withdraw(Double.parseDouble(value));
            sucess = true;
        } else {
            sucess = false;
        }
        return sucess;
    }

    public boolean tryTransfer(String reciever, String value) {
        boolean transSucess = false;
        int transIndx = findAccount(reciever);

        if (InputChecker.inCheck.checkTransfer(reciever, value)) {

            if (transIndx > -1) {
                transSucess = true;
                accounts.get(currAccount).transfer(accounts.get(transIndx), Double.parseDouble(value));
            }
        }
        return transSucess;
    }
}
die Gui-Klasse:
Java:
package finalgui2;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

class Gui extends JFrame implements ActionListener {

    JPanel homePan;
    JButton close;
    JLabel homeHeader;
    JButton login;
    JButton register;

    JPanel registerPan;
    JButton leaveReg;
    JLabel registerHeader;
    JTextField nameIn;
    JButton tryRegister;

    JPanel loginPan;
    JButton leaveLog;
    JLabel loginHeader;
    JLabel ibanPrompt;
    JTextField ibanIn;
    JLabel pinPrompt;
    JTextField pinIn;
    JButton tryLogin;

    JPanel loggedInPan;
    JButton leaveLogged;
    JLabel loggedHeader;
    JButton openCheck;
    JButton openWithdraw;
    JButton openDeposit;
    JButton openTransfer;

    JPanel checkPan;
    JButton leaveCheck;
    JLabel checkHeader;
    JTextField balanceOut;

    JPanel withdrawPan;
    JButton leaveWithdraw;
    JLabel withdrawPrompt;
    JTextField withdrawIn;
    JButton tryWithdraw;

    JPanel depositPan;
    JButton leaveDeposit;
    JLabel depositHeader;
    JTextField depositIn;
    JButton tryDeposit;

    JPanel transferPan;
    JButton leaveTransfer;
    JLabel transferHeader;
    JLabel transIbanPrompt;
    JTextField transIbanIn;
    JLabel transAmountPrompt;
    JTextField transAmount;
    JButton tryTransfer;

    JPanel mainPan;

    Gui() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Die Bank");
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setSize(screenSize);

        addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
        if (AccountManager.accMan.getAdded()) {
            SaveLoad.sl.save();
        }
    }
        });

        close = new JButton("Beenden");
        close.addActionListener(this);
        close.setActionCommand("close");
        homeHeader = new JLabel("Wilkommen in der Bank");
        login = new JButton("Einloggen");
        login.addActionListener(this);
        login.setActionCommand("login");
        register = new JButton("Registrieren");
        register.addActionListener(this);
        register.setActionCommand("register");
        homePan = new JPanel();
        homePan.add(close);
        homePan.add(homeHeader);
        homePan.add(login);
        homePan.add(register);
        homePan.setVisible(true);

        leaveReg = new JButton("<=");
        leaveReg.addActionListener(this);
        leaveReg.setActionCommand("leaveReg");
        registerHeader = new JLabel("Geben sie Ihren Namen ein, um sich zu registrieren");
        nameIn = new JTextField(15);
        tryRegister = new JButton("registrieren");
        tryRegister.addActionListener(this);
        tryRegister.setActionCommand("tryRegister");
        registerPan = new JPanel();
        registerPan.add(leaveReg);
        registerPan.add(registerHeader);
        registerPan.add(nameIn);
        registerPan.add(tryRegister);
        registerPan.setVisible(false);

        leaveLog = new JButton("<=");
        leaveLog.addActionListener(this);
        leaveLog.setActionCommand("leaveLog");
        loginHeader = new JLabel("Geben Sie ihre Kontonummer und PIN ein um sich anzumelden");
        ibanPrompt = new JLabel("Kontonummer:");
        ibanIn = new JTextField(6);
        pinPrompt = new JLabel("PIN: ");
        pinIn = new JTextField(6);
        tryLogin = new JButton("einloggen");
        tryLogin.addActionListener(this);
        tryLogin.setActionCommand("tryLogin");
        loginPan = new JPanel();
        loginPan.add(leaveLog);
        loginPan.add(loginHeader);
        loginPan.add(ibanPrompt);
        loginPan.add(ibanIn);
        loginPan.add(pinPrompt);
        loginPan.add(pinIn);
        loginPan.add(tryLogin);
        loginPan.setVisible(false);

        leaveLogged = new JButton("<=");
        leaveLogged.addActionListener(this);
        leaveLogged.setActionCommand("leaveLogged");
        loggedHeader = new JLabel("Wilkommen");
        openCheck = new JButton("Kontostand einsehen");
        openCheck.addActionListener(this);
        openCheck.setActionCommand("openCheck");
        openWithdraw = new JButton("Betrag abheben");
        openWithdraw.addActionListener(this);
        openWithdraw.setActionCommand("openWithdraw");
        openDeposit = new JButton("Betrag einzahlen");
        openDeposit.addActionListener(this);
        openDeposit.setActionCommand("openDeposit");
        openTransfer = new JButton("Betrag überweisen");
        openTransfer.addActionListener(this);
        openTransfer.setActionCommand("openTransfer");
        loggedInPan = new JPanel();
        loggedInPan.add(leaveLogged);
        loggedInPan.add(loggedHeader);
        loggedInPan.add(openCheck);
        loggedInPan.add(openWithdraw);
        loggedInPan.add(openDeposit);
        loggedInPan.add(openTransfer);
        loggedInPan.setVisible(false);

        leaveCheck = new JButton("<=");
        leaveCheck.addActionListener(this);
        leaveCheck.setActionCommand("leaveCheck");
        checkHeader = new JLabel("Ihr Kontostand beträgt: ");
        balanceOut = new JTextField(15);
        balanceOut.setEditable(false);
        checkPan = new JPanel();
        checkPan.add(leaveCheck);
        checkPan.add(checkHeader);
        checkPan.add(balanceOut);
        checkPan.setVisible(false);

        leaveWithdraw = new JButton("<=");
        leaveWithdraw.addActionListener(this);
        leaveWithdraw.setActionCommand("leaveWithdraw");
        withdrawPrompt = new JLabel("Geben Sie den Betrag an den Sie abheben möchten!");
        withdrawIn = new JTextField(10);
        tryWithdraw = new JButton("abheben");
        tryWithdraw.addActionListener(this);
        tryWithdraw.setActionCommand("tryWithdraw");
        withdrawPan = new JPanel();
        withdrawPan.add(leaveWithdraw);
        withdrawPan.add(withdrawPrompt);
        withdrawPan.add(withdrawIn);
        withdrawPan.add(tryWithdraw);
        withdrawPan.setVisible(false);

        leaveDeposit = new JButton("<=");
        leaveDeposit.addActionListener(this);
        leaveDeposit.setActionCommand("leaveDeposit");
        depositHeader = new JLabel("Geben Sie den Betrag an, den Sie einzahlen möchten!");
        depositIn = new JTextField(10);
        tryDeposit = new JButton("einzahlen");
        tryDeposit.addActionListener(this);
        tryDeposit.setActionCommand("tryDeposit");
        depositPan = new JPanel();
        depositPan.add(leaveDeposit);
        depositPan.add(depositHeader);
        depositPan.add(depositIn);
        depositPan.add(tryDeposit);
        depositPan.setVisible(false);

        leaveTransfer = new JButton("<=");
        leaveTransfer.addActionListener(this);
        leaveTransfer.setActionCommand("leaveTransfer");
        transferHeader = new JLabel("Geben sie den Empfänger und den Betrag der Überweisung an!");
        transIbanPrompt = new JLabel("Kontonummer des Empfängers: ");
        transIbanIn = new JTextField(6);
        transAmountPrompt = new JLabel("Betrag: ");
        transAmount = new JTextField(6);
        tryTransfer = new JButton("überweisen");
        tryTransfer.addActionListener(this);
        tryTransfer.setActionCommand("tryTransfer");
        transferPan = new JPanel();
        transferPan.add(leaveTransfer);
        transferPan.add(transferHeader);
        transferPan.add(transIbanPrompt);
        transferPan.add(transIbanIn);
        transferPan.add(transAmountPrompt);
        transferPan.add(transAmount);
        transferPan.add(tryTransfer);
        transferPan.setVisible(false);

        mainPan = new JPanel();
        mainPan.add(homePan);
        mainPan.add(registerPan);
        mainPan.add(loginPan);
        mainPan.add(loggedInPan);
        mainPan.add(checkPan);
        mainPan.add(withdrawPan);
        mainPan.add(depositPan);
        mainPan.add(transferPan);
        add(mainPan);

    }



    public void actionPerformed(ActionEvent evt) {
        /*
    
                        homeScreen
    
         */
        if (evt.getActionCommand().equals("close")) {
            if (AccountManager.accMan.getAdded()) {
                SaveLoad.sl.save();
            }
            System.exit(0);

        } else if (evt.getActionCommand().equals("register")) {
            homePan.setVisible(false);
            registerPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("login")) {
            homePan.setVisible(false);
            loginPan.setVisible(true);
            validate();
            /*
    
                            loggedIn
    
             */
        } else if (evt.getActionCommand().equals("openCheck")) {
            loggedInPan.setVisible(false);
            checkPan.setVisible(true);
            balanceOut.setText(AccountManager.accMan.getBalance());
            validate();
        } else if (evt.getActionCommand().equals("openWithdraw")) {
            loggedInPan.setVisible(false);
            withdrawPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openDeposit")) {
            loggedInPan.setVisible(false);
            depositPan.setVisible(true);
            validate();

        } else if (evt.getActionCommand().equals("openTransfer")) {
            loggedInPan.setVisible(false);
            transferPan.setVisible(true);
            validate();
            /*
    
                            try-Buttons
    
             */
        } else if (evt.getActionCommand().equals("tryRegister")) {
            if (AccountManager.accMan.addAccount(nameIn.getText())) {
                JOptionPane.showOptionDialog(null, "Ihre Kontonummer lautet: " + AccountManager.accMan.getIban(AccountManager.accMan.getRegIndex()) + "\n"
                        + " Ihre PIN lautet: " + AccountManager.accMan.getPin(AccountManager.accMan.getRegIndex()),
                        "Registration erfolgreich", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
            }
        } else if (evt.getActionCommand().equals("tryLogin")) {
            int state = AccountManager.accMan.tryLogin(ibanIn.getText().trim(), pinIn.getText().trim());
            switch (state) {
                case 0:
                    JOptionPane.showOptionDialog(null, "Bug",
                            "Bug", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                    break;
                case 1:
                    loginPan.setVisible(false);
                    loggedInPan.setVisible(true);
                    validate();
                    break;
                case 2:
                    JOptionPane.showOptionDialog(null, "Das Konto auf das Sie zugreifen wollen konnte nicht gefunden werden!",
                            "Konto nicht gefunden", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                    break;
                default:
                    JOptionPane.showOptionDialog(null, "Der PIN-Code stimmt nicht mit der Kontonummer überein!",
                            "PIN-Code falsch", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                    break;
            }

        } else if (evt.getActionCommand().equals("tryWithdraw")) {
            if (AccountManager.accMan.withdraw(withdrawIn.getText().trim())) {
                JOptionPane.showOptionDialog(null, "Der Betrag wurde erfolgreich abgehoben",
                        "Auszahlung erfolgreich", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                withdrawIn.setText("");
                validate();
            }

        } else if (evt.getActionCommand().equals("tryDeposit")) {
            if (AccountManager.accMan.deposit(depositIn.getText().trim())) {
                JOptionPane.showOptionDialog(null, "Der Betrag wurde erfolgreich eingezahlt",
                        "Einzahlung erfolgreich", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                depositIn.setText("");
                validate();
            }

        } else if (evt.getActionCommand().equals("tryTransfer")) {
            if (AccountManager.accMan.tryTransfer(transIbanIn.getText().trim(), transAmount.getText().trim())) {
                JOptionPane.showOptionDialog(null, "Überweisung erfolgriech!!", "Überweisung erfolgreich!", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                transIbanIn.setText("");
                transAmount.setText("");
            }

        } /*
    
                            leave-Buttons
    
         */ else if (evt.getActionCommand().equals("leaveReg")) {
            if (evt.getActionCommand().equals("leaveReg")) {
                registerPan.setVisible(false);
            }
            homePan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveLog")) {
            loginPan.setVisible(false);
            homePan.setVisible(true);
        } else if (evt.getActionCommand().equals("leaveLogged")) {
            loggedInPan.setVisible(false);
            homePan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveCheck")) {
            checkPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveWithdraw")) {
            withdrawPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveDeposit")) {
            depositPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveTransfer")) {
            transferPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        }
    }
}
die InputChecker-Klasse:
Java:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package finalgui2;

import javax.swing.JOptionPane;

/**
*
* @author Ahmet
*/
public class InputChecker {

    public static InputChecker inCheck = new InputChecker();

    public boolean checkForNumb(String toCheck) {
        boolean contains = false;
        char[] numbers = {'0', '1', '2', '3', '4', '5', '6', '8', '9'};
        for (int i = 0; i < numbers.length; i++) {
            if (toCheck.contains(Character.toString(numbers[i]))) {
                contains = true;
                JOptionPane.showOptionDialog(null, "Ihr Name darf keine Zahlen enthalten", "Eingabe ungültig", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                break;
            }
        }

        return contains;
    }

    public boolean checkDouble(String numb) {
        boolean isNumb = true;
        try {
            Double.parseDouble(numb);
        } catch (Exception e) {
            isNumb = false;
            JOptionPane.showOptionDialog(null, "Eingabe ungültig", "Eingabe ungültig", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
        }
        return isNumb;
    }

    public boolean checkTransfer(String reciever, String value) {
        boolean correctData = true;
        if (AccountManager.accMan.findAccount(reciever) < 0) {
            correctData = false;
            JOptionPane.showOptionDialog(null, "Empfängerkonto nicht gefunden", "Eingabe ungültig", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
        }
        if (checkDouble(value) == false) {
            correctData = false;
        }
        return correctData;

    }
}
die SaveLoad-Klasse:
Java:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package finalgui2;

import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
*
* @author Ahmet
*/
public class SaveLoad {
final private String accountsDirect = "finalgui2_accounts.ser";
final private String regIndexDirect = "regIndex.ser";
    static SaveLoad sl = new SaveLoad();

    public void save() {
        ObjectOutputStream oos = null;
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(new File(accountsDirect));
            oos = new ObjectOutputStream(fos);
            oos.writeObject(AccountManager.accMan.getAccounts());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                }
            }
        }

        try {
            fos = new FileOutputStream(new File(regIndexDirect));
            oos = new ObjectOutputStream(fos);
            oos.writeInt(AccountManager.accMan.getRegIndex());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                }
            }
        }

    }

    public ArrayList loadAccounts() {
        ArrayList<Account> accounts = null;
        try {
            FileInputStream fin = new FileInputStream(accountsDirect);
            ObjectInputStream ois = new ObjectInputStream(fin);
            accounts = (ArrayList) ois.readObject();

            ois.close();
            fin.close();
        } catch (Exception e) {

        }
        return accounts;
    }

    public int loadRegIndex() {
        int regIndex = -2;
        try {
            FileInputStream fis = new FileInputStream(regIndexDirect);
            ObjectInputStream ois = new ObjectInputStream(fis);

            {
                regIndex = (int) ois.readInt();

                ois.close();
                fis.close();

            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return regIndex;
    }

    public boolean checkFiles() {
        boolean found = true;
        try {
            FileInputStream fin = new FileInputStream(accountsDirect);
            ObjectInputStream ois = new ObjectInputStream(fin);
            ois.close();
            fin.close();
        } catch (FileNotFoundException fnf) {
            found = false;

        } catch (Exception e) {

        }
        try {
            FileInputStream fin = new FileInputStream(regIndexDirect);
            ObjectInputStream ois = new ObjectInputStream(fin);
            ois.close();
            fin.close();
        } catch (FileNotFoundException fnf) {
            found = false;

        } catch (Exception e) {

        }
        return found;
    }

}
Mfg
thelegend27
 

mrBrown

Super-Moderator
Mitarbeiter
Nur ganz kurz:

Zur GUI:
Ich finde die GUI-Klasse deutlich zu groß, da kann man sicher mehrere einzelne raus machen ;)
Außerdem würde ich nicht JFrame extenden, sondern nur nutzen.

Zu Account:
Den Kontostand würde ich nicht als double (generell eine schlechte Idee wegen Rundungsfehlern, wenn dann Integer und in Centbeträgen oder gleich BigDecimal nutzen), sondern als Menge von Transaktionen speichern.
Aus allen Transaktionen zusammen ergibt sich dann der Kontostand.
 

mrBrown

Super-Moderator
Mitarbeiter
Zu Account hatte ich ja schon was gesagt

AccountManager:
  • public static AccountManager accMan = new AccountManager();: Singelton Patten würde ich vermeiden. Besser ists, einmal eine Instanz zu erstellen, und die an die nötigen Stellen weiterzuleiten
  • private int currAccount würde ich vermeiden. AccountManager ist ja in etwa das Äquivalent zu einer Bank - kennt eine Bank genau einen aktuellen Account? ;) Besser wäre es, wenn die GUI über den aktuellen Account bescheid weiß, und nicht der AccountManager ;)
  • private int regIndex: das gleiche wie drüber ;) Das registrieren kann doch einfach den neuen Account zurückgeben.
  • AccountManager(): Einen Konstruktor, der direkt Dinge aus Dateien lädt, würde ich vermeiden. Besser wäre es, wenn der Konstruktor einfach einen neuen (leeren) AccountManager erstellt, und das Laden und Speichern gibt es zusätzlich als Möglichkeit - würde ich dann aber so umsetzten, das das Laden einen AccountManager lädt und zurückgibt, und nicht vom AccountManager aus.
  • In addAccount: auf den runned-Boolean würde ich verzichten - stattdessen einfach den Account zurückgeben (und für einen nicht-erstellten entweder null oder besser eine Exception).
  • In addAccount: Die IBANs könntest du statt zufällig erstellt einfach hochzählen - und das ganze uU in einen IbanGenerator auslagern ;)
  • findAccount: warum gibt das denn umständlich den Index und nicht den Account zurück? Das würde das an vielen Stellen deutlich leichter machen ;)
  • getIban und getPin wären dann überflüssig
  • Zu tryLogin:
    • Was ist denn dieser ominöse state? Wenn du den brauchst, würde ich dafür einen Enum nutzen
    • Ich würde das eher einen Account zurückgeben lassen, und wenn keiner gefunden wird, eine Exception schmeißen (oder in Richtung funktional und Either gehen)
  • deposit würde ich einen Account und den Betrag übergeben, statt nur den Betrag. Betrag würde ich als Zahl übergeben, und das Parsen in der Gui machen
  • Für withdraw gilt das gleiche
  • Für tryTransfer auch. Beide beteiligten Accounts und Betrag als Argument übergeben, und wenn was schiefgeht Exception


Reicht das fürs Erste? :p :D

Die Benennung der Methoden etc und den reinen Stil finde ich zum Großteil gar nicht mal so schlecht ;)
 

AndiE

Top Contributor
Ich habe mir den Code mal angesehen, und meine, dass die Aussagen von mrBrown es im wesentlichen sagen. Ich würde mir wünschen, dass du zuerst die Gui-Klasse teilst.
 

thelegend27

Aktives Mitglied
Danke sehr fürs Feedback ! Werde versuchen es umzusetzen

public static AccountManager accMan = new AccountManager();: Singelton Patten würde ich vermeiden. Besser ists, einmal eine Instanz zu erstellen, und die an die nötigen Stellen weiterzuleiten
Darf ich fragen wieso man das vermeiden sollte? Außerdem: Wie gebe ich eine Instanz weiter? Dachte das geht nur auf die Weise.

Mfg
thelegend27
 

AndiE

Top Contributor
Ich würde vielleicht dieses Vorgehen empfehlen:
Java:
public class Bank{

public Bank(){ //Konstruktor

}

public main(){
Anzeige anz= new Anzeige(); // GUI
AcoountMamager acm= new Accountmanager();
acm.init();
anz.start(acm);
}

}
Außerdem würde ich für ein Frame verschieden Klassen Pane anlegen. Wobei ich "Frame f =new frame()," schreiben würde, und nicht von Frame erben. Das ist zwar etwas mehr Schreibarbeit, macht den Code aber nachvollziehbarer, finde ich. Mit den Pane-Klassen hast du die ActionListener da drin. Günstig wären noch Controller-Klassen, deren Methoden von den actionPerformed-Methoden aufgerufen werden. Dann hast du die Anzeige und die Verarbeitung getrennt. Das macht den Code wartbarer und übersichtlicher.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich würde vielleicht dieses Vorgehen empfehlen:
Java:
public class Bank{

public Bank(){ //Konstruktor

}

public main(){
Anzeige anz= new Anzeige(); // GUI
AcoountMamager acm= new Accountmanager();
acm.init();
anz.start(acm);
}

}
Warum nicht viel einfacher sorum:
Code:
public main(){
  AcoountMamager acm= new Accountmanager();
  Anzeige anz= new Anzeige(acm); // GUI
}
Außerhalb von nem Framework würd ich soweit möglich auf irgendwelche init/start/whatever verzichten
 

mrBrown

Super-Moderator
Mitarbeiter
Ich finde, dass der Konstruktor für die statische Konstruktion der Objekte zuständig ist.
Der ist für das Erstellen eines validen Objekts zuständig - wenn das danach noch gesondert initialisiert werden muss, ist das offensichtlich nicht der Fall.
Für mich ist ein nötiges init nur Zeichen von schlechtem Design.
 

AndiE

Top Contributor
Ich denke, das so, dass der Konstruktor einen leeren Account-Manager erstellt. Da dieser nun mit der Historie gefüllt werden soll, würde ich das mit "init" machen. Ich finde es wie geschrieben, unschön, die Bearbeitung aus dem Konstruktor zu starten. Typischerweise würde ich sogar eine "exit"-Methode schreiben, die die aktualisierten Daten den Datenträger zurückschreibt.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich denke, das so, dass der Konstruktor einen leeren Account-Manager erstellt.
Wenn der dann in einem validen und benutzbaren Zustand ist, ist das auch völlig richtig so.

Ich finde es wie geschrieben, unschön, die Bearbeitung aus dem Konstruktor zu starten.
Ich auch, aber der AccountManager startet keine Bearbeitung (was soll damit überhaupt gemeint sein?).

Da dieser nun mit der Historie gefüllt werden soll, würde ich das mit "init" machen.
Sowas würde ich ganz explizit machen - entweder über ein Laden-Funktion oder Factory/Repository-mäßig. Aber nicht versteckt hinter einer init, bei der niemand weiß, was gemeint ist, und die garantiert irgendwann vergessen wird zu benutzen. Gleiches fürs Speichern.

Speichern und exit bzw Laden und init sind doch unterschiedliche Dinge...
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben