1 项目概述
众所周知,快递柜是用来存放快递的,其基本功能就包括存快递和取快递。快递柜系统仅面向两个使用人群——普通用户和快递员。对于普通用户来说就仅仅是取快递这一个功能,这里就不展开叙述。对于快递员来说,他们并不仅仅是送快递的快递员,而是快递的管理者,对快递柜的数据进行操作才可以做到管理,因此这个快递柜系统不是仅包含一个存放快递的功能。
快递员作为快递的管理者,快递柜系统应该提供增删改查这4个基本功能:
1.存放快递:供快递员录入快递信息(包括:快递单号、快递公司的名称),录入完成后信息存储到系统中并返回一个六位随机数的取件码,用于以后用户取件;
2.删除快递:当快递信息录入有误时,快递员需要删除已经录入的快递信息,系统中根据输入的单号进行删除,释放快递柜空间;
3.修改快递:当发现快递信息有误需要修改的时候,此功能可以实现删除存放和存放功能合一,而不用删除完之后再录入那么浪费时间;
4.查看所有:顾名思义,查看柜子中全部快递的信息和单号,以及其摆放位置。
2 实现步骤
明确了各个模块的功能之后,我们就可以着手编写我们的代码了。这个系统是一个可以与用户交互和储存信息的系统,因此整体就分成3部分来写,第一部分是视图部分,实现控制台的输入输出,第二部分是快递数据的结构和存取,第三部分是调度部分,用于输入输出的与数据的衔接。
2.1 视图部分
管理系统一套流程下来会涉及很多打印,在初始就会打印欢迎的话,紧接着来的就是身份选择,当选择身份为普通用户的时候会打印提示输入取件码,输入的取件码通过筛选之后交由调度方法进行判断,判断结束后打印取件成功或者失败。当选择快递员时,快递员对快递有4个操作可以选择,增、删、改、查。存放(增加)快递时,当快递柜非满时需要输入单号和公司名称才能完成存放,此时将输出快递柜的位置和取件码,当快递员输入的单号与柜中的单号重复时会提示输入有错误。删除快递需要根据单号,判断是否存在可以删除快递的数据,不存在将退出当前操作,存在时会进一步询问是否真的要删可以选择进行或者取消。修改则为删除和增加的两个方法的结合体,先让快递员输入单号判断是否存在然后询问是否继续修改,若继续则输入新的信息和输出新的位置单号,操作结束。查看所有快递,则是把快递所有的信息打印出来,可以查看到先前所有操作过的快递。
2.2 数据部分
把快递的单号、公司和取件码封装成一个快递类,把快递柜看作一个又快递类对象组成的数组,而存放的位置就是这个二维数组的下标。
2.3 调度部分
重头戏来了,有了与用户交互的界面和储存数字的空间,还需要需要对两者进行调度,才能有效的实现需求。由于在用户输入时以及对输入的内容进行初步筛选,筛掉有格式或数值有异常的,因此能够进入调度部分而信息不会报错并进行下一步的运行。当接收到用户的信息之后,调用方法进行判断、储存、输出,因此代码的复用性也很高,对复用性高的代码块封装成方法即可。在调度方法编写的时候,尽可能简洁,把每个模块提炼成一个一个的方法,在每一个模块方法中再细分实现不同功能的子模块,进一步抽取成方法,以此类推。在后续使用起来更有层次感、更简洁,维护工作也因为条理清晰而变得轻松。
3 代码详情
由于修改快递采用的是先删除再修改,当后续存放快递发现取消操作之后就连原先的数据进行删除了,因此我在后续需要增加一个存放被删除掉快递的方法,当输入有误时取消了操作,即修改不成功需要复原,因此需要在修改判断取消后插入这个恢复数据的方法。
3.1 视图部分的源代码
package show;
import data.Express;
import data.ExpressMsg;
import java.util.Random;
import java.util.Scanner;
public class View {
// 视图部分
// View类用于控制台输出提示语句
// 储存被删除的一个快递,并储存的行和列
private Express recycle = null;
private int line,row;
/**
* 选择身份的菜单,1-快递员,2-普通用户,0-退出
* @return 输入的数值代表身份
*/
public int menu(){
int a ;
System.out.println("请选择身份:");
System.out.println("1-快递员");
System.out.println("2-普通用户");
System.out.println("0-退出程序");
Scanner input = new Scanner(System.in);
try {
String s = input.nextLine();
a = Integer.parseInt(s);
if (a < 0||a > 2) {
Exception e = new Exception();
throw e;
}else {
return a;
}
}catch (Exception e){
System.out.println("身份输入有误,请重新输入");
return menu();
}
}
/**
* 快递员的操作菜单,1-增加快递,2-删除快递,3-修改快递,4-查看所有,0-退出
* @return 输入的数值代表操作
*/
public int operation(){
int a = -1;
System.out.println("您的身份为快递员,可以进行以下操作:");
System.out.println("1-存放快递");
System.out.println("2-删除快递");
System.out.println("3-修改快递信息");
System.out.println("4-查看所有快递");
System.out.println("0-返回上一级");
Scanner input = new Scanner(System.in);
String s = input.nextLine();
try {
a = Integer.parseInt(s);
if (a < 0 || a > 4) {
Exception e = new Exception();
throw e;
}
return a;
}catch (Exception e){
return operation();
}
}
/**
* 1-增加快递操作,传入快递类对象,判断是否存在相同单号的快递
* @param e 快递类的对象,与箱中的快递作比较
* @return 存成功返回true,失败返回false
*/
public boolean add(Express e){
// 判断是否存在相同单号的快递
if(this.exist(e))
return false;
// 存储入快递柜
while (true){
Random random = new Random();
int i = random.nextInt(10);
int j = random.nextInt(10);
if(ExpressMsg.express[i][j] == null) {
ExpressMsg.express[i][j] = e;
printLine(e, i, j);
break;
}
}
ExpressMsg.count++;