一位初入门的新员工的代码分析(1)

来源:互联网 发布:java反转单链表递归 编辑:程序博客网 时间:2024/05/21 06:27

    公司刚来的新员工,刚毕业,经过几个月的实践,完成了一个实训编码练习。通过对其代码的阅读,发现了一些问题。这些问题对于初学者来说,是比较容易犯的错误,而且以他们目前的经验来说,不容易发现或理解。对此进行专门的解读和分享,希望各位初学者能够有所启发,早日提高编码水平。

    任务比较简单,是完成一个学生管理系统,现在很多大学生都自己玩这样的系统。要求使用链表、XML等考核点。

以下是其写的学生链表类头文件:

#include "Student.h"#include "XMLWrapper.h"struct StudentNode{ CStudent m_Student; StudentNode *next;};class CStudentList{public:CStudentList();~CStudentList(); //初始化学生链表void InitializeStudentList(int nSize,CStudent *Student);    void InitializeStudentList(); //添加学生 void AddStudent(CStudent Student);//删除学生void DeleteStudent(CString StudentID);//清空学生链表void ClearStudentList();//通过学号查找学生CStudent* SelectStudent(CString strStudentID);//查找班级内的学生BOOL  SelectCalssStudent(int *Count,CStudent **Student,CString strMajor,CString strGrade,CString strClass);//保存学生信息BOOL SaveStudentInfomation(TiXmlElement *RootElement,CString strXML,CXMLWrapper *pTinyXML);//检查学生链表是否相等BOOL CheckStudentList(CStudentList *pStudentList);private:StudentNode *m_head;};
对于这个头文件定义,初学者可以从自己目前的经验来看看有什么优缺点。然后再看下面的分析,可能会更有价值一些。









好吧,下面分析一下从这个头文件中看到的不足。
1。变量命名风格不统一
CString StudentID    VS  CString strStudentID
CStudent *Student   VS  CStudent **Student
可读性差,读者难以通过变量名来容易辨识变量类型,很容易混淆
建议:实在不知道该怎么办的话,一是找个编码规范学一学,二是看看MFC吧。

2。变量名称无意义
StudentNode *m_head
m_head能代表什么?不能达到顾名思义的效果。
建议:最优秀的注释就是不用写注释。不用写是指代码本身就可以自解释。

3。函数名有单词错误
SelectCalssStudent
班级--Class
建议:实在不清楚的话,可以查查字典啊。

4。返回值类型不合理
void InitializeStudentList(int nSize,CStudent *Student);
void AddStudent(CStudent Student);
操作是否成功,如何让用户了解?
建议:业务功能性操作,尽量考虑保留返回值,是否成功对外部的处理有较大的影响。

5。参数个数太多
BOOL  SelectCalssStudent(int *Count,CStudent **Student,CString strMajor,CString strGrade,CString strClass);
未来班级属性增加怎么办?
建议:关系比较紧密地参数,且数量较多,有扩展可能性的,建议使用结构,可保持接口不变
           另外,常见的OUT型参数,一般放在函数参数的末尾

6。类的职责不明确
BOOL SaveStudentInfomation(TiXmlElement *RootElement,CString strXML,CXMLWrapper *pTinyXML);
学生列表类是否负责学生信息的读写,还只是作为一个学生对象的容器?两种方案似乎都只完成了部分功能,封装还不够。

如果仅作为容器,是抽象的,与业务无关;而读写,属业务范畴
如果负责读写,那么应该有信息的读取处理部分,而不是只有保存部分
扩展考虑,存储未来可能存在不同的存储方式,这里直接固化为XML文件格式存储,未来无法扩展。
如果只作为容器,那么文件存储类应该移除。为了支持外部遍历容器进行相关处理,类应该增加遍历机制,如Prev(),Next(),Head(),Tail()等
另外,作为容器类,似乎还应该有修改学生信息的函数
相关性:设计模式中,有单一职责原则;有迭代器模式
其它建议:可将节点中的学生对象定义为指针类型



2 1