—————结对同伴代码分析
1.简介
本博客为对结对编程队友的个人项目的评价分析
项目名称:中小学数学卷子自动生成程序
要求:
- 命令行登录:小初高各3个账号
- 登录后输入题目数量
- 题目数量10-30,或-1退出登录。查重
- 出题函数:操作数1-5,操作数取值范围1-100;
- 登录后切换类型:切换为XX(小学、初中、高中)
- 生成题目以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹
- 每道题目有题号,每题之间空一行。
- 登录要有文字提示
- 切换难度别有bug
- 生成题目之后要能退回主页
- 保存绝对路径
- 先定义接口类或抽象类 再使用具体类
- 类数量>1
- 方法代码函数<=40
2.开发环境
开发语言选择:c++
Windows10
Vs Code
MinGW13.1
cmake3.9
3.文件结构
--Personal Project
--.vscode
--g++配置文件
--build
--cmake配置文件
--include
--头文件
--information
--数据
--output
--输出
--src
--主程序等
可以看到队友的c++项目工程文件结构井然有序,方便项目管理与阅读。
4.思路分析
队友的项目构建思路基于抽象工厂的设计模式,根据小初高三种不同要求的题目分别设计了不同的抽象工厂来产生对象,思路新颖且具有实用性。在各个工厂类中具体写了InitAnswerSet()、ProblemConstruct()、deduplicate()、UpdateAnswerToFile(float answer,char* file_path)等函数来实现题目自动生成与文件保存功能。队友在system.cc中编写了菜单UpdateAnswerToFile()、登录CheckAccount()函数。程序具有较好的封装性,更新难度小。
5.关键代码分析介绍
抽象工厂部分代码
Abstract_factory.h
抽象工厂abstract_factory类在personal_project命名空间内实现了教师工厂Teacher和问题工厂Question的定义。
// Copyright 2023 Hunan University
// License: LGPL
// Author: Tanuki
// Introduction: This file contains the definition of the abstract class
// AbstractFactory which can produce different factories of different products,
// it contains several virtual function that use to produce.
#ifndef PERSONAL_PROJECT_ABSTRACT_FACTORY_H_
#define PERSONAL_PROJECT_ABSTRACT_FACTORY_H_
#include "teacher.h"
#include "question.h"
namespace personal_project {
class AbstractFactory {
public:
virtual personal_project::Teacher* CreateTeacher(char* teacher_type,
char* teacher_account) = 0;
virtual personal_project::Question* CreateQuestion(char* user_account,
char* question_type) = 0;
}; // namespace personal_project
}
#endif // PERSONAL_PROJECT_ABSTRACT_FACTORY_H
high_school_factory.h
high_school_factory.h类化抽象为具象,实现了高中Teacher和Question的定义。初中和小学对应类也是同样的实现,在这里就不赘述。
#ifndef PERSONAL_PROJECT_HIGH_SCHOOL_FACTORY_H_
#define PERSONAL_PROJECT_HIGH_SCHOOL_FACTORY_H_
#include "abstract_factory.h"
namespace personal_project {
class HighSchoolFactory : public AbstractFactory {
public:
Teacher* CreateTeacher(char* teacher_type,char* teacher_account) override;
Question* CreateQuestion(char* user_account,char* question_type) override;
}; // namespace personal_project
}
question.h
question.h中为Question定义了出题和保存等方法。
namespace personal_project {
class Question {
public:
Question(char *user_account,char *user_type);
virtual ~Question(){ };
float get_question_answer();
char *get_question_type();
char *get_question_content();
char *get_user_account();
void set_question_answer(float question_answer);
void set_question_type(char* question_type);
void set_question_content(char* question_content);
void set_user_account(char* user_account);
virtual void init_question_content() = 0;
void ShowQuestion();
private:
float question_answer_; // record the answer of the question to deduplicate
char question_type_[10];
char question_content_[25];
char user_account_[10];
}; // namespace personal_project
}
黑箱测试与总结
黑箱测试
控制台效果
生成文件
总结
优点
- 代码结构清晰简洁,各功能分文件实现,耦合度较低,模块之间的依赖性低,代码更灵活、易于修改、维护。
- 代码符合google编码规范,每个文件开头都有较为标准的注释,在关键操作处有行注释。
- 重用性高,函数的实现简洁高效
缺点
-
函数声明处缺少函数功能和性能等注释说明,不利于代码阅读。
-
生成的题目格式较为死板,与实际数学题相比略有差距,出题函数可以略加优化。