首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java 11中的简单银行程序- OOP原理

Java 11中的简单银行程序- OOP原理
EN

Code Review用户
提问于 2020-05-09 11:57:00
回答 2查看 5.9K关注 0票数 3

我创建了一个简单的银行程序。该程序要求用户的名称和起始余额。从那里,用户可以做4件事,检查余额,增加资金,转移资金和退出程序。Check Balance只需返回用户的姓名和帐户中剩余的资金。增加资金,要求用户在他的帐户中存入一个金额。转帐资金要求用户从他的帐户中扣除一笔款项。这是一个简单的程序,可以练习您对对象的理解以及如何操作它们的字段。您可以尝试重写一种方法来简化此程序的一个功能。

我发布这段代码是为了让人们对我的程序是否遵循OOP标准以及对其编写方式的任何改进征求人们的意见。我是自学Java的,我喜欢任何反馈,这样我就可以从创建这个程序中学习。

代码语言:javascript
运行
复制
import java.util.Scanner;

public class Main {
    private static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        boolean quit = false;
        int choice;
        String accountName;
        double startBalance;

        System.out.printf("%24s\n","BankApp v1.0");
        System.out.println("=====================================");
        System.out.println("Please enter your details below.");
        System.out.println("Account Name: ");
        accountName = scanner.nextLine();
        System.out.println("Starting Balance: ");
        startBalance = scanner.nextDouble();
        Account account = new Account(accountName,startBalance);
        while(!quit){
            printMainMenu();
            choice = scanner.nextInt();
            switch(choice){
                case 1:
                    System.out.printf("Account Name: %s\nAccount Balance: $%.2f\n",account.getAccountName(),
                            account.getAccountBal());
                    break;
                case 2:
                    System.out.println("Enter amount to be added: ");
                    account.addFunds(scanner.nextDouble());
                    break;
                case 3:
                    System.out.println("Enter amount to be transferred: ");
                    account.transferFunds(scanner.nextDouble());
                    break;
                case 4:
                    quit = true;
                    break;
                default:
                    System.out.println("Invalid choice.");
                    break;
            }
        }
        scanner.close();
    }

    public static void printMainMenu(){
        System.out.printf("%24s\n" +
                "=====================================\n" +
                "Please select an option:\n" +
                "1 - Check Balance\n" +
                "2 - Add Funds\n" +
                "3 - Transfer Funds\n" +
                "4 - Exit the program\n" +
                "=====================================\n" +
                "Choice: ","BankApp v1.0");
    }
}

这是帐户类代码。

代码语言:javascript
运行
复制
public class Account {
    private String accountName;
    private double accountBal;

    public Account(String accountName, double accountBal) {
        if(accountBal < 0) {
            System.out.println("Starting balance cannot be less than zero.\nBalance set to $0.00");
        }else {
            this.accountName = accountName;
            this.accountBal = accountBal;
            System.out.println("Account initialized.\nBalance set to $" + this.accountBal);
        }
    }

    public String getAccountName() {
        return accountName;
    }

    public double getAccountBal() {
        return accountBal;
    }

    public void transferFunds(double withdrawal){
        if(withdrawal > this.accountBal){
            System.out.printf("Unable to transfer $%.2f. Balance is insufficient.\n",withdrawal);
        }else if(withdrawal < 0){
            System.out.println("Transfer amount must be greater than zero. Transfer failed.");
        }else{
            this.accountBal -= withdrawal;
            System.out.printf("Transfer of $%.2f successful. Your new balance is $%.2f.\n",withdrawal,this.accountBal);
        }
    }

    public void addFunds(double deposit){
        if(deposit < 0){
            System.out.println("Amount deposited must be greater than zero.");
        }else {
            this.accountBal += deposit;
            System.out.printf("Deposit of $%.2f successful. Your new balance is $%.2f.\n",deposit,this.accountBal);
        }
    }
}
EN

回答 2

Code Review用户

回答已采纳

发布于 2020-05-15 08:44:21

命名

  • 尽管这只是一个示例应用程序,您应该使用正确的名称public class Main可以有一个更好的名称,也许可以想到public class ExerciseObjectManipulation。以后,您可以在SCM中更容易地找到这样的类。
  • 避免变量中的冗余,例如Account.accountNameAccount.accountBal。这使您有机会将Account.accountBal正确命名为Account.balance (也可避免在名称中使用缩写)。
  • 同样适用于这些方法名称getAccountNamegetAccountBal

分离关注点

  • 您的主要方法是负责打印、输入和程序流程--也许您可以使用单独的方法(甚至:单独的对象)来执行这些职责?您是否意识到您已经开始通过创建一个方法printMainMenu()来完成这个任务了?!
  • 为没有余额的Account提供一个构造函数,以创建没有余额的帐户。

错误处理

  • 将您的关注点写到System.out中是很好的(即使向System.error写入更合适,但正确的方法是抛出一个Exception!)现在可以创建一个负平衡的Account,即使不是所有属性都设置好了--这太糟糕了,您创建了一个未完成的对象!

代码语言:javascript
运行
复制
public Account(String name, double balance) {
    if(accountBal < 0) {
        throw new IllegalArgumentException("Starting balance cannot be less than zero");
    }
    this.name = name;
    this.balance = balance;
}
  • 对于获得的任何无效参数,请使用此方法,请参阅transferFunds(),请参阅addFunds()

逻辑缺陷

代码语言:javascript
运行
复制
if(deposit < 0){
    System.out.println("Amount deposited must be greater than zero.");
}

deposit <= 0cannot be less than zero.

在这里也一样:if(withdrawal < 0)

票数 2
EN

Code Review用户

发布于 2020-05-09 13:55:37

我可以给出的一个建议是,从Account类中的方法中抛出异常或返回true/false,以便客户机(在您的例子中是main类)能够采取必要的操作。我在这里看到的问题是,Account类会打印一些显示给用户的文本。显然,这不是Account类的工作。

其次,在您的主要方法中有太多的代码行,这使我认为您应该创建一个类/方法,并相应地发布工作。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/241997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档