做一个项目之前首先要知道做什么?实现什么功能?得到什么效果?然后再理思绪以及怎么做,慢慢来,一口吃不成个胖子,切忌一上来就动手做,简单的代码还好,一旦代码更多更复杂进行到后面就很容易乱成一锅粥,所以我们要清楚项目开发流程:
1.需求分析
1.初步了解需求有利于构建初步框架,然后用相关的工具软件列出要开发的系统的大功能模块,每个大功能模块有哪些小功能模块;
2.系统分析深入了解和分析需求,根据自己的经验和需求用W再做出一份文档系统的功能需求文档,清楚列出系统大致的大功能模块,大功能模块有哪些小功能模块,并且还列出相关的界面和界面功能。
目标:
• 模拟实现一个基于文本界面的 《 项目开发团队分配管理软件 》
• 熟悉 Java 面向对象的高级特性,进一步掌握编程技巧和调试技巧
• 主要涉及以下知识点:
① 类的继承性和多态性
② 对象的值传递、接口
③ static 和 final 修饰符
④ 特殊类的使用:包装类、抽象类、内部类
⑤ 异常处理
⑥ Java 基本语法和流程控制
⑦ 数组, ArrayList 集合
三大模块之间的联系如下:
2.概要设计
首先,开发者需要对软件系统进行概要设计,即系统设计。概要设计需要对软件系统的设计进行考虑,包括系统的基本处理流程、系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计和出错处理设计等,为软件的详细设计提供基础。
3.详细设计
在概要设计的基础上,开发者需要进行软件系统的详细设计。在详细设计中,描述实现具体模块所涉及到的主要算法、数据结构、类的层次结构及调用关系,需要说明软件系统各个层次中的每一个程序(每个模块或子程序)的设计考虑,以便进行编码和测试。应当保证软件的需求完全分配给整个软件。
流程图如下所示:
4.编码
在软件编码阶段,开发者开始具体的编写程序工作,分别实现各模块的功能,从而实现对目标系统的功能、性能、接口、界面等方面的要求。
•在domain包中完成各个类的实体类创建
在该包下一共有四个员工类:Employee雇员类(父类),Programmer程序设计员类(继承自员工类),Designer设计师类( 继承自程序员类),Architect架构师类(继承自设计师Designer类);
三个设备类:PC台式电脑类、NoteBook笔记本电脑类、Print打印机类 (以上都能实现一个接口Equipment设备);
一个Project项目实体类,包含项目的编号、名称、开发团队、开发团队名称以及开发状态这几个属性
一个用户类,用来存储用户的姓名、密码等信息
Employee雇员类(父类)
package Project.team.domain;
//员工类Employee
public class Employee {
private int id; //员工id
private String name; //姓名
private int age; //年龄
private double salary;//工资
private Equipment equipment;
// 空参
public Employee() {
}
// 实参
public Employee(int id, String name, int age, double salary) {
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
}
public Employee(int id, String name, int age, double salary, Equipment equipment) {
}
public Employee(int id, String name, int age, double salary, Equipment equipment, double bonus) {
}
// get/set
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
// public Equipment getEquipment(Equipment equipment) {
// return equipment;
// }
public void setEquipment(Equipment equipment) {
this.equipment = equipment;
}
//实现接口,返回属性信息;
public String toString() {
return id + "\t\t" + name + "\t" + age + "\t\t\t" + salary;
}}
程序设计员类 继承自员工类
package Project.team.domain;
//程序设计员类 继承自员工类
public class Programmer extends Employee {
private int memberId; //成员id私有,用来记录成员加入开发团队后在团队中的ID
private boolean status = true;//项目中人员的状态,职位初始化时为true,修改后为fault
private Equipment equipment; //成员设备
//空参
public Programmer() {
}
//实参
public Programmer(int id, String name, int age,
double salary, Equipment equipment) {
super(id, name, age, salary);
this.equipment = equipment;
}
public int getMemberId() {
return memberId;
}
public void setMemberId(int memberId) {
this.memberId = memberId;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
// 方法调用接口
// public Equipment getEquipment(Equipment equipment) {
// return this.equipment;
// }
public Equipment getEquipment() {
return equipment;
}
@Override
public void setEquipment(Equipment equipment) {
this.equipment = equipment;
}
//+ this.memberId + this.status + this.equipment
@Override //重写
public String toString() {
return super.getId() + "\t\t" + super.getName() + "\t" + super.getAge() + "\t\t\t" + super.getSalary() ;
}
}
设计师Designer类 继承自程序员Programmer类
package Project.team.domain;
//设计师Designer类 继承自程序员Programmer类
public class Designer extends Programmer{
private double bonus; //津贴,奖金
public Designer(){}
public Designer(int id, String name, int age, double salary, Equipment equipment, double bonus) {
super(id, name, age, salary, equipment);
this.bonus = bonus;
}
public double getBonus() {
return bonus;
}
@Override //重写
public String toString() {
return super.getId() + "\t\t" + super.getName() + "\t" + super.getAge() + "\t\t\t" + super.getSalary() ;
}
// @Override
// public String toString() {
// return "Designer{" +
// "bonus=" + bonus +
// '}';
// }
}
Architect架构师类 继承自设计师Designer类
package Project.team.domain;
//Architect架构师类 继承自设计师Designer类
public class Architect extends Designer {
private int stock;//表示公司奖励的股票数量
public Architect() {
}
public Architect(int id, String name, int age, double salary, Equipment equipment, double bonus, int stock) {
super(id, name, age, salary, equipment, bonus);
this.stock = stock;
}
public int getStock() {
return stock;
}
// @Override
// public String toString() {
// return "Architect{" +
// "stock=" + stock +
// '}';
// }
@Override //重写
public String toString() {
return super.getId() + "\t\t" + super.getName() + "\t" + super.getAge() + "\t\t\t" + super.getSalary() ;
}
}
接口
package Project.team.domain;
//接口
public interface Equipment {
String getDescription();
}
台式电脑类 实现一个接口Equipment设备
package Project.team.domain;
import Project.team.view.TSUtility;
//台式电脑类 实现一个接口Equipment设备
public class PC implements Equipment {
private String model; //机器型号
private String display;//显示器名称
//空参
public PC() {}
//实参
public PC(String model, String display) {
super();
this.model = model;
this.display = display;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
public PC addPC() {
System.out.println("请输入需要配置的台式电脑的型号:");
String model = TSUtility.readKeyBoard(10, false);
System.out.println("请输入需要配置的台式电脑的显示器名称:");
String display = TSUtility.readKeyBoard(10, false);
System.out.println("设备添加成功!");
return new PC(model, display);
}
@Override
public String getDescription() {
return model + "(" + display + ")";
}
@Override
public String toString() {
return model + "(" + display + ")";
}
}
笔记本电脑类 实现一个接口Equipment设备
package Project.team.domain;
import Project.team.view.TSUtility;
//笔记本电脑类 实现一个接口Equipment设备
public class NoteBook implements Equipment{
private String model;//机器的型号
private double price;//价格
public NoteBook() {
super();
}
public NoteBook(String model, double price) {
super();
this.model = model;
this.price = price;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public NoteBook addNoteBook()
{
System.out.println("请输入需要配置的笔记本电脑的型号:");
String model = TSUtility.readKeyBoard(10, false);
System.out.println("请输入需要配置的笔记本电脑的价格:");
Double price = TSUtility.readDouble();
System.out.println("设备添加成功!");
return new NoteBook(model, price);
}
@Override
public String getDescription() {
return model + "("+price+")";
}
@Override
public String toString() {
return model + "("+price+")";
}
}
打印机类
package Project.team.domain;
//打印机类
public class Print implements Equipment{
private String name;//打印机名称
private String type;//打印机类型
public Print() {
}
public Print(String name, String type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String getDescription() {
return name+ "(" +type+ ")" ;
}
@Override
public String toString() {
return name+ "(" +type+ ")" ;
}
}
新建的项目实体类
package Project.team.domain;
import java.util.Arrays;
//新建一个项目实体类,包含项目的编号、名称、开发团队、开发团队名称以及开发状态这几个属性
public class Project {
private int proId;//项目编号
private String proName;//项目名称
private String details;//项目详细内容
private Programmer[] team;//开发团队分组
private String teamName;//开发团队名称
private boolean status;//开发状态(用true和fault表示两种状态,true为开发中,false为未开发中)
public Project() {
}
public Project(int proId, String proName, String details, Programmer[] team, String teamName, boolean status) {
this.proId = proId;
this.proName = proName;
this.details = details;
this.team = team;
this.teamName = teamName;
this.status = status;
}
public int getProId() {
return proId;
}
public void setProId(int proId) {
this.proId = proId;
}
public String getProName() {
return proName;
}
public void setProName(String proName) {
this.proName = proName;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
public Programmer[] getTeam() {
return team;
}
public void setTeam(Programmer[] team) {
this.team = team;
}
public String getTeamName() {
return teamName;
}
public void setTeamName(String teamName) {
this.teamName = teamName;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
@Override
public String toString() {
return "项目{" +
"项目编号=" + proId +
",项目名称='" + proName + '\'' +
", 项目详细内容='" + details + '\'' +
", 开发团队分组=" + Arrays.toString(team) +
", 开发团队名称'" + teamName + '\'' +
", 开发状态=" + status +
'}';
}
public String getProjectName() {
return this.proName;
}
}
新建的user类,用来存储用户姓名、密码、新修改的姓名和密码
package Project.team.domain;
//新建的user类,用来存储用户姓名、密码、新修改的姓名和密码
public class User {
public int length;
private String name;
private String password;
private String newUserName;
private String newPassword;
public User() {
}
public User(int length, String name, String password, String newUserName, String newPassword) {
this.length = length;
this.name = name;
this.password = password;
this.newUserName = newUserName;
this.newPassword = newPassword;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNewUserName() {
return newUserName;
}
public void setNewUserName(String newUserName) {
this.newUserName = newUserName;
}
public String getNewPassword() {
return newPassword;
}
public void setNewPassword(String newPassword) {
this.newPassword = newPassword;
}
}
完整版代码见:链接:https://pan.baidu.com/s/1w7KFqeOXs9cGOzYMZ_Uaqw
提取码:gl8p
改进版本:
链接:https://pan.baidu.com/s/1HEEmg22RveXlbR6fNFCeVQ
提取码:x7pi
5.测试
测试编写好的系统。交给用户使用,用户使用后一个一个的确认每个功能。软件测试有很多种:按照测试执行方,可以分为内部测试和外部测试;按照测试范围,可以分为模块测试和整体联调;按照测试条件,可以分为正常操作情况测试和异常情况测试;按照测试的输入范围,可以分为全覆盖测试和抽样测试。以上都很好理解,不再解释。总之,测试同样是项目研发中一个相当重要的步骤,对于一个大型软件,3个月到1年的外部测试都是正常的,因为永远都会有不可预料的问题存在。完成测试后,完成验收并完成最后的一些帮助文档,整体项目才算告一段落,当然日后少不了升级,修补等等工作,只要不是想通过一锤子买卖骗钱,就要不停的跟踪软件的运营状况并持续修补升级,直到这个软件被彻底淘汰为止。
见:
6.软件交付
在软件测试证明软件达到要求后,软件开发者应向用户交付软件。
7.验收
用户验收。
8.维护
根据用户需求的变化或环境的变化,对应用程序进行全部或部分的修改。