目 录
1.1问题描述………………………………………………………………………1
1.2功能概述………………………………………………………………………1
1.3技术选型………………………………………………………………………2
2.1总体设计………………………………………………………………………2
2.2功能模块设计…………………………………………………………………2
2.3总体UML类图…………………………………………………………………3
2.4关键方法流程图………………………………………………………………5
2.5界面设计………………………………………………………………………6
2.6系统测试………………………………………………………………………6
三.总结反思………………………………………………………………………………11
本项目实现了高校人员信息管理系统的设计与开发,完成了对教师、实验员、行政人员和教师兼行政人员等四类员工信息的管理。该系统包括添加、查询、显示、编辑、删除、统计、保存和读取等功能。
在项目开发过程中,我们首先进行了需求分析,确保我们完全理解用户的期望和需求。
在实现功能方面,我们实现了添加功能,允许用户随意添加四类员工的记录。为了确保数据的完整性,我们要求员工的编号必须唯一。如果用户尝试添加重复编号的记录,则系统会给出警告并取消添加。
另外,我们还实现了查询功能,用户可以根据编号、姓名等信息对已添加的记录进行查询。如果查询结果为空,系统会给出相应的提示信息。如果找到匹配的记录,系统将显示相应的记录信息。
系统还提供了显示功能,能够展示当前系统中所有的员工记录,每条记录占据一行。这样,用户可以在一览无余的情况下查看所有记录。
为了满足用户的修改需求,我们实现了编辑功能。用户可以根据查询结果对相应的记录进行修改,需要注意的是,修改时必须保证编号的唯一性。
此外,系统还提供了删除功能,用户可以选择删除已添加的员工记录。如果当前系统中没有相应的人员记录,系统会提示"记录为空!"并返回操作。如果找到匹配的记录,用户可以输入要删除的员工编号或姓名,系统将根据输入的信息删除该员工记录。如果没有找到匹配的员工信息,系统会提示相应的记录不存在。
为了满足统计需求,我们实现了统计功能,可以根据多种参数对员工进行统计。包括四类员工数量的统计以及总数的统计,还能统计男、女员工的数量。
为了方便数据的保存和读取,系统提供了保存功能和读取功能。用户可以将当前系统中各类员工记录存入文件中,并随时从文件中读取员工信息到当前系统中使用。
在项目开发的过程中,我学到了需求分析的重要性。同时,我们也注重异常处理和错误提示机制的设计,提升系统的容错性和用户体验。另外,使用面向对象编程(OOP)的思想,并采用继承关系,简化代码结构,提高系统的可拓展性。
同时,我还学到了在项目开发中,不能仅仅只关注代码的编写和盲目的一味的完成任务需求,应该注重规范和条理——也就是开发的设计也很重要。因为对于项目而言,设计的工程量大,一气呵成式的完成任务可能会十分困难,而且会出现很多意想不到的错误,这样反而效率更低。
因此,应该先设计好程序,注意流程图和UML图,以及类图的设计,帮助我们清晰的清楚项目所需,以及清晰自己应该如何编写代码。这样使得程序设计更加直观简洁,就可以大大提高项目开发的效率。
以下是一些实际开发中的具体例子:
如设计
//用equals语句来判断是否存在重复id
private boolean idExists(String id)//判断id是否存在的方法
{
for(int i=0;i<count;i++)
if(persons[i].id.equals(id))
return true;
return false;
}
private int findIndexById(String id)//查找id的方法
{
for(int i=0;i<count;i++)
if(persons[i].id.equals(id))
return i;
return -1;
}
这两个方法时,我学会了使用equals和遍历对象数组的方式来实现查找和判断是否存在。
对于不同数据对应不同的对象的输入和储存,我学会了使用Instanceof来判断指定类,对象,这样就能确保数据的对应存放
同时在编写中我也注意到了一些逻辑错误,并且提高了思维的严密性如:
编辑的人只有编号是唯一确定的,不能用名字不然会冲突;
不改编号,因为编号是唯一的!
记得写break;免得一直遍历下去;
private会让外界无法访问变量,必须要用方法来设置!
所以索性直接改为protected
男和女的员工跟职业角色是互相交错的,所以要重新设一个if,不能再继续else if等等...
另外,我还学会了强制转化类的用法:
“`(Teacher) persons[index]` 是 Java 中的强制类型转换语法,将 `persons[index]` 强制转换为 `Teacher` 类型。这是因为 `persons` 数组中的元素类型是 `Person`,但我们需要访问其中 `Teacher` 类型的属性 `major`。
在进行强制类型转换之后,我们就可以使用点号(`.`)来访问 `Teacher` 类中的 `major` 属性了,即 `((Teacher) persons[index]).major`。
请注意,强制类型转换也可能会导致运行时错误。如果 `persons[index]` 不是 `Teacher` 类或其子类的实例,则转换会失败并抛出 `ClassCastException`。”
进一步理解和概括:前面是因为persons中有display,但是我们现在想要修改子类中的数据,又没有实例子类,而父类中又没有那些成员,所以就要强制转化来实现直接修改的功能。
同时,我也学会了如何实现删除的操作——使用人的类的对象,循环将当前数据后的所有数据向前一位,做到覆盖。更学会了如何读取和保存文件,
具体来说:“首先使用 `FileOutputStream` 类创建了一个输出流 `fos`,用于写入文件。然后,将 `fos` 对象作为参数创建了一个 `ObjectOutputStream` 对象 `oos`,用于将 Java 对象序列化并写入输出流中。
接下来,通过调用 `oos.writeObject(persons)` 方法将 `persons` 数组序列化并写入输出流中。在这里,需要注意的是 `Persons` 类必须实现 `Serializable` 接口,才能被序列化成二进制流。
一个是创造文件,一个是转化成二进制的方式储存。”
同时也明白了,执行文件的操作需要引入Serializable接口,于import java.io.*的库函数中。
下面是详细分析:
(写入文件时,应该先判断文件是否存在,若不存在则创建文件。
根据报错信息,发现 `Teacher` 类没有实现 `Serializable` 接口,无法被序列化写入文件。
要解决这个问题,可以让 `Teacher` 类实现 `Serializable` 接口。步骤如下:
1. 在 `Teacher` 类的定义处,添加 `implements Serializable`。
2. 如果 `Teacher` 类中包含其他对象,这些对象也需要实现 `Serializable` 接口。
修改后的 `Teacher` 类代码如下:
```java
import java.io.Serializable;
public class Teacher implements Serializable {
//成员变量和方法的定义
}
假设你也有其他类,也需要将它们实现 `Serializable` 接口,然后重新运行程序即可。)
在项目开发过程中,我遇到以下的困难,以及相应的解决方式:
1.技术挑战和难题:项目开发中需要复杂的技术实现或面临技术上的困难。这些功能的实现不是这么轻易的直接实现的。它需要扎实的编程技术和算法理解。在这种情况下,我进行了技术研究和评估,寻找最佳的解决方案。我通过阅读文档和技术资料,进行原型开发和验证的方式解决,以不断提升我的技术能力和解决问题的能力,来解决这些问题。
2.缺乏专业知识和技能:面对多个技术难关和挑战,我需要具备广泛的知识和技能。我通过自学、在线教育资源等方式,以提升自己在相关领域的专业知识和技能。此外,我还积极参与社区和技术论坛,与其他开发者交流和分享经验,来完成对于项目需求的代码实现。
3. 时间管理和任务规划:时间管理和任务规划是至关重要的。在对于一个项目的多个问题中,我发现我遇到了不知道如何分配自己的时间,去解决问题而无从下手,手足无措的情况。面对多个任务时,我通过时间管理工具如日历、任务列表等,合理安排时间和设置优先级的方式,制定清晰的项目计划,并坚持执行,可以帮助我有效管理时间和提高工作效率。
以下是实际遇到的困难的具体例子:
void display() { //显示员工信息
System.out.println("编号:" + id + ",姓名:" + name + ",性别:" + gender + ",年龄:" + age);
}
//这竟然是必要的,为什么?
解释:
persons[count++] = new Teacher(id, name, gender, age, department, major, title);
{
因为你在增添数据的时候就是使用了类的联通这个方法
这个意思就是,你在使用person类的方法时,具体用Teacher的方法代替!
好处就是因为persons的变量是通用的,而职业是有多个的,职业的方法不同因此要这么设计
这么写我就不需要开辟一堆对象的空间,我只需要通过继承的方式实现新的不同对象即可。
因为我们输出的时候
persons[i].display();
是这样,也就是根本上来说我们使用的是persons的对象,因为也只开辟了persons的对象空间,
所以当然persons本身要有display方法,只不过具体方法是后面的对象而已,
例如Teacher的display重载
当然可以改进的就是基本数据是不可能被直接输出的,每个人都有自己的职业。所以我们可以写一个空的方法即可。代表persons有该方法,只不过具体实现是看new 的对象!
Ps:你persons都没有display当然不能使用!}
总结起来,我面临的困难可以通过积极学习和提升专业知识、合理管理时间和任务、利用资源和技术支持方式来解决。同时,与其他开发者建立联系、参与社区和团队,可以获得更多支持和帮助,提升自身的开发能力和经验。
整个项目开发过程中得到如下反思与经验:
因此,在项目开始之前,我应该尽可能的掌握用户需求,进行需求的确认。
2. 划分任务和设置里程碑:应该将整个项目划分为小的可管理的任务,并设置适当的里程碑。这样能够帮助我更好地掌握进度、跟踪工作完成情况,并及时调整计划以应对可能出现的问题。同时,任务拆分和里程碑设定有助于提高我的工作效率。
3. 提前预估时间和资源:在项目初期,应该尽可能准确地预估项目所需的时间和资源。考虑到各种因素(如技术难度、),为每个任务和阶段设置合理的时间和资源预算。这样可以避免出现时间和资源不足的情况,提高项目的可控性和成功率。
4. 学会寻求帮助:遇到问题时不要害怕寻求帮助。可以借助社区、论坛、教程、博客等资源来获取技术支持和解决方案。与其他开发者交流,并积极参与相关的讨论和活动,这不仅可以解决问题,还可以扩大自己的知识和网络。
5. 制定明确的计划和时间表:在项目开始之前,应该制定一个明确的计划和时间表。明确项目里程碑和关键任务,并为其设置合理的时间和优先级。这样可以帮助我们更好地组织工作和管理时间,及时发现延迟和问题,并做出相应的调整。
6. 引入版本控制:使用版本控制工具(如Git)进行代码管理是非常重要的。通过使用版本控制,我们可以记录代码的变更历史,并轻松地回退到以前的版本。这有助于避免代码丢失或出现错误,提高代码质量和开发效率。
7. 不断测试和调试:我们应该始终保持对项目进行测试和调试的习惯。通过编写单元测试、集成测试以及手动测试,可以及早发现和修复潜在的问题,提高代码的稳定性和可靠性。
9.
写代码量大,工程大的项目,可以先用自己风格的伪代码把思路理清楚,然后在把正确的代码敲出来这样效率更高!这样就不会因为语法总是打断自己的思路!
10.因为教师和教师行政有相同点,所以case前三个可以合并在一起写.
通过这个项目,我不仅掌握了相关的技术和知识,还深入理解了软件开发过程中的各个环节。持续学习在项目中发挥了重要作用,只有通过不断学习和进步,面对和克服种种技术难关,才能取得更好的成果。