我在GitHub上看到了一个学生成绩管理系统的程序,下载后仔细看了看。
大家也可以在我的博客资源里免费下载。
这个程序一共大概2500行,但是我看了之后感觉可以压缩到1000行。问题有一下几个:
1,大段相同代码重复出现
例如下面这段判断人数是否为空的代码
if(getmNum().size() == 0)
{
system ("cls");
cout<<endl<<endl<<setw(20)<<" "<<"学生信息管理系统尚未建立!"<<endl;
cout<<endl<<endl<<setw(20)<<" "<<"请等待招生办人员建立学生管理系统!"<<endl;
cout<<endl<<endl<<setw(20)<<" "<<"输入0返回上一层:";
string str;
while(cin>>str)
{
if(str == "0") break;
else cout<<endl<<endl<<setw(15)<<" "<<"输入错误!按0返回上一层:";
}
return;
}
以及这个用户界面
system ("cls");
cout<<endl<<endl<<setw(15)<<" "<<left<<setw(25)<<"1.录入主修学生成绩"<<"2.录入辅修学生成绩"<<endl;
cout<<endl<<setw(15)<<" "<<left<<setw(25)<<"3.统计优秀学生"<<"4.统计主修补考学生"<<endl;
cout<<endl<<setw(15)<<" "<<left<<setw(25)<<"5.统计辅修补考学生"<<"6.返回上一层"<<endl;
cout<<endl<<setw(20)<<" "<<"输入错误啦!重新选择吧:";
continue;
这两段代码在整个程序至少出现了8次,既然一段代码的出现率这么高,我们可以直接封装成一个函数,需要的时候调用就行。
2,几乎相同的类有几乎相同的代码
这是这个程序的基本结构
class StudentBase
{
private:
vector<long>mNum;//学号
vector<string>mName;//姓名
vector<int>mSex;//性别,其中 0 表示男,1 表示女
vector<int>mAge;//年龄
vector<string>mAddr;//住址
vector<string>mMajor;//主修
map<long,int>mPosition;
public:
void bulidBaseData();
void modifyData();
vector<long> getmNum();
vector<string> getmName();
vector<int> getmSex();
vector<int> getmAge();
vector<string> getmAddr();
long getNumAtIndex(int);
string getNameAtIndex(int);
int getSexAtIndex(int);
int getAgeAtIndex(int);
string getAddrAtIndex(int);
int getmPosition(long);
};
class FirstA: virtual public StudentBase
{
private:
char mA_MajorDepName[30];
vector<long>majorA_Num;
vector<long>secondA_Num;
vector<string>A_Scond_MajorName;
vector< vector<int> >mA_FirstScore;
vector< vector<int> >A_Fscore;
public:
FirstA();
void inputA_MajorScore();
void inputA_SecondScore();
void outputA_Good();
void outputA_MajorFail();
void outputA_SecondFail();
char *getA_MajorDepName();
vector<long> getA_MajorNum();
vector<long>getA_SecondNum();
vector< vector<int> >getA_FirstScore();
vector< vector<int> >getA_FScore();
};
class FirstB: virtual public StudentBase
{
private:
char mB_MajorDepName[30];
vector<long>majorB_Num;
vector<long>secondB_Num;
vector<string>B_Scond_MajorName;
vector< vector<int> >mB_FirstScore;
vector< vector<int> >B_Fscore;
public:
FirstB();
void inputB_MajorScore();
void inputB_SecondScore();
void outputB_Good();
void outputB_MajorFail();
void outputB_SecondFail();
char *getB_MajorDepName();
vector<long> getB_MajorNum();
vector<long>getB_SecondNum();
vector< vector<int> >getB_FirstScore();
vector< vector<int> >getB_FScore();
};
class FirstC: virtual public StudentBase
{
private:
char mC_MajorDepName[30];
vector<long>majorC_Num;
vector<long>secondC_Num;
vector<string>C_Scond_MajorName;
vector< vector<int> >mC_FirstScore;
vector< vector<int> >C_Fscore;
public:
FirstC();
char *getC_MajorDepName();
void inputC_MajorScore();
void inputC_SecondScore();
void outputC_Good();
void outputC_MajorFail();
void outputC_SecondFail();
vector<long> getC_MajorNum();
vector<long>getC_SecondNum();
vector< vector<int> >getC_FirstScore();
vector< vector<int> >getC_FScore();
};
class StudentMIS: public FirstA, public FirstB, public FirstC
{
private:
int SA,SB,SC;
int KA,KB,KC;
public:
StudentMIS();
void degreeStanderOfFirst();
void degreeStanderOfSecond();
void degree();
};
其中A,B,C三个代表三个系的类几乎没什么差别,但是看这三个类的代码会发现作者将每个类的方法都写了一遍,而且每个类的代码都上百行。
我们学了C++都知道继承,多态,模板这些特性,而最让我不理解的是作者已经让这些类有继承关系了,那为何不用继承的特性呢。就相当于将一大段代码重复写了三遍。
总结
想给大家分享这个程序呢是应为我觉得写出简洁易懂得代码是每个程序员得追求。那这个程序呢做到了易懂,但是过于臃肿。
小伙伴们可以试着将这个程序重构以下。
今天得分享就这样了