课程作业一
仓库链接:
Arithmetic2.0
一.关于主函数
关于题目给出的主函数,我尽量往上靠,其中我将原来的多个方法进行合并,对类进行重组,最后写出了一个版本,我认为这个版本可以符合易理解,易维护的特性,类与类之间和方法与方法之间的联系降到很低,所以我没有再进行更多的更改,这里我将简单介绍的的版本并分享我的心得。
二.我的类
- Arithmetic —— 主函数
- equation —— 整数算式生成
- Fraction —— 分数算式生成
- CalculateResult —— 计算结果并对输入进行计算
- interface —— 初始及结束界面
- language ——语言
- message —— 需要的全局变量
三.几个重要类的介绍
1. Arithmetic
int main()
{
Fraction fra;
equation equ;
Message msg;
Interface inter;
CalculateResult cal;
inter.first();
srand((unsigned(time(NULL))));
for (int j = 0;j < msg.equation_num;j++)
{
msg.clean();
int judge = rand() % 5;//出现分数运算的几率,目前1/5
if (judge != 0)
{
equ.initequation();//初始化整数算式
cal.check(); //计算答案
}
else
{
fra.initFraction();//初始化分数算式
}
cal.checkanswer(msg.result);//检查答案
cout << endl;
}
inter.finally();
return 0;
}
由于是主函数所以我单独将它拿出来,对于题目要求的randomnumber、randomoperation、generateExpresion我将他们合并并按照分数计算和整数计算的方法分,分别包含对数字的随机生成,和算式的输出,分数算式的显示方法和整数不同,计算也不同,所以我将他们分开,而如果按题目中的类,我认为更不易维护的问题。
2.interface
interface为初始和最后的统计界面,除了运算中间的输出对本题答案的正误其他的界面输出都在这里(这里我觉得还有修改必要,应该把所有输出放在这里),其中只有first和finally两个方法,所以自然也就包含用户已开始的选择language和题目数的处理。
3.CalculateResult
这个类是按题目要求写的,整合了对算式的计算,若答案出问题了,仅在本类即可修改。
4. Message
这个类是我代码的核心,这个类只有一些静态变量,没有对方法的处理,所有的关键变量和需要跨方法调用的变量都在在这里,这样可以更容易在过程中判断这些变量的的变化,更方便初始化变量,还有防止被其他类的变量干扰,当然,最重要的是易于代码的编写和调试。
三.心得和体会
- 虽然这次没有完全按照题目要求对类进行重组,但我觉得已经对其进行了很大程度上的优化,类之间的耦合度更低了,界限和含义也更加确定了。
- 在主函数上应尽量做到简洁易懂,并且尽量做到不在一个类中使用另一个类
- 感觉现在还是面向过程的思路,只是强行包装了个面向对象的开发方式,有时候会对类与类之间的混淆或不明确,导致出现很多冗余,增大了理解难度,比如在界面类中使用language类,方法也是如此,初始化算式的时候先初始化数字+符号,然后直接连接到下一个方法写添加括号,完全是没有必要的两个方法。
- message类的创建我认为是我的代码的一个特点(现在还不太明白这样到底是好还是坏),但这样确实可以将一些特殊的变量集中到一起更容易查看和调试,当然这样还有个问题就是每个方法都要实例一次message类。
- 对于方法的声明和定义最好还是分开,如果能将方法之间的耦合度降到更低的话,应该可以做到让一个不参与代码编写的人在只看声明的情况下运用此方法,这样也能更突出c++可以写.h文件的功能了。