一、历史版本:
版本一:
1、代码链接:https://paste.ubuntu.com/p/Z39WZYCwYb/
2、大部分细节功能已经实现,但整体结构不好,有如下问题:
①、未弄清楚各类之间的关系,特别是记录类与书本数据类和学生数据类间的关系,在这里对于记录,应该是存在(被包含)于学生信息以及书本信息当中,而不应当在操作类中单独定义一个记录数组。
②、学生操作类的操作对象应当是某一个单独的学生,而不应当是一个学生集合。
。。。。。。
版本二:
1、代码:https://paste.ubuntu.com/p/nXhx4k9kXG/
2、相对于版本一的改进:
①、不在操作类中单独写记录集合,而是组织在书籍数据类以及学生数据类的数据成员中。
②、学生操作类中的学生集合改为单个学生对象。
3、存在问题:
①、在重载学生数据类以及书籍数据类时未考虑输入记录数组,而只是输入了部分基本信息,尽管在后面文件读入时可以直接在读入函数中将记录信息添加到对应vector中,但考虑到整个程序中的各种显示函数之间的关系,还是在重载输入流时输入该类的全部信息更方便些。
。。。。。。
版本三:
1、代码:https://paste.ubuntu.com/p/ynnYrRNNJt/
2、相对之前改进:修改了学生类与书籍类对输入输出流的重载。
3、存在问题:
①、未考虑在进入客户端(学生操作类)之前,将学生和当前的操作时间确定。
②、Student类与Book类中关于Record的操作有太多重复,StuOp类与MangerOp类之间有重复部分,可考虑继承。
版本四:
1、代码:https://paste.ubuntu.com/p/k3ph5CgrXG/
2、相对前一次改进:
①、学生操作类构造函数用初始化列表绑定学生信息与时间信息。
②、组织了两个继承。
3、修改部分的核心代码(部分):
绑定信息:
class StuOp:public OpBase
{
private:
Student stu;
int id;
Date t1;
public:
StuOp(int ID,Date t):id(ID),t1(t)
{
load1();
load2();
}
//... ...其余部分略.
};
继承部分:
Op类继承基类
class OpBase
{
protected:
int bookNum;
vector <Book> v2;
vector <Book>::iterator vit2;
map<int,int>m2;//书号
map<int,int>::iterator mit2;
public:
OpBase():bookNum(0){}
void load1();
void save1();
void disABook();//某本书信息
void disBookNoback();//某本书的未还记录
void disAllBookB();
};
数据类继承基类:
class Records
{
protected:
int RecordNum;
vector <Record> v1;
vector <Record> ::iterator vit1;
multimap<bool,int>m2;
multimap<bool,int>::iterator mit2;//是否归还bool
public:
Records(){RecordNum=0;}
int getRecordNum(){return RecordNum;}
vector <Record> & getRecord(){return v1;}
multimap<bool,int> & getM2(){return m2;}
void setRecordNum(int x){RecordNum=x;}
//无删除记录与增加记录Op,book类中和student类中这两个函数不同
void disAllRecord();//所有记录
void disNobackRecord();//显示未还书记录
};
二、心得:
之前在写ATM类时因为只是按照老师给的模板,把各个模块的功能实现了,而对于最核心的“怎么组织类”这个问题却没有好好体会,以至于在写图书馆系统的初期,始终理不清各个类之间的关系,出现了很多不可忽视的问题。尽管最后解决了这一问题,但换到一个新的项目上,感觉“怎么组织类”这个问题对于目前的水平来说还是整个程序的难点,当然也是整个项目的核心。另外,对于一些细节性的问题,例如要将时间和学生信息的确定放在进入客户端之前、文件只读入一个学生信息时该怎么将所有学生信息打印到文件中、以及怎么清除学生与书籍类下的记录数组的残留内容等等,个人感觉对于这些问题的解决,还是要慢慢积累,逐渐熟练。
总之,无论是对于不能熟练的理清类间的关系的问题,还是很多细节考虑不周的问题,个人感觉有一个很重要的原因就是练得少,既然说写软件基本上都是套用固定的套路,那“题海策略”肯定是有一定作用的,所以今后的学习中,对于软件开发方面,还要多加练习,尝试写各种项目,熟悉各种套路。