Банк приложение в Java


Я новичок в Java. Я просто сделал это приложение, и я ищу других разработчиков мнение. Что вы думаете о моей структуре кода? Что я могу делать больше, чтобы улучшить это приложение.

public class Account {

    String name;
    int balance = 1000;

    //construct
    public Account(String myName, int myBalance) {
        this.name = myName;
        this.balance = myBalance;
    }

    public String getName() {
        return name;
    }

    public int getBalance() {
        return balance;
    }

    public String displayBalance(int pinNumber) {
        if (pinNumber == myPinCode()) {
            return "Your balance is " + balance + " dollars";
        } else {
            return pinError();
        }
    }

    public String deposite(int pinNumber, int amount) {
        if (pinNumber == myPinCode()) {
            balance += amount;
            return "you deposite " + amount + " and your balance is now " + balance + " dollars";
        } else {
            return pinError();
        }

    }

    public String withdraw(int pinNumber, int amount) {
        if (pinNumber == myPinCode()) {
            balance -= amount;
            return "you withdraw " + amount + " and your balance is now " + balance + " dollars";
        } else {
            return pinError();
        }

    }

    private int myPinCode() {
        int myPin = 1234;
        return myPin;
    }

    private String pinError() {
        String errorMessage = "You have enter the rong pin number!";
        return errorMessage ;
    }


    public static void main(String[] args) {
        Account person1 = new Account("Emerson", 10000);
        String myName = person1.getName();
        String myAccountBalance = person1.displayBalance(1234);
        String newAccountBalance = person1.deposite(1234,500);
        String withdrawFromAccount = person1.withdraw(1234,250);

        System.out.println(myName);
        System.out.println(newAccountBalance);
        System.out.println(withdrawFromAccount);
    }

}


1065
2
задан 8 февраля 2018 в 03:02 Источник Поделиться
Комментарии
3 ответа

Ваши переменные не частная. Это означает, что кто-то в тот же пакет, а также подклассы могут изменить баланс счета, без его ведома.


Вместо того, чтобы думать о банковском счете в баланс и некоторые операции на нем, рассматривать его как список депозитов и вывода средств, из которых вы рассчитайте свой текущий баланс. В реальный банковский счет, вы можете посмотреть в истории операций, и даже отменить их в некоторых случаях.


Счет в банке не имеет имени. Вместо этого у клиента есть имя, к которому принадлежит учетная запись. Клиент может иметь несколько банковских счетов.


Ваш банковский счет поддерживает только доллары, как баланс. Он не может иметь 13 долларов и 37 центов, например. Однако, обратите внимание, что деньги не должны быть представлены как числа с плавающей точкой. Вместо этого вы должны использовать int (или long) представлять центов, а затем вычислить долларах и центах от этого. В реальной банковской приложение, вы можете даже использовать миллионной доли процента, как ваш нормализованной шкалы.


Счет не нужен способ для отображения баланса. У вас уже есть метода getbalance(), а банкомат отвечает за отображение его.

Кроме того, displayBalance не отображается баланс. Вместо этого он возвращает строку. Имена методов должны описать то, что метод (или иногда то, что он возвращает) как можно точнее, но они никогда не должны говорить, что они делают то, что они действительно не делают.


Вместо

int myPin = 1234;
return myPin;

Вобще

return 1234;

Это короче и более читабельным.
Однако в данном случае, это фактически имеет смысл, чтобы это было частное поле.


Вы возвращаете строки, которые названы ошибки. Однако это не совсем ошибка. Ошибка чему-то более серьезному. Вы могли бы назвать это ошибкой, если банкомат не может подключиться к сети. Но это не работа счета.

Какой метод pinError возвращается на самом деле incorrectPinMessage. Как с помощью пин-кода, это может быть просто частное поле, потому что метод на самом деле не делать ничего. Делая это поле также позволяет легко изменить сообщение, если вы решите, что другое сообщение было бы более уместным.

Также учетная запись не должна знать о послании, которое отображается, когда клиент вводит неверный пин-код. Это также работа банкомата.


Счет не должен иметь метод main. Вместо метода main должно быть в главном классе банковского программного обеспечения, и учетная запись должны быть созданы и использованы ею.


Моя версия

