简易零钱通项目

简易零钱通项目:

(巩固javaSE基础的小练习)

基本功能:使用Java开发一个简易的零钱通项目,可以完成收益入账,消费,查看明细,退出系统等功能。

问题改进:

改进:

  1. 改进Bill中的toString方法,使输出格式更为一致和易读

    1
    2
    3
    4
    5
    6
    7
    8
    //改进前
    if(getAmount()>=0.0)
    return getName() +"\t\t+"+ getAmount()+"\t"+getDate()+"\t";
    else
    return getName() +"\t\t"+ getAmount()+"\t"+getDate()+"\t";
    //改进后
    String sign = amount >= 0 ? "+" : "";
    return String.format("%s\t\t%s%.2f\t%s", name, sign, amount, date);
  2. 主程序start封装

    1. 职责分离:通过将启动逻辑(显示菜单、处理用户选择)封装在一个单独的方法中,代码的结构变得更清晰。start方法作为系统的入口点,负责控制程序的运行流程。这样,SmallChangeSystem类的每个方法都有了明确且专一的职责,符合单一职责原则。
    2. 易于理解和维护:可以更容易地理解程序的流程。一看到start方法,就知道这是程序的起点。它简化了程序的入口,使得程序的启动逻辑不散落在多个地方,易于追踪程序如何开始执行。
    3. 灵活性:如果将来想要修改程序的启动逻辑,比如增加初始化步骤、修改循环条件或者在程序退出前执行一些清理操作,只需修改start方法即可。这提供了更好的灵活性和可扩展性。
    4. 更自然的循环控制:使用while (running)循环直观地表达了“程序应该持续运行,直到不再running(即用户选择退出)”的逻辑。通过在循环内部根据用户的选择来更新running变量,可以更自然和灵活地控制程序的退出条件。这种方式比直接在switchif语句中调用System.exit(0)更为优雅,因为它允许进行必要的清理操作而不是直接结束程序。
    1
    2
    3
    4
    5
    6
    7
    8
    //启动入口
    public void start() {
    boolean running = true;
    while (running) {
    menu();
    running = choice();
    }
    }
  3. 系统自动记录时间

    1
    2
    //自动记录时间
    String date=new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date());
  4. 收入/消费账单设置合二为一

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //提高了代码的复用性
    public void addBill(boolean isIncome) {
    System.out.println("输入" + (isIncome ? "收益" : "消费") + "类型:");
    String name = scanner.next();
    System.out.println("输入金额:");
    double amount = scanner.nextDouble();
    if (!isIncome)
    amount = -amount;
    //自动记录时间
    String date = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date());
    Bill bill = new Bill(name, amount, date);
    bills.add(bill);
    balance += amount;
    System.out.println("入账记录成功,请继续选择按键:");
    }

代码展示:

APP类:

1
2
3
4
5
6
public class APP {
public static void main(String[] args) {
SmallChangeSystem smallChangeSystem = new SmallChangeSystem();
smallChangeSystem.start();
}
}

Bill类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Bill {
private String name;
private double amount;
private String date;

public Bill() {
}

public Bill(String name, double amount, String date) {
this.name = name;
this.amount = amount;
this.date = date;
}

public String getName() {return name;}

public void setName(String name) {this.name = name;}

public double getAmount() {return amount;}

public void setAmount(double amount) {this.amount = amount;}

public String getDate() {return date;}

public void setDate(String date) {this.date = date;}

@Override
public String toString() {
String sign = amount >= 0 ? "+" : "";
return String.format("%s\t\t%s%.2f\t%s", name, sign, amount, date);
}
}

SmallChangeSystem类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import java.text.SimpleDateFormat;
import java.util.*;

public class SmallChangeSystem {
private double balance = 0.0;
private final ArrayList<Bill> bills = new ArrayList<>();
private final Scanner scanner = new Scanner(System.in);//在哪里创建比较好?什么修饰符?
//启动入口
public void start() {
boolean running = true;
while (running) {
menu();
running = choice();
}
}
//菜单
public void menu() {
System.out.println("-----------------零钱通菜单-----------------");
System.out.println("- 1 零钱通明细 -");
System.out.println("- 2 收益入账 -");
System.out.println("- 3 消费入账 -");
System.out.println("- 4 退出程序 -");
System.out.println("-请选择 1 - 4 : -");
}
//选择功能
public boolean choice() {
switch (scanner.next()) {
case "1":
check();
break;
case "2":
addBill(true);
break;
case "3":
addBill(false);
break;
case "4":
return exit();
default:
System.out.println("没有此选项,重新输入");
}
return true;
}
//零钱通明细功能
public void check() {
System.out.println("-----------------零钱通明细-----------------");
if (bills.isEmpty()) {
System.out.println("当前无账单记录");
return;
}
for (Bill bill : bills) {
System.out.println(bill.toString() + "\t" + "余额: " + balance);
}
System.out.println("查看完毕,请继续选择按键:");
}
//添加账单
public void addBill(boolean isIncome) {
System.out.println("输入" + (isIncome ? "收益" : "消费") + "类型:");
String name = scanner.next();
System.out.println("输入金额:");
double amount = scanner.nextDouble();
if (!isIncome)
amount = -amount;
//自动记录时间
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date());
Bill bill = new Bill(name, amount, date);
bills.add(bill);
balance += amount;
System.out.println("入账记录成功,请继续选择按键:");
}
//退出功能
public boolean exit() {
System.out.println("确定退出吗? 确定输入yes 返回输入no");
while (true) {
String str = scanner.next();
if (str.equals("yes"))
return false;
else if (str.equals("no"))
return true;
}
}
}