Система банковских операций


Я надеялся, что кто-то может дать некоторую обратную связь относительно этого:

import java.util.InputMismatchException;
import java.util.Scanner;


public class Bank {

    protected double myBalance = 10.40;
    protected double bankBalance = 1000000;
    protected double creditRating = 0.1;
    private static final int PIN = 1234;
    boolean access = false;
    protected Scanner s = new Scanner(System.in);

    public Bank() {

        int pin = 0000;
        int option;

        System.out.print("Please enter your 4 digit pin code: ");
        try {
            pin = s.nextInt();
        } catch (InputMismatchException e) {
            System.out.print("Invalid character entered, bye bye...");
        }

        if (pin != PIN) {
            System.err.println("Incorrect PIN entered, please try again later.");
            System.exit(0);
        }
        access = true;
        System.out.println("Welcome to JCBank please choose from the following options");
        System.out.println();
        System.out.println("Withdraw (1)\tDeposit (2)\tCheck Balance (3)\tApply for Loan(4) \tQuit (5)");
        System.out.println();

        do {
            option = s.nextInt();
        } while(!selectOption(option));
    }

    public boolean selectOption(int option) {
        switch (option) {
            case 1:
                System.out.println("You would like to withdraw");
                System.out.println();
                break;
            case 2:
                System.out.println("You would like to Deposit");
                System.out.println();
                break;
            case 3:
                System.out.println("Your account balance is £" + myBalance);
                System.out.println();
                break;
            case 4:
                System.out.println("Please wait whilst we perform a credit check.");
                try {
                    checkCreditRating();
                } catch (InterruptedException e) {
                    System.out.println("How embarrassing, the system is currently unavailable. Try again later.");
                }
                System.out.println();
                break;
            case 5:
                System.out.println("Successfully logged out, see you soon!");
                System.out.println();
                return true;
            default:
                System.out.println("Invalid option, please choose another option.");
                System.out.println();
                return false;
        }
            System.out.println("Please choose another option.");
            return false;
    }

    public void deposit(double amount) {
        myBalance += amount;
    }

    public void withdraw(double amount) {
        if (myBalance > amount) {
            System.out.println("Your funds have been successfully withdrawn.");
        } else {
            System.out.println("You don't have the funds to complete this transaction");
        }
    }

    public void checkCreditRating() throws InterruptedException {
        Thread.sleep(1000);
        if (creditRating <= 0.0) {
            System.err.println("Sorry, we can't lend you any money at this time.");
            return;
        }

        System.out.print("Please enter your loan amount: ");
        double amount = s.nextDouble();
        if (amount > bankBalance) {
            System.err.println("We are unable to loan you such an amount.");
        }
        double amountToPayBack = (20/100)*amount;
        System.out.println("The amount to payback is " + amountToPayBack);
    }

    public double checkAccountBalance() {
        return myBalance;
    }
}


23616
12
задан 22 ноября 2011 в 07:11 Источник Поделиться
Комментарии
3 ответа

Ряд пунктов:


  • Не использовать типы данных с плавающей запятой (поплавок или двойные) для суммы денег. Вещественные типы данных имеют ограниченную точность, они не могут представлять все десятичные значения точно так же, и вы собираетесь получить округления ошибки рано или поздно. Использовать вместо целых чисел (тип int или длинный) и магазин Копейка вместо (например, 1040 центов) или использовать то bigdecimal.

  • Сделать член переменные частная по умолчанию; они защищены (или другой уровень доступа), если есть хорошая причина, чтобы сделать так.

  • Предпочитаю локальные переменные выше переменные-члены. Есть ли хорошая причина, почему С является членом переменной, а не локальной переменной?

  • Не писать основную часть программы в конструкторе класса. У вас есть основной частью вашей программы в конструкторе Банк класса. Конструктор предназначен для инициализации состояния нового объекта, так что единственное, что конструктор должен сделать, это инициализировать переменные-члены.

  • В ваш конструктор, вы поймете InputMismatchException и печатать сообщение об ошибке ("пока, пока..."), но на самом деле вы не вернувшихся из конструктора. Итак, выполнение будет продолжено и печати "неверный пин-код ввели...", который является не то, что ты имел в виду.

  • Программа на самом деле не делать то, что вы ожидаете это делать, вывод, депозит и т. д. функциональность никогда не вызывается в любом месте.

  • Вам нужен публичный статический пустота главный(строка[] args) метод, чтобы быть в состоянии запустить как отдельную программу.

16
ответ дан 22 ноября 2011 в 07:11 Источник Поделиться

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

Безопасность - ваша модель слабая, но очевидно, что это упражнение, так что давайте держать его простым (и я не эксперт по безопасности тоже!). Я хочу создать файл с учетными данными для каждого клиента, и класс, используемый для проверки подлинности пользователя, прежде чем делать что-нибудь, сказать аутентификатора.

Authenticator auth = new Authenticator();
Customer cust = null;

while (cust == null) {
System.out.println("Username: ");
String username = s.nextLine();
System.out.println("PIN: ");
int pin = s.nextInt();

cust = auth.authenticateCredentials(username, pin);
}

В authenticateCredentials() метод будет возвращать значение NULL, если учетные данные не совпадают ни по записи. Если было найдено совпадение, то будет возвращать записи о клиентах, которые соответствуют учетные данные для входа.

Очевидно, я многое, например, как сохранить клиента и логин, и организации отношений между клиентами и счетами. Я рекомендую вам заглянуть в коллекции класса для хранения списка счетов. У тебя хороший старт здесь, С много вы можете сделать, чтобы улучшить и добавить новые функции. Удачи в новом проекте!

10
ответ дан 23 ноября 2011 в 08:11 Источник Поделиться

Я бы сказал вместо:

if (pin != PIN) {
System.err.println("Incorrect PIN entered, please try again later.");
System.exit(0);
}
access = true;

использование :

if(pin == PIN){
access = true;
System.out.println("Welcome to JCBank please choose from the following options");
System.out.println();
System.out.println("Withdraw (1)\tDeposit (2)\tCheck Balance (3)\tApply for Loan(4) \tQuit (5)");
System.out.println();
}
else{
System.err.println("Incorrect PIN entered, please try again later.");
System.exit(0);
}

его гораздо более читабельным, я думаю.

3
ответ дан 23 ноября 2011 в 01:11 Источник Поделиться