Ниже моя версия вашего банковского счета класса, с членами удален, я считаю, не должны быть частью класса account. Кроме того, я добавил интерфейс Transaction С двумя реализациями Withdrawal и Deposit. Оба являются неизменными (то есть они не могут быть изменены, ни через прямой доступ, ни методов). Обратите внимание, что они не будут реализованы, а что вы обычно склонны рассматривать в качестве сделки, но это должно дать подсказку о том, в каком направлении класса мог пойти.

public interface Transaction {
public int getDeltaCents();
}

public class Withdrawal implements Transaction {
private int deltaCents;

public Withdrawal(int cents) {
deltaCents = - cents;
}

public int getDeltaCents() {
return deltaCents;
}
}

public class Deposit implements Transaction {
private int deltaCents;

public Withdrawal(int cents) {
deltaCents = cents;
}

public int getDeltaCents() {
return deltaCents;
}
}

public class Account {
private int pin;
private List<Transaction> transactions = new ArrayList<Transaction>();

public Account(int pin) {
this.pin = pin;
}

// Allow reading balance without PIN, but not writing.
public int getBalanceCents() {
int balance = 0;
for (Transaction t : transactions) {
balance += t.getDeltaCents();
}
return balance;
}

// Return a boolean instead of a string.
// Let the application handle a wrong PIN.
public boolean deposite(int pin, int cents) {
if (this.pin != pin) { return false; }
Transaction t = new Deposit(cents);
transactions.add(t);
return true;
}

// Return a boolean instead of a string.
// Let the application handle a wrong PIN.
public boolean withdraw(int pin, int cents) {
if (this.pin != pin) { return false; }
Transaction t = new Withdrawal(cents);
transactions.add(t);
return true;
}
}

3
ответ дан 8 февраля 2018 в 04:02 Источник Поделиться

Лишь немногие качества жизни меняется с верхней части моей головы:

Установить PIN-код, значения сообщение об ошибке, как заключительные элементы в отдельный класс, вместо жесткого кодирования их в методы.

Вы также можете изменить все возвращенные строки закрытые члены класса с заполнителями, а затем назвать их в их соответствующих методов, используя строку.формат():

Поэтому вместо того, чтобы:

return "Your balance is " + balance + " dollars";

Вы могли бы иметь:

private final String BALANCE_MESSAGE = "Your balance is {} dollars."; // place at the top of your class next to other members.
// ...
return String.format(BALANCE_MESSAGE, balance); // new return value in your displayBalance() method

Это позволит очистить ваши методы немного.

0
ответ дан 8 февраля 2018 в 04:02 Источник Поделиться

Некоторые предложения размещены как комментарии в коде ниже:

// are you fine subclassing this Account class ? if not then declare this class as final.
public class Account {

private final String name;
// variable should be private. declaring variables final forces you to initialize it in constructor.
private double balance = 1000; // add a comment that default value would be 1000. Also consider a double datatype.
private final int pin;

// add final to param.
// name & balance are more professional naming than
public Account(final String name, final double balance, final int pin) {
this.name = name;
this.balance = balance;
// checks if pin has only 4 digits. else throw an exception.
this.pin = pin;
}

public String getName() {
return name;
}

//
// public double getBalance() {
// return balance;
// }

public String displayBalance(int pinNumber) {
if (pinNumber == pin) {
return "Your balance is " + balance + " dollars";
} else {
return pinError();
}
}

// typo in spelling deposite
// use synchronized to guard against race conditions.
public synchronized String deposit(int pinNumber, double amount) {
if (pinNumber == pin) {
balance += amount;
return "you deposite " + amount + " and your balance is now " + balance + " dollars";
} else {
// throw an exception instead of returning a string.
return pinError();
}

}

// use synchronized to guard against race conditions.
public synchronized String withdraw(int pinNumber, double amount) {
if (pinNumber == pin) {
balance -= amount;
return "you withdraw " + amount + " and your balance is now " + balance + " dollars";
} else {
// throw an exception instead of returning a string.
return pinError();
}

}
// you dont need this method.
// private int myPinCode() {
// int myPin = 1234;
// return myPin;
// }

private String pinError() {
// you could have a static variable storing this string.
return "You have enter the wrong pin number!";
}

}

0
ответ дан 10 февраля 2018 в 10:02 Источник Поделиться