图8.19 主体界面框架
功能说明:
? 左上部是主功能导航器视图(简称为主功能导航器或主功能视图),其中提供了一个功能结点树,本章将实现“档案管理”和“成绩管理”两个结点的功能。 ? 右部是一个编辑器,当单击“档案管理”结点时将生成一个编辑器。 ? 左下部是成绩管理的搜索视图,可以根据这个视图设置的搜索条件,查询出相应的考试成绩。
? 右部还有一个名为“2003-12-11段考”的编辑器,当单击左下部的“搜索”按钮时将生成此编辑器,如下图8.20所示:
图8.20 成绩编辑器 8.2.2 面向对象的分析与设计
面向对象的分析与设计,也称OOAD(Object Oriented Analyse Design)。因为它能够更准确自然的用软件语言来描述现实事物,并使得在它基础上构建的软件具有更好的复用率、扩展性及可维护性,所以OOAD是当前最重要的软件方法学之一。 OOAD和Rose、Together等UML软件没有必然的关系,OOAD是一种方法,UML是描述这种方法的图形语言,而Rose等则是使用UML的具体工具。OOAD的关键在于思维方式的转变,而不是工具的使用,即使只用铅笔和白纸也可以成为一个优秀OOAD专家。
现在大学的课程以C、Basic、VB、FoxPro居多,即使是用C++、Java,也是可以用面向过程的方式来编写程序,所以使用面向对象的语言并不代表你是以面向对象的方式来思考和编
程。徒具对象的形,而无对象的神,是现在一般程序员的最大缺陷所在。 以本项目为例,大多数习惯于面向过程的编程思维方式的开发人员,一般在做完需求分析后,便开始设计数据库的表结构,而在编码阶段才开始考虑根据表结构来进行对象的设计与创建,这种开发方式就是带有过去很深的面向过程、面向数据库表编程的烙印。 所谓“万物皆对象”,OOAD应该是把对象做为思考的核心,而不是仅仅把“对象”当成一种编程的手段,应当先完成对象设计,然后再根据对象创建表,这是最基本的次序。
当然这种方式在转化成数据库时会遇到一些困难和阻力,毕竟数据库不是面向对象的,SQL语言也不是面向对象的。但Hibernate、JDO、EJB等数据库持久化技术,已经可以让开发者用完全的面向对象方式来编程,而不必忍受“对象”到“关系”转化的痛苦。
为了让读者可以了解如何手工完成“对象”到“关系”的转化,本插件项目仍然使用纯JDBC方式来实现。在第9章会讲解Hibernate的使用,所谓“先苦后甜”,通过两种方式的比较,读者能更深的体会Hibernate等数据库持久化技术的美妙之处。
本章的学生成绩管理软件有以下对象:学生、老师、年级、班级、课程、成绩、考试,本项目所有对象创建在cn.com.chengang.sms.model包下,如下图8.21所示。接下来会具体分析一下这些对象,并给出其源代码和UML类图。
图8.21 数据对象所在的包
1、用户对象:学生、老师
这个系统有可能会存在一个前台网站,比如:老师用Eclipse做客户端来管理成绩,而学生则通过一个网页来查询成绩,所有的数据集中在学校的中心服务器上。因此系统的用户有两种:学生、老师,这两种用户有一些信息是相同的,有些则不同。比如他们都有用户名、姓名、密码等,而学生没有老师的课程属性,老师则没有学生的班级属性。
由上面的分析,我们将两种用户的共性抽象成一个接口:IUser,这个接口有如下属性:数据库ID号(Id)、用户名(userId)、密码(password)、姓名(name)、最后登录时间(latestOnline)。另外,学生类(Student)有班级属性(SchoolClass),老师类(Teacher)则有课程(Course)属性,学生类和老师类都实现于IUser接口。
将用户抽象成一个接口的另一个好处就是:使用户类置于同一个规范之下。今后要新增加一个种类型的用户,比如:家长用户,只需要再实现IUser接口即可。“接口”是用Java进行OOAD开发的一个最重要的概念,也是成为一个优秀的Java设计师所必须掌握和熟练使用的概念。
其他说明:类的实例变量有多种叫法:通用的名称是“实例变量”或“属性”;在实体类中因为和数据表的字段相对应,也可称之为“字段”;有些书籍文章也称之为“域”。 先给出用户类的UML设计图,如下图8.22所示:
图8.22 用户类的源代码如下: (1)用户接口IUser
package cn.com.chengang.sms.model; import java.util.Date; public interface IUser { /**
* 得到数据库ID */
public Long getId(); /**
* 设置数据库ID */
public void setId(Long id); /**
用户类的UML类图
* 得到用户名 */
public String getUserId(); /**
* 设置用户名 */
public void setUserId(String userId); /** * 得到密码 */
public String getPassword(); /** * 设置密码 */
public void setPassword(String password); /**
* 得到用户姓名 */
public String getName(); /**
* 设置用户姓名 */
public void setName(String name); /**
* 得到最后登录时间 */
public Date getLatestOnline(); /**
* 设置最后登录时间 */
public void setLatestOnline(Date date); }
程序说明:
? 接口规定只能定义方法,不能定义属性变量,所以本例只定义了用户各属性的set/get方法。
? 接口定义的方法前面是否有public或abstract都是一样的,本例加了public,你也可以去除,两者效果相同。