项目开发文档:职工管理系统

项目要求

职工管理系统,管理所有员工信息;
交互界面:显示界面,退出界面
系统基本功能:增加职工,查找职工,修改职工,查找职工
系统附加功能:显示所有职工,清空职工,职工按需排序
其他:数据需要可持续化,这里采用文件作为数据库;

项目配置

开发环境:Windows + VS2019
语言: C++

开发流程

  1. 在之前的项目里,所有的功能我们直接写成全局函数,在接受了类的概念后,现在我们将系统的所有功能封装在一个系统 管理类或者说控制类;
    所以我们可以先创建一个WorkManager类,然后将系统的功能都封装在这个类里,最后用WorkManager类实例化出的对象,使用这些功能;这就是典型的面向对象编程;我们需要思考函数或者变量,属于什么对象,然后创建出这个对象的类,之后用这个类实例化出的对象,进行操作;
  2. 实现交互界面,交互界面也就是交互功能也属于这个系统,所以我们定义一个显示菜单,和退出菜单函数,然后封装在这个WorkManager类里;
  3. 然后就是菜单的逻辑,使用switch结构实现,通过不同的case跳转进不同的功能;
  4. 我们需要职工对象,然后也需要职工对象派生出来的老板对象,经理对象,员工对象;这种很明显具有继承或者说派生关系的模型,我们采取多态的形式去写;当具有分类关系,或者说多个对象可以抽象出一个共同的对象的时候,那我们就考虑多态来写;这里我们直接定义一个抽象职工类,然后根据多态的写法,定义老板类,经理类,员工类,重写职工类里的虚函数;然后对于职工信息,这里按照要求,只考虑几点,职工编号,姓名,职务;
  5. 之后便是实现基本功能,crud,这些功能属于系统管理类,所以我们将其封装金WorkManager类里;
  6. 增加职工,肯定需要一个数据结构来存储职工信息,这里选用数组,但是有一个问题,职工有很多种,但是数组只能存储同一种数据类型,如何解决;
    这里采取一个通用的办法,那就是直接定义一个元素类指针数组,这里的元素类其实就是通用的是职工类;所以我们直接定义职工类指针数组;就可以保证数组里存储的数据类型 都是同一种 也就是 职工类指针类型;
    职工类指针数组定义 就是 Worker** array 或者 Worker* array[],两种方式都可以,因为数组名 其实就是数组首地址,也可以理解成一个指针常量,指针存储的地址不变;a[] 和 * a 两种方式都可以定义一个数组;定义数组其实本质上是定义了一个数组指针,同时开辟了一些内存给数组,然后我们用数组指针存储数组的首地址 或者说 指向这个数组;
  7. 现在考虑一下,系统初始化,我们将初始化所需要的工作,都放入系统的构造函数里,也就是WorkManager类的构造函数里,
    构造函数就是用来做初始化工作的;所以初始化工作有哪些;我们首先需要读数据库来初始化当前的数组,这里就是要读取文件的内容,三种情况讨论,文件不存在(直接不合法)文件存在但是为空(直接都初始化空),文件存在且有数据,这个时候我们需要把数据都读出来,C++直接利用fstream就可以;
  8. 有读就有写,当我们职工信息有变化的时候,要同步到文件里,这里定义为save()函数,然后在之后会导致信息变化的函数里加入save函数
  9. 剩下的就是比较简单的功能实现了,注意查改删操作,都需要用到是否存在逻辑,所以可以封装成isExist()函数,方便复用;
    然后改和删会发生变化,所以需要在操作成功后进行同步操作;
  10. 开发的时候采取分离编译,声明写在头文件,实现写在源文件,然后我们保证源文件里只引入头文件即可,源文件需要的其他头文件,都通通放入之前的头文件里;类也是一样,头文件定义类,但是成员只是声明,之后源文件 通过作用域 外部实现;

版本1

官方代码:

  1. 采取面向对象的方式,进行系统设计,不再是直接裸露的全局函数实现功能;
  2. 利用指针数组 解决了 数组不能存储不同数据类型的缺陷
  3. 文件作为简单的数据库,然后利用构造函数 初始化 文件的读取操作;同时封装了save函数,用来系统信息变化后的文件同步
  4. 命名方式我不太喜欢,函数都改为小驼峰形式;

bug:

  1. cin输入 类型不匹配 导致程序中断;**[已解决]**
    此bug参考通讯录管理系统的bug解决

项目开发文档:职工管理系统
https://vendestine.com/heima-employee-system
Author
Wenzhe Li
Posted on
July 10, 2022
Licensed under