面向对象分析与设计
1 用例模型分析 1.1 需求描述
1)学生信息管理
教务人员通过学生信息管理模块来管理学生信息,如进行学生信息的添加、修改、删除等。在进行学生信息的添加时,要进行学生学号是否有重复的检查,如果添加的学生编号有重复就要对用户进行提示。只有在不重复的情况下才能进行信息的添加。在进行信息的删除时,要首先提示用户确认是否要删除,只有在用户确认的情况下才能进行信息的删除。在进行信息的修改时,要根据用户选定的学生进行修改,即列出用户选定的学生的所有信息,在这个基础上进行学生信息的修改。 2)教师信息管理
教务工作人员通过此模块来管理教师信息,包括教师信息的添加、修改、删除等。在进行教师信息的添加时候,要进行教师编号是否重复的检验,如果添加的教师编号重复要对用户进行提示,只有在不重复的情况下才能进行信息的添加。在进行信息的删除时,要提示用户确认是否删除,只有在用户确认后才能够进行信息的删除。在进行信息的修改时,要能够根据用户选定的教师项进行修改,即列出用户选定的教师的所有信息,在这个基础上进行班级信息的修改。 3)班级信息管理
教务工作人员通过此模块来管理班级的信息,包括班级信息的添加,修改,删除等。在进行班级信息的添加时,要进行班级的编号是否重复的检查,如果添加的班级编号重复要对用户进行提示,只有在信息不重复的前提下才能进行信息的添加,在进行信息的删除时,要提示用户确认是否删除,只有用户确认后才能进行信息的删除。在进行信息的修改时,要能根据用户选定的班级进行修改,即列出用户选定的班级的所有信息,在这个基础上进行班级信息的修改。 4)课程信息管理
教务工作人员通过该模块来管理课程的基本信息,包括: (1) 课程信息等的添加,修改,删除。
在进行信息的添加时,打开新的窗口进行信息的录入,在保存的时候要进行课程的编号
是否重复的检查,如果添加的课程编号重复的要对用户进行提示,只有在不重复的情况下才能进行信息的添加。在进行信息的删除的时候,要让用户确认是否要删除,只有确认后才能进行删除操作。在进行信息的修改的时候,要根据用户选定的课程进行修改,即列出用户选定课程的信息,在这个基础上进行课程信息的修改。
(2)班级课程的设置(教学任务)。 (3)教师授课信息的设置。 5)成绩信息管理
任课教师可以通过该模块录入自己担任的某门课的成绩,在录入学生成绩的时,教师选定课程并选定学生班级,才能输入学生成绩。教务工作人员通过该模块来进行学生成绩的修改。
6)综合信息查询
通过该模块可以查询教务所需要的各种信息。
学生能够查询:个人基本信息、个人成绩信息、班级上课信息;
教务人员可以查询:学生基本信息、教师基本信息、课程信息、班级信息、学生成绩信息; 7)系统维护
系统管理员能够创建和维护教师、学生、教务管理员等用户账号信息。
1.2 用例图
系统管理员
图1 教务管理系统用例图
1.3 用例描述
用例1. 学生信息管理 1.1 简要说明
教务人员通过学生信息管理模块来管理学生信息,如进行学生信息的添加、修改、删除等。 2. 上下文图
教务人员
图2 “学生信息管理用例”
3. 事件流 3.1 基本流
E1: 教务人员选择“添加学生”
E1.1 教务人员输入新学生的基本信息(学号、姓名、性别、出生日期、学生
联系电话、家庭住址、家庭联系电话等); E1.2 教务人员点击保存;
E1.3 系统检查已有的学生学号,如果学号重复则转到A1;如果学号不重复且学生信息添加完整,则保存该学生信息到学生信息表中; E2 教务人员“删除学生信息”
E2.1 教务人员输入或选择学生班级;
E2.2 教务人员输入或选择要删除的学生学号; E2.3 系统提示教务人员“确认删除” E2.3 教务人员点击“确认”
E2.3 系统检查要删除学生的“班级”和“学号”,如果输入的“班级”或“学号”在系统中不存在,则转到A2;否则,删除该学号的学生信息和该学号相关的成绩信息;
E3 教务人员选择“修改学生信息”
E3.1 教务人员输入或选择要修改学生所在班级; E3.2 教务人员输入或选择要修改的学生学号;
E3.3 系统检查要修改学生的班级或学号,如果要修改的“班级”或“学号”在系统中不存在,则转到A3;否则,系统提前该学生的基本信息,显示在界面上,学生的学号不允许修改;
E3.4 教务人员录入该学生的修改信息;
E3.4 教务人员点击保存,系统将修改后的信息保存到学生信息表中。 3.2 备选流
3.2.1 第一备选流
A1:系统提示“已经存在该学号的学生,请核对学生学号信息”,系统返回到添加学生信息的界面; A2:系统提示“要删除学生的班级或学号不存在,请确认”,系统返回到删除界面; A3:系统提示“要修改学生的班级或学号不存在,请确认”,系统返回到修改界面; 3.2.1.1 备选支流
[如果能使表达更明确,备选流又可再分为多个支流。] 3.2.2 第二备选流
[在一个用例中很可能会有多个备选流。为了使表达更清晰,应将各个备选流分开说明。使用备选流可以提高用例的可读性,并防止将用例分解为过多的层次。应切记,用例只是文本说明,其主要目的是以清晰、简洁、易于理解的方式记录系统的行为。] 4. 非功能需求
[在这个小节中,主要对该用例所涉及的非功能性需求进行描述。由于其通常很难以在事件流中进行表述,因此单列为一小节进行阐述。这些需求通过包括法律法规、应用程序标准、质量属性(可用性、可靠性、性能、支持性等)、兼容性、可移植性,以及设计约束等方面的需求。在这些需求的描述方面,一定要注意使其可度量、可验证,否则就容易流于形式,形同摆设。] 5. 前置条件
教务人员须先进行身份验证,登陆到教务系统 6. 后置条件
教务人员完成学生信息管理操作后,可以返回到系统主界面或者退出系统 7. 扩展点
[此用例的扩展点,通常是用例图中的extent 关系。] 用例2. 信息查询 1.1 简要说明
教务人员通过学生信息管理模块来管理学生信息,如进行学生信息的添加、修改、删除等。 2. 上下文图
图2 “信息查询用例子图”
3. 事件流 3.1 基本流
E1: 教务人员选择“添加学生”
E1.1 教务人员输入新学生的基本信息(学号、姓名、性别、出生日期、学生
联系电话、家庭住址、家庭联系电话等); E1.2 教务人员点击保存;
E1.3 系统检查已有的学生学号,如果学号重复则转到A1;如果学号不重复且学生信息添加完整,则保存该学生信息到学生信息表中; E2 教务人员“删除学生信息”
E2.1 教务人员输入或选择学生班级;
E2.2 教务人员输入或选择要删除的学生学号; E2.3 系统提示教务人员“确认删除” E2.3 教务人员点击“确认”
E2.3 系统检查要删除学生的“班级”和“学号”,如果输入的“班级”或“学
号”在系统中不存在,则转到A2;否则,删除该学号的学生信息和该学号相关的成绩信息;
E3 教务人员选择“修改学生信息”
E3.1 教务人员输入或选择要修改学生所在班级; E3.2 教务人员输入或选择要修改的学生学号;
E3.3 系统检查要修改学生的班级或学号,如果要修改的“班级”或“学号”在系统中不存在,则转到A3;否则,系统提前该学生的基本信息,显示在界面上,学生的学号不允许修改;
E3.4 教务人员录入该学生的修改信息;
E3.4 教务人员点击保存,系统将修改后的信息保存到学生信息表中。 3.2 备选流
3.2.1 第一备选流
A1:系统提示“已经存在该学号的学生,请核对学生学号信息”,系统返回到添加学生信息的界面; A2:系统提示“要删除学生的班级或学号不存在,请确认”,系统返回到删除界面; A3:系统提示“要修改学生的班级或学号不存在,请确认”,系统返回到修改界面; 3.2.1.1 备选支流
[如果能使表达更明确,备选流又可再分为多个支流。] 3.2.2 第二备选流
[在一个用例中很可能会有多个备选流。为了使表达更清晰,应将各个备选流分开说明。使用备选流可以提高用例的可读性,并防止将用例分解为过多的层次。应切记,用例只是文本说明,其主要目的是以清晰、简洁、易于理解的方式记录系统的行为。] 4. 非功能需求
[在这个小节中,主要对该用例所涉及的非功能性需求进行描述。由于其通常很难以在事件流中进行表述,因此单列为一小节进行阐述。这些需求通过包括法律法规、应用程序标准、质量属性(可用性、可靠性、性能、支持性等)、兼容性、可移植性,以及设计约束等方面的需求。在这些需求的描述方面,一定要注意使其可度量、可验证,否则就容易流于形式,形同摆设。] 5. 前置条件
教务人员须先进行身份验证,登陆到教务系统 6. 后置条件
教务人员完成学生信息管理操作后,可以返回到系统主界面或者退出系统 7. 扩展点
[此用例的扩展点,通常是用例图中的extent 关系。]
2 实体类分析
2.1 实体类(名词分析方法)
角色:学生、教务人员、系统管理员、教师
实体:班级信息、课程信息、学生信息、教师信息、 行为结果:学生成绩、教师授课信息、教学任务
2.2 实体类之间的关系分析
学生、教务人员、系统管理员、教师 都是使用系统的用户;
系统管理员管理(添加、删除)学生、教务人员、系统管理员、教师用户; 学生 选修 课程 教师 教授 课程 班级 安排 课程
2.3 初步的类图
图3 业务类图
3 用例实现
3.1 用例实现类图(实现某个用例的实体类、边界类、控制类以及它们之间的关系,参考书上图11.31)
1 学生信息管理用例类图
图4学生信息管理用例类图
2 教师信息管理用例类图
图5教师信息管理用例类图
3 班级信息管理用例类图
图6班级信息管理用例类图
4 课程信息管理
图7课程信息管理类图
5 成绩信息管理
图8 成绩信息管理类图
其他用例的类图类似……
3.2 用例场景实现(顺序图或协作图,参考书上图11.35) 1、学生信息管理用例顺序图
图9学生信息管理用例顺序图
其他待续…….
4 完善后的类图(参考书上图11.59) 5 界面设计
1)“学生信息管理 ”模块界面设计
(1) 该应用程序基于命令行用户界面 (2) 首先出现如下的一级功能菜单: 1——学生信息添加 2——学生信息删除 3——学生信息更新 4——退出
6 面向对象设计
1)“学生信息管理 ”用例类的设计
(1) Student类,该类表示学生类,根据文件中的学生信息,至少需要定义下列成员变量:学生学号、学生姓名、学生年龄、学生专业、学生班号。然后定义相应的构造方法和上述成员变量的getter/setter。
(2) Frm_Student类,该类用于显示学生信息管理界面,根据前述的需求分析,至少需要定义如下方法:
public static void showMainMenu()
public static void showAddStudent()
public static void showUpdateStudent()
public static void showDeleteStudent()
(3)Con_Student类,该类完成具体的功能,如学生信息添加、修改和修改。 添加功能:
public static void addStudent(Student stu)
public static void deleteStudent(Student stu)
public static void updateStudent(Student stu)
(4)定义应用程序测试类StudentTestApplication
其他用例类的设计类似
………..
7 面向对象实现(可以打一个代码包)
1)“学生信息管理 ”用例类的实现
(1)Student 类的实现
import java.sql.*;
public class Student{
public Student() { }
public String getName() {
return sname;
}
public void setName(String name) {
this .sname = name;
}
public String getStudentNo() {
return sno;
}
public void setStudentNo(String sno) {
this .sno = sno;
}
public String getAge() {
return sage;
}
public void setAge(int age) {
this .sage = age;
}
public String getMagjor() {
return smajor;
}
public void setMajor(String major) {
this .smajor = major; }
public void setDsno(String dsno)
{
this .dsno = dsno
}
public String getDsno()
{
return this .dsno
}
private String sname ;// student name
private String sno ;// student number
private int sage ;// student age
private String smajor; // student major
private String dsno; // student class number
}
(2)Con_Student类的实现
import java.sql.*;
public class ConStudent{
public ConStudent() { }
public static void addStudent(Student stu){ Statement ps;
ResultSet rs;
Connection con;
String url;
// Connect Database
try {
name
"com.microsoft.sqlserver.jdbc.SQLServerDriver" ;
url ="jdbc:sqlserver://localhost:1433; DatabaseName=student";
Class.forName(name);
con = DriverManager.getConnection(url, "shang" , "shang123" );
ps
ResultSet.CONCUR_READ_ONLY);
}
catch (Exception err) {
String error = err.getMessage();
System.out.println("Database Connect Err" + error);
}
// Save Object Student to table Student
try { = = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ps.executeUpdate("Insert Into student Values('" +stu.sno +
"','" +stu.sname +
"','" +stu.sage + "','"
+stu.smajor + "','" +stu.dsno + "')" );
this .dispose();
}
catch (SQLException sqle) {
String error = sqle.getMessage();
System.out.println("save student error " + error);
}
// Close JDBC
if (rs != null ){
try {
rs.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
if (ps != null ){
try {
ps.close() ;
}catch (SQLException e){
e.printStackTrace() ;
}
}
if (con != null ){
try {
con.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
}
public static void deleteStudent(Student stu){ Statement ps;
ResultSet rs;
Connection con;
String url;
// Connect Database
try {
name
"com.microsoft.sqlserver.jdbc.SQLServerDriver" ;
url
Class.forName(name);
con = DriverManager.getConnection(url, "shang" , "shang123" );
ps
ResultSet.CONCUR_READ_ONLY);
}
catch (Exception err) {
String error = err.getMessage();
System.out.println("Database Connect Err" + error);
}
// Delete Object Student from table Student = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ="jdbc:sqlserver://localhost:1433; DatabaseName=student"; =
try {
ps.executeUpdate("DELETE FROM student WHERE sno = " + stu.sno );
this .dispose();
}
catch (SQLException sqle) {
String error = sqle.getMessage();
System.out.println("save student error " + error);
}
// Close JDBC
if (rs != null ){ //
try {
rs.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
if (ps != null ){
try {
ps.close() ;
}catch (SQLException e){
e.printStackTrace() ;
}
}
if (con != null ){
try {
con.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
public static void updateStudent(Student stu) {
Statement ps;
ResultSet rs;
Connection con;
String url;
// Connect Database
try {
name
"com.microsoft.sqlserver.jdbc.SQLServerDriver" ;
url
Class.forName(name);
con = DriverManager.getConnection(url, "shang" , "shang123" );
ps
ResultSet.CONCUR_READ_ONLY);
}
catch (Exception err) {
String error = err.getMessage();
System.out.println("Database Connect Err" + error);
}
// update Object Student from table Student
try { = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ="jdbc:sqlserver://localhost:1433; DatabaseName=student"; =
String sql = "UPDATE Registration " + "SET age = 30 WHERE id in (100, 101)"; ps.executeUpdate("UPDATE student SET sno = " + stu.sno + "sname = " + stu.sname + "sage = " + stu.sage + "smajor = " + stu.smajor + "dsno = " + stu.dsno ); this .dispose();
}
catch (SQLException sqle) {
String error = sqle.getMessage();
System.out.println("update student error " + error);
}
// Close JDBC
if (rs != null ){ //
try {
rs.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
if (ps != null ){
try {
ps.close() ;
}catch (SQLException e){
e.printStackTrace() ;
}
}
if (con != null ){
try {
con.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
}
}
(3)Frm_Student类的实现
import java.io.IOException;
import java.util.Scanner;
public class FrmStudent{
public static void showMainMenu()
{
boolean exitFlag = false ;
System.out.println("1 Add a new student");
System.out.println("2 Delete a student from table" );
System.out.println("3 Update student from student table");
System.out.println("4 exit");
while (true ) {
System.out.print("please
code" );
Scanner s = new Scanner(System.in);
int choice = s.nextInt();
switch (choice) {
case 1: showAddStudent(); break ;
case 2: showDeleteStudent();
break ;
case 3: showUpdateStudent();
break ;
case 4: exitFlag = true ;
break ;
default : System.err.println("error input 8 again" );
} choose function
if (exitFlag) {
break ;
}
}
}
public static void showAddStudent()
{
private String sname ;// student name private String sno ;// student number private int sage ;// student age
private String smajor; // student major
private String dsno; // student class number Scanner scanner = new Scanner(System.in); System.out.print("\t input student number"); sno = scanner.next();
Scanner scanner = new Scanner(System.in); System.out.print("\t input student name"); sname = scanner.next();
Scanner scanner = new Scanner(System.in); System.out.print("\t input student age"); sage = scanner.next();
Scanner scanner = new Scanner(System.in); System.out.print("\t input student major"); smajor = scanner.next();
Scanner scanner = new Scanner(System.in);
System.out.print("\t input student class number" );
dsno = scanner.next();
Student stu = new Student();
stu.setName(sname);
stu.setStudentNo(sno);
stu.setAge(sage);
stu.setMajor(smajor);
stu.setDsno(dsno);
ConStudent.addStudent(stu);
}
public static void showUpdateStudent(){}
public static void showDeleteStudent(){}
}
9 测试(见测试文档)
面向对象分析与设计
1 用例模型分析 1.1 需求描述
1)学生信息管理
教务人员通过学生信息管理模块来管理学生信息,如进行学生信息的添加、修改、删除等。在进行学生信息的添加时,要进行学生学号是否有重复的检查,如果添加的学生编号有重复就要对用户进行提示。只有在不重复的情况下才能进行信息的添加。在进行信息的删除时,要首先提示用户确认是否要删除,只有在用户确认的情况下才能进行信息的删除。在进行信息的修改时,要根据用户选定的学生进行修改,即列出用户选定的学生的所有信息,在这个基础上进行学生信息的修改。 2)教师信息管理
教务工作人员通过此模块来管理教师信息,包括教师信息的添加、修改、删除等。在进行教师信息的添加时候,要进行教师编号是否重复的检验,如果添加的教师编号重复要对用户进行提示,只有在不重复的情况下才能进行信息的添加。在进行信息的删除时,要提示用户确认是否删除,只有在用户确认后才能够进行信息的删除。在进行信息的修改时,要能够根据用户选定的教师项进行修改,即列出用户选定的教师的所有信息,在这个基础上进行班级信息的修改。 3)班级信息管理
教务工作人员通过此模块来管理班级的信息,包括班级信息的添加,修改,删除等。在进行班级信息的添加时,要进行班级的编号是否重复的检查,如果添加的班级编号重复要对用户进行提示,只有在信息不重复的前提下才能进行信息的添加,在进行信息的删除时,要提示用户确认是否删除,只有用户确认后才能进行信息的删除。在进行信息的修改时,要能根据用户选定的班级进行修改,即列出用户选定的班级的所有信息,在这个基础上进行班级信息的修改。 4)课程信息管理
教务工作人员通过该模块来管理课程的基本信息,包括: (1) 课程信息等的添加,修改,删除。
在进行信息的添加时,打开新的窗口进行信息的录入,在保存的时候要进行课程的编号
是否重复的检查,如果添加的课程编号重复的要对用户进行提示,只有在不重复的情况下才能进行信息的添加。在进行信息的删除的时候,要让用户确认是否要删除,只有确认后才能进行删除操作。在进行信息的修改的时候,要根据用户选定的课程进行修改,即列出用户选定课程的信息,在这个基础上进行课程信息的修改。
(2)班级课程的设置(教学任务)。 (3)教师授课信息的设置。 5)成绩信息管理
任课教师可以通过该模块录入自己担任的某门课的成绩,在录入学生成绩的时,教师选定课程并选定学生班级,才能输入学生成绩。教务工作人员通过该模块来进行学生成绩的修改。
6)综合信息查询
通过该模块可以查询教务所需要的各种信息。
学生能够查询:个人基本信息、个人成绩信息、班级上课信息;
教务人员可以查询:学生基本信息、教师基本信息、课程信息、班级信息、学生成绩信息; 7)系统维护
系统管理员能够创建和维护教师、学生、教务管理员等用户账号信息。
1.2 用例图
系统管理员
图1 教务管理系统用例图
1.3 用例描述
用例1. 学生信息管理 1.1 简要说明
教务人员通过学生信息管理模块来管理学生信息,如进行学生信息的添加、修改、删除等。 2. 上下文图
教务人员
图2 “学生信息管理用例”
3. 事件流 3.1 基本流
E1: 教务人员选择“添加学生”
E1.1 教务人员输入新学生的基本信息(学号、姓名、性别、出生日期、学生
联系电话、家庭住址、家庭联系电话等); E1.2 教务人员点击保存;
E1.3 系统检查已有的学生学号,如果学号重复则转到A1;如果学号不重复且学生信息添加完整,则保存该学生信息到学生信息表中; E2 教务人员“删除学生信息”
E2.1 教务人员输入或选择学生班级;
E2.2 教务人员输入或选择要删除的学生学号; E2.3 系统提示教务人员“确认删除” E2.3 教务人员点击“确认”
E2.3 系统检查要删除学生的“班级”和“学号”,如果输入的“班级”或“学号”在系统中不存在,则转到A2;否则,删除该学号的学生信息和该学号相关的成绩信息;
E3 教务人员选择“修改学生信息”
E3.1 教务人员输入或选择要修改学生所在班级; E3.2 教务人员输入或选择要修改的学生学号;
E3.3 系统检查要修改学生的班级或学号,如果要修改的“班级”或“学号”在系统中不存在,则转到A3;否则,系统提前该学生的基本信息,显示在界面上,学生的学号不允许修改;
E3.4 教务人员录入该学生的修改信息;
E3.4 教务人员点击保存,系统将修改后的信息保存到学生信息表中。 3.2 备选流
3.2.1 第一备选流
A1:系统提示“已经存在该学号的学生,请核对学生学号信息”,系统返回到添加学生信息的界面; A2:系统提示“要删除学生的班级或学号不存在,请确认”,系统返回到删除界面; A3:系统提示“要修改学生的班级或学号不存在,请确认”,系统返回到修改界面; 3.2.1.1 备选支流
[如果能使表达更明确,备选流又可再分为多个支流。] 3.2.2 第二备选流
[在一个用例中很可能会有多个备选流。为了使表达更清晰,应将各个备选流分开说明。使用备选流可以提高用例的可读性,并防止将用例分解为过多的层次。应切记,用例只是文本说明,其主要目的是以清晰、简洁、易于理解的方式记录系统的行为。] 4. 非功能需求
[在这个小节中,主要对该用例所涉及的非功能性需求进行描述。由于其通常很难以在事件流中进行表述,因此单列为一小节进行阐述。这些需求通过包括法律法规、应用程序标准、质量属性(可用性、可靠性、性能、支持性等)、兼容性、可移植性,以及设计约束等方面的需求。在这些需求的描述方面,一定要注意使其可度量、可验证,否则就容易流于形式,形同摆设。] 5. 前置条件
教务人员须先进行身份验证,登陆到教务系统 6. 后置条件
教务人员完成学生信息管理操作后,可以返回到系统主界面或者退出系统 7. 扩展点
[此用例的扩展点,通常是用例图中的extent 关系。] 用例2. 信息查询 1.1 简要说明
教务人员通过学生信息管理模块来管理学生信息,如进行学生信息的添加、修改、删除等。 2. 上下文图
图2 “信息查询用例子图”
3. 事件流 3.1 基本流
E1: 教务人员选择“添加学生”
E1.1 教务人员输入新学生的基本信息(学号、姓名、性别、出生日期、学生
联系电话、家庭住址、家庭联系电话等); E1.2 教务人员点击保存;
E1.3 系统检查已有的学生学号,如果学号重复则转到A1;如果学号不重复且学生信息添加完整,则保存该学生信息到学生信息表中; E2 教务人员“删除学生信息”
E2.1 教务人员输入或选择学生班级;
E2.2 教务人员输入或选择要删除的学生学号; E2.3 系统提示教务人员“确认删除” E2.3 教务人员点击“确认”
E2.3 系统检查要删除学生的“班级”和“学号”,如果输入的“班级”或“学
号”在系统中不存在,则转到A2;否则,删除该学号的学生信息和该学号相关的成绩信息;
E3 教务人员选择“修改学生信息”
E3.1 教务人员输入或选择要修改学生所在班级; E3.2 教务人员输入或选择要修改的学生学号;
E3.3 系统检查要修改学生的班级或学号,如果要修改的“班级”或“学号”在系统中不存在,则转到A3;否则,系统提前该学生的基本信息,显示在界面上,学生的学号不允许修改;
E3.4 教务人员录入该学生的修改信息;
E3.4 教务人员点击保存,系统将修改后的信息保存到学生信息表中。 3.2 备选流
3.2.1 第一备选流
A1:系统提示“已经存在该学号的学生,请核对学生学号信息”,系统返回到添加学生信息的界面; A2:系统提示“要删除学生的班级或学号不存在,请确认”,系统返回到删除界面; A3:系统提示“要修改学生的班级或学号不存在,请确认”,系统返回到修改界面; 3.2.1.1 备选支流
[如果能使表达更明确,备选流又可再分为多个支流。] 3.2.2 第二备选流
[在一个用例中很可能会有多个备选流。为了使表达更清晰,应将各个备选流分开说明。使用备选流可以提高用例的可读性,并防止将用例分解为过多的层次。应切记,用例只是文本说明,其主要目的是以清晰、简洁、易于理解的方式记录系统的行为。] 4. 非功能需求
[在这个小节中,主要对该用例所涉及的非功能性需求进行描述。由于其通常很难以在事件流中进行表述,因此单列为一小节进行阐述。这些需求通过包括法律法规、应用程序标准、质量属性(可用性、可靠性、性能、支持性等)、兼容性、可移植性,以及设计约束等方面的需求。在这些需求的描述方面,一定要注意使其可度量、可验证,否则就容易流于形式,形同摆设。] 5. 前置条件
教务人员须先进行身份验证,登陆到教务系统 6. 后置条件
教务人员完成学生信息管理操作后,可以返回到系统主界面或者退出系统 7. 扩展点
[此用例的扩展点,通常是用例图中的extent 关系。]
2 实体类分析
2.1 实体类(名词分析方法)
角色:学生、教务人员、系统管理员、教师
实体:班级信息、课程信息、学生信息、教师信息、 行为结果:学生成绩、教师授课信息、教学任务
2.2 实体类之间的关系分析
学生、教务人员、系统管理员、教师 都是使用系统的用户;
系统管理员管理(添加、删除)学生、教务人员、系统管理员、教师用户; 学生 选修 课程 教师 教授 课程 班级 安排 课程
2.3 初步的类图
图3 业务类图
3 用例实现
3.1 用例实现类图(实现某个用例的实体类、边界类、控制类以及它们之间的关系,参考书上图11.31)
1 学生信息管理用例类图
图4学生信息管理用例类图
2 教师信息管理用例类图
图5教师信息管理用例类图
3 班级信息管理用例类图
图6班级信息管理用例类图
4 课程信息管理
图7课程信息管理类图
5 成绩信息管理
图8 成绩信息管理类图
其他用例的类图类似……
3.2 用例场景实现(顺序图或协作图,参考书上图11.35) 1、学生信息管理用例顺序图
图9学生信息管理用例顺序图
其他待续…….
4 完善后的类图(参考书上图11.59) 5 界面设计
1)“学生信息管理 ”模块界面设计
(1) 该应用程序基于命令行用户界面 (2) 首先出现如下的一级功能菜单: 1——学生信息添加 2——学生信息删除 3——学生信息更新 4——退出
6 面向对象设计
1)“学生信息管理 ”用例类的设计
(1) Student类,该类表示学生类,根据文件中的学生信息,至少需要定义下列成员变量:学生学号、学生姓名、学生年龄、学生专业、学生班号。然后定义相应的构造方法和上述成员变量的getter/setter。
(2) Frm_Student类,该类用于显示学生信息管理界面,根据前述的需求分析,至少需要定义如下方法:
public static void showMainMenu()
public static void showAddStudent()
public static void showUpdateStudent()
public static void showDeleteStudent()
(3)Con_Student类,该类完成具体的功能,如学生信息添加、修改和修改。 添加功能:
public static void addStudent(Student stu)
public static void deleteStudent(Student stu)
public static void updateStudent(Student stu)
(4)定义应用程序测试类StudentTestApplication
其他用例类的设计类似
………..
7 面向对象实现(可以打一个代码包)
1)“学生信息管理 ”用例类的实现
(1)Student 类的实现
import java.sql.*;
public class Student{
public Student() { }
public String getName() {
return sname;
}
public void setName(String name) {
this .sname = name;
}
public String getStudentNo() {
return sno;
}
public void setStudentNo(String sno) {
this .sno = sno;
}
public String getAge() {
return sage;
}
public void setAge(int age) {
this .sage = age;
}
public String getMagjor() {
return smajor;
}
public void setMajor(String major) {
this .smajor = major; }
public void setDsno(String dsno)
{
this .dsno = dsno
}
public String getDsno()
{
return this .dsno
}
private String sname ;// student name
private String sno ;// student number
private int sage ;// student age
private String smajor; // student major
private String dsno; // student class number
}
(2)Con_Student类的实现
import java.sql.*;
public class ConStudent{
public ConStudent() { }
public static void addStudent(Student stu){ Statement ps;
ResultSet rs;
Connection con;
String url;
// Connect Database
try {
name
"com.microsoft.sqlserver.jdbc.SQLServerDriver" ;
url ="jdbc:sqlserver://localhost:1433; DatabaseName=student";
Class.forName(name);
con = DriverManager.getConnection(url, "shang" , "shang123" );
ps
ResultSet.CONCUR_READ_ONLY);
}
catch (Exception err) {
String error = err.getMessage();
System.out.println("Database Connect Err" + error);
}
// Save Object Student to table Student
try { = = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ps.executeUpdate("Insert Into student Values('" +stu.sno +
"','" +stu.sname +
"','" +stu.sage + "','"
+stu.smajor + "','" +stu.dsno + "')" );
this .dispose();
}
catch (SQLException sqle) {
String error = sqle.getMessage();
System.out.println("save student error " + error);
}
// Close JDBC
if (rs != null ){
try {
rs.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
if (ps != null ){
try {
ps.close() ;
}catch (SQLException e){
e.printStackTrace() ;
}
}
if (con != null ){
try {
con.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
}
public static void deleteStudent(Student stu){ Statement ps;
ResultSet rs;
Connection con;
String url;
// Connect Database
try {
name
"com.microsoft.sqlserver.jdbc.SQLServerDriver" ;
url
Class.forName(name);
con = DriverManager.getConnection(url, "shang" , "shang123" );
ps
ResultSet.CONCUR_READ_ONLY);
}
catch (Exception err) {
String error = err.getMessage();
System.out.println("Database Connect Err" + error);
}
// Delete Object Student from table Student = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ="jdbc:sqlserver://localhost:1433; DatabaseName=student"; =
try {
ps.executeUpdate("DELETE FROM student WHERE sno = " + stu.sno );
this .dispose();
}
catch (SQLException sqle) {
String error = sqle.getMessage();
System.out.println("save student error " + error);
}
// Close JDBC
if (rs != null ){ //
try {
rs.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
if (ps != null ){
try {
ps.close() ;
}catch (SQLException e){
e.printStackTrace() ;
}
}
if (con != null ){
try {
con.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
public static void updateStudent(Student stu) {
Statement ps;
ResultSet rs;
Connection con;
String url;
// Connect Database
try {
name
"com.microsoft.sqlserver.jdbc.SQLServerDriver" ;
url
Class.forName(name);
con = DriverManager.getConnection(url, "shang" , "shang123" );
ps
ResultSet.CONCUR_READ_ONLY);
}
catch (Exception err) {
String error = err.getMessage();
System.out.println("Database Connect Err" + error);
}
// update Object Student from table Student
try { = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ="jdbc:sqlserver://localhost:1433; DatabaseName=student"; =
String sql = "UPDATE Registration " + "SET age = 30 WHERE id in (100, 101)"; ps.executeUpdate("UPDATE student SET sno = " + stu.sno + "sname = " + stu.sname + "sage = " + stu.sage + "smajor = " + stu.smajor + "dsno = " + stu.dsno ); this .dispose();
}
catch (SQLException sqle) {
String error = sqle.getMessage();
System.out.println("update student error " + error);
}
// Close JDBC
if (rs != null ){ //
try {
rs.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
if (ps != null ){
try {
ps.close() ;
}catch (SQLException e){
e.printStackTrace() ;
}
}
if (con != null ){
try {
con.close() ;
}catch (SQLException e)
{
e.printStackTrace() ;
}
}
}
}
(3)Frm_Student类的实现
import java.io.IOException;
import java.util.Scanner;
public class FrmStudent{
public static void showMainMenu()
{
boolean exitFlag = false ;
System.out.println("1 Add a new student");
System.out.println("2 Delete a student from table" );
System.out.println("3 Update student from student table");
System.out.println("4 exit");
while (true ) {
System.out.print("please
code" );
Scanner s = new Scanner(System.in);
int choice = s.nextInt();
switch (choice) {
case 1: showAddStudent(); break ;
case 2: showDeleteStudent();
break ;
case 3: showUpdateStudent();
break ;
case 4: exitFlag = true ;
break ;
default : System.err.println("error input 8 again" );
} choose function
if (exitFlag) {
break ;
}
}
}
public static void showAddStudent()
{
private String sname ;// student name private String sno ;// student number private int sage ;// student age
private String smajor; // student major
private String dsno; // student class number Scanner scanner = new Scanner(System.in); System.out.print("\t input student number"); sno = scanner.next();
Scanner scanner = new Scanner(System.in); System.out.print("\t input student name"); sname = scanner.next();
Scanner scanner = new Scanner(System.in); System.out.print("\t input student age"); sage = scanner.next();
Scanner scanner = new Scanner(System.in); System.out.print("\t input student major"); smajor = scanner.next();
Scanner scanner = new Scanner(System.in);
System.out.print("\t input student class number" );
dsno = scanner.next();
Student stu = new Student();
stu.setName(sname);
stu.setStudentNo(sno);
stu.setAge(sage);
stu.setMajor(smajor);
stu.setDsno(dsno);
ConStudent.addStudent(stu);
}
public static void showUpdateStudent(){}
public static void showDeleteStudent(){}
}
9 测试(见测试文档)