目录
前言
至今,java学习接近三个月,做题的很多时候我会比较茫然。特别是这种实践项目,拿到手的时候完全没思路,处于蒙圈状态。不过跟着老师的示例代码和询问小组内成员,徐循渐进,慢慢的实现了项目的需求。但是我缺少独立解决问题的能力,项目一是因为有老师的示例代码,以后的项目需要自己构思并完成,想想都害怕。。。关卡五时,增删改查的操作也做过,不过项目的话更重要的是功能实现、数据互通和优化等问题。本篇内容我就不把该项目的所有代码Ctrl C,这里列举一些我认为重点和难点的部分。
实现目标
模拟实现一个基于文本界面的《项目开发团队分配管理软件》
熟悉Java面向对象的高级特性,进一步掌握编程技巧和调试技巧
主要涉及以下知识点:
- 类的继承性和多态性
- 对象的值传递、接口
- static和final修饰符
- 特殊类的使用:包装类、抽象类、内部类
- 异常处理
- Java基本语法和流程控制
- 数组,ArrayList集合
需求说明
该软件实现以下功能:
- 软件启动时,首先进入登录界面进行注册和登录功能。
- 当登陆成功后,进入菜单,首先就可以对开发人员账户和密码进行修改。
- 然后可以对开发人员进行增删改操作
- 人员添加成功后,根据菜单提示,基于现有的公司成员,组建一个开发团队以开发一个新的项目。
- 组建过程包括将成员插入到团队中,或从团队中删除某成员,还可以列出团队中现有成员的列表,开发团队成员包括架构师、设计师和程序员。
- 团队组建成功,则可以进入项目模块,添加项目,分配开发团队进行开发。
系统功能结构与流程
以上就是该项目需要实现的目标与相关说明,大概了解完项目的框架结构后,就开始进入正题。
LoginView类
该类主要是实现用户的注册和登录以及修改用户信息,若进行操作的用户未注册账号需要先进行注册(给出相应提示),然后登录自己的账号即可。该类的细节部分也要考虑到。
- 用户登录账号最多输入几次,若次数用完则给出提示-->此用户被锁定,程序结束。
//判断账户是否注册以及用户登录次数的限制
if (un.length() == 0 || pw.length() == 0) {
System.out.println("您的账号不存在,请先注册!");
register();
} else if (userName.equals(un) && passWord.equals(pw)) {
System.out.println("登录成功!!!欢迎您:" + userName);
//给出对应登录次数提醒
} else {
count--;
if (count <= 0) {
System.out.println("您的账户已被锁定,退出!");
System.exit(0);
} else {
System.out.println("登录失败,账户名或密码错误!");
System.out.println("登录次数还剩" + count + "次," + "请重新输入!");
}
}
NameListService类
此类属于开发人员模块所需类,由于开发人员里涉及到很多实体类的创建(程序员、设计师、架构师以及他们各自需要的办公设备和设备接口等),这里就不一一列举了,主要对涉及该部分代码的优化问题作一些讨论。
- 在进行开发人员删除或修改操作时,若输入-1或者其他要判断人员是否存在的问题并相应给出提示。
- 在进行开发人员删除操作后,实现数据动态化,相应人员ID也跟着动态减1。
//开发人员的删除
public void deleteEmployee() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要删除的员工的ID:");
int id = TSUtility.readInt();
int index = -1;
for (int i = 0; i < employees.size(); i++) {
Employee employee = employees.get(i);
if (employee.getID() == id) {
index = i;
System.out.println("请确认是否删除此员工Y/N");
char c = TSUtility.readConfirmSelection();
if (c == 'Y') {
employees.remove(index);
//删除开发人员 数据动态化
for (i = id; i <= employees.size(); i++) {
employees.get(i - 1).setID(employees.get(i - 1).getID() - 1);
}
System.out.println("人员删除成功!");
break;
}
}
}
if (index == -1) {
try {
throw new TeamException("该员工不存在!");
} catch (TeamException t) {
System.out.println(t.getMessage());
}
}
}
- 因为要实现数据互通,在NameListService类里创建集合对象,用于存储开发人员数据(代码块完成初始化值)。定义一个方法,得到所有开发人员的数据集合。
public class NameListService {
//创建集合对象,用于存储员工数据
private ArrayList<Employee> employees = new ArrayList<>();
//添加员工ID
private int count = 1;
//用代码块完成初始化默认值
{
employees.add(new Employee(count, "马云 ", 22, 3000));
employees.add(new Architect(++count, "马化腾", 32, 18000, new NoteBook("联想T4", 6000), 6000, 5000));
employees.add(new Programmer(++count, "李彦宏", 23, 7000, new PC(" 戴尔", "NEC 17寸")));
employees.add(new Programmer(++count, "刘强东", 24, 7300, new PC(" 戴尔", "三星 17寸")));
employees.add(new Designer(++count, "雷军 ", 50, 10000, new Printer("激光", "佳能2900"), 5000));
employees.add(new Programmer(++count, "任志强", 30, 16800, new PC(" 华硕", "三星 17寸")));
employees.add(new Designer(++count, "柳传志", 45, 35500, new PC("华硕", "三星 17寸"), 8000));
employees.add(new Architect(++count, "杨元庆", 35, 6500, new Printer("针式", "爱普生20k"), 15500, 1200));
employees.add(new Designer(++count, "史玉柱", 27, 7800, new NoteBook("惠普m6", 5800), 1500));
employees.add(new Programmer(++count, "丁磊 ", 26, 6600, new PC(" 戴尔", "NEC17寸")));
employees.add(new Programmer(++count, "张朝阳", 35, 7100, new PC(" 华硕", "三星 17寸")));
employees.add(new Designer(++count, "杨志远", 38, 9600, new NoteBook("惠普m6", 5800), 3000));
}
//得到所有员工数据集合
public ArrayList<Employee> getAllEmployees() {
return employees;
}
TeamView类 和 TeamService类
此类属于开发团队模块所需类,实现团队的添加,删除,查看等功能。上述需要实现数据互通,所以在TeamView类里定义一个方法,把在NameListService类里添加的开发人员存储在新的集合里。
- TeamView类里定义listAllEmployee方法,实现数据互通。
public class TeamView { private TeamService teamSvc = new TeamService(); //显示所有员工 public void listAllEmployee() { System.out.println("********************开发团队调度软件********************"); ArrayList<Employee> e = listSvc.getAllEmployees(); if (e.size() == 0) { System.out.println("未找到员工信息"); } else { //遍历集合,得到每一个员工 for (int i = 0; i < e.size(); i++) { Employee s = e.get(i); System.out.println(s.toString()); } } } }
- 团队人员的逻辑判断(人数限制问题),可借用instanceof进行判断。
public class TeamService {
//用于自动生成团队成员的memberID
private static int counter = 1;
//表示开发团队最大成员数
private final int Max_MEMBER = 5;
//team数组:用来保存当前团队中的各成员对象
private Programmer[] team = new Programmer[Max_MEMBER];
//total:记录团队成员的实际人数
private int total = 0;
//返回team中所有程序员构成的数组
public Programmer[] getTeam() {
Programmer[] team = new Programmer[total];
for (int i = 0; i < total; i++) {
team[i] = this.team[i];
}
return team;
}
//初始化当前团队成员数组
public void clearTeam() {
team = new Programmer[Max_MEMBER];
counter = 1;
total = 0;
this.team = team;
}
//添加团队成员
public void addMember(Employee e) throws TeamException {
if (total >= Max_MEMBER) {
throw new TeamException("团队中上限人数为5人,无法继续添加!");
//!逻辑非-->和结果相反;
// instanceof(转型),测试左边的对象是否是右边类或者该类的子类创建的实例对象
//先有继承关系,再有instanceof的使用。
} else if (!(e instanceof Programmer)) {
throw new TeamException("该成员不是开发人员,无法添加");
}
//向下转型,父类引用转为子类对象
Programmer p = (Programmer) e;
for (int i = 0; i < total; i++) {
if (team[i].getID() == p.getID()) {
throw new TeamException("该员工已在本开发团队中");
}
}
//Status是项目中人员的状态,先赋值为true,当添加到团队时为false
if (!p.isStatus()) {
throw new TeamException("该员工已是某团队成员");
}
int numOfPro = 0;
int numOfDesi = 0;
int numOfArch = 0;
for (int i = 0; i < total; i++) {
if (team[i] instanceof Architect) {
numOfArch++;
} else if (team[i] instanceof Designer) {
numOfDesi++;
} else if (team[i] != null && !(team[i] instanceof Architect) && !(team[i] instanceof Designer)) {
numOfPro++;
}
}
if (p instanceof Architect) {
if (numOfArch >= 1) {
throw new TeamException("团队中最多只能有一名架构师");
}
} else if (p instanceof Designer) {
if (numOfDesi >= 2) {
throw new TeamException("团队中最多只能有两名设计师");
}
} else if (p instanceof Programmer) {
if (numOfPro >= 3) {
throw new TeamException("团队中最多只能有三名程序员");
}
}
ProjectService类
我这里就不写project实体类了(属性的定义等),此模块需要注意的是项目不能重复和项目在开发状态时不能被删除这两个优化问题。给出PeojectService类所写代码。
public class ProjectService {
//创建集合,用于存储项目
private ArrayList<Project> pro = new ArrayList<>();
//添加项目编号
private int count = 1;
//项目未添加时状态
int aa = -1;
int bb = -1;
int cc = -1;
int dd = -1;
//添加项目
public void addProject() throws InterruptedException {
System.out.println("项目参考:------------------------------------------------");
System.out.println("1.小米官网:开发完成类似于小米官网的web项目。");
System.out.println("2.公益在线商城:猫宁Morning公益商城是中国公益性在线电子商城。");
System.out.println("3.博客系统:Java博客系统,让每一个有故事的人更好的表达想法!");
System.out.println("4.在线协作文档编辑系统:一个很常用的功能,适合小组内的文档编辑。");
System.out.println("项目参考:------------------------------------------------");
TSUtility.readReturn();
System.out.println("请输入你想添加的项目编号:");
char c = TSUtility.readMenuSelection();
switch (c) {
case '1':
if (aa == -1) {
Project p1 = new Project();
p1.setProId(count++);
p1.setProjectName("小米官网");
p1.setDesName("开发完成类似于小米官网的web项目");
pro.add(p1);
TSUtility.loadSpecialEffects();
System.out.println("已添加项目:" + p1.getProjectName());
aa++;
} else {
System.out.println("该项目已被添加了,请选择其他项目");
}
break;
case '2':
if (bb == -1) {
Project p2 = new Project();
p2.setProId(count++);
p2.setProjectName("公益在线商城");
p2.setDesName("猫宁Morning公益商城是中国公益性在线电子商城");
pro.add(p2);
TSUtility.loadSpecialEffects();
System.out.println("已添加项目:" + p2.getProjectName());
bb++;
} else {
System.out.println("该项目已被添加了,请选择其他项目");
}
break;
case '3':
if (cc == -1) {
Project p3 = new Project();
p3.setProId(count++);
p3.setProjectName("博客系统");
p3.setDesName("Java博客系统,让每一个有故事的人更好的表达想法");
pro.add(p3);
TSUtility.loadSpecialEffects();
System.out.println("已添加项目:" + p3.getProjectName());
cc++;
} else {
System.out.println("该项目已被添加了,请选择其他项目");
}
break;
case '4':
if (dd == -1) {
Project p4 = new Project();
p4.setProId(count++);
p4.setProjectName("在线协作文档编辑系统");
p4.setDesName("一个很常用的功能,适合小组内的文档编辑");
pro.add(p4);
TSUtility.loadSpecialEffects();
System.out.println("已添加项目:" + p4.getProjectName());
dd++;
} else {
System.out.println("该项目已被添加了,请选择其他项目");
}
break;
default:
System.out.println("项目不存在");
break;
}
}
//项目分配团队开发
public void dealingPro(Programmer[] team) {
if (pro.size() == 0) {
System.out.println("当前无项目,请先添加");
return;
}
System.out.println("当前团队有人员:");
for (int i = 0; i < team.length; i++) {
System.out.println(team[i]);
}
System.out.println("请为当前团队创建一个团队名称:");
String name = TSUtility.readKeyBoard(6, false);
//随机分配项目
Random r = new Random();
int num = r.nextInt(pro.size());
Project project = pro.get(num);
project.setTeamName(name);
project.setTeam(team);
project.setStatus(true);
pro.set(num, project);
}
//查看项目当前状态
public void showPro() throws InterruptedException {
if (pro.size() == 0) {
System.out.println("当前无项目信息");
} else {
TSUtility.loadSpecialEffects();
for (int i = 0; i < pro.size(); i++) {
System.out.println(pro.get(i).getKnowStatus());
}
}
}
public void delPro(int id) {
boolean flag = false;
boolean f = false;
if (pro.size() == 0) {
System.out.println("当前无项目信息");
} else {
for (int i = 0; i < pro.size(); i++) {
if (pro.get(i).getProId() == id) {
if (pro.get(i).isStatus()) {
f = true;
} else {
pro.remove(id - 1);
//删除选择的项目(动态化,成员删除1,原有的id跟着减1)
for (i = id; i <= pro.size(); i++) {
pro.get(i - 1).setProId(pro.get(i - 1).getProId() - 1);
}
flag = true;
}
}
}
if (f) {
try {
throw new TeamException("项目开发中,不能被删除");
} catch (TeamException e) {
System.out.println(e.getMessage());
}
} else {
if (flag) {
System.out.println("删除成功!");
aa--;
bb--;
cc--;
dd--;
count--;
} else {
try {
throw new TeamException("该项目不存在");
} catch (TeamException e) {
System.out.println(e.getMessage());
}
}
}
}
}
//得到所有项目数据集合
public ArrayList<Project> getAllPro() {
return pro;
}
}
总结
综上,便是我的一些浅略之见以及敲写代码出现的问题以及需要优化的部分。不难看出,在完成一个项目需求时,我们首先要构思,要学会模块区域化,让它们有逻辑关联,然后一步一步写,这样才能把大问题小步化。Java之路,任重而道远!