结对编程收获
——我和我的伙伴分到了Core组,他负责生成编写四则运算表达式函数,而我负责编写计算函数以及整体框架和接口
这一次结对编程不仅学到了不少编程技术,更在交流合作中发现了自己以往的问题,因为我一直以来是一个偏爱独来独往的人,宁愿在合作中多干活,也不愿意别人对我的构想指手画脚,不过这一次是无法避免的了。
编程收获:
1、实战经验:
这是一次难得的C++实战经验,或者说是一次面向对象语言的实践,C++更抽象一层的数据类型及其方法将我从以往繁重的体力活(用C语言编写)中解救出来,我也充分地利用了它不同于C的特性,将整个小项目的结构都编写得比较优美(至少是学习计算机语言以来)。(最后附上核心内部接口与外部接口)
2、开发流程:
接口处理:
1、前后接口讨论的重要性:
诚如上文所言,在最初的讨论中所有成员都应该参加,但是这次并没有邀请UI组(甚至最开始的时候还没有考虑到要联系UI组,因为接口函数看上去已经确定了)。也如后来UI同学在群里抱怨的,虽然逻辑上各组之间差异不大,但是他们最初想得太美好了,接口参数表、返回值、甚至编写语言的不同让UI组的工作一下子重了不少。我们在之后的第二天找到了UI组的同学,不过他们讨论的积极性也不高,所谓的对接组内讨论也不了了之。
2、人性化、例程:
这一次我们的接口设计是比较成功的,因为据反馈有好几组UI都对我们的接口表示满意,我想这一方面得益于我在对接口设计时充分考虑到(a)尽可能少的调用函数完成尽可能多的事情(b)C语言仍然是所有同学熟练掌握的语言,并且它几乎成为各种编程语言会优先支持的外部语言;另一方面我也不厌其烦地在每一个版本中编写Test工程对dll进行测试,更对接口编写实际的使用例程并且不断进行更新,这样充分考虑用户感受使我们赢得了赞誉。
代码展现:
1、留给UI组的接口
extern "C" __declspec(dllexport) void SettingCal(int numOfOperand, int numOfQuestion, double rangeOfQuestion, bool addition, bool subtraction, bool multiplication, bool division, bool power, bool brackets, int precision, bool properFraction, bool decimalFraction);extern "C" __declspec(dllexport) void GenerateAndCalc();extern "C" __declspec(dllexport) const char* getExpression(int count);extern "C" __declspec(dllexport) const char* getAnswer(int count);extern "C" __declspec(dllexport) int numOfQuestion();
2、内部的代码框架
struct ReversePolishType {stack<double> OPTR; //操作数栈stack<char> OPND; //操作符栈 };struct fractionType {//假分数形式int numerator; //分子int denominator; //分母 };struct RPT_FractionType {//真分数的逆波兰式表示stack<fractionType> OPTR;stack<char> OPND; };class OperationClass { private: //B同学:int numOfQuestion; //题目的数量int numOfOperand; //操作数的数量double rangeOfQuestion; //题目中的数值范围//运算符的种类bool addition;bool subtraction;bool multiplication;bool division;bool power;bool brackets;int precision; //精度bool properFraction; //是否支持真分数bool decimalFraction; //是否支持小数//都不支持说明支持整数 //计算整形、小数形式的算式static ReversePolishType ReversePolishNotation(string Input)throw(...); //计算整形、小数形式的算式:根据string生成逆序波兰式static double CalReversePolishNotation(ReversePolishType expression)throw(...); //计算整形、小数形式的算式:根据逆波兰式计算结果//计算分数形式的算式static RPT_FractionType RPN_FractionType(string Input)throw(...); //计算分数形式的算式:根据string生成逆序波兰式static fractionType CRPN_FractionType(RPT_FractionType expression)throw(...); //计算分数形式的算式:根据逆波兰式计算结果//分数形式的加、减、乘、除、乘方static fractionType fraAdd(fractionType a, fractionType b)throw(...);static fractionType fraSub(fractionType a, fractionType b)throw(...);static fractionType fraMul(fractionType a, fractionType b)throw(...);static fractionType fraDiv(fractionType a, fractionType b)throw(...);static fractionType fraPow(fractionType a, int b)throw(...);//A同学:string generate()throw(...);string generate1()throw(...);string generate2()throw(...);string generate3()throw(...);string generate0()throw(...); public:OperationClass(); //无参构造方法//提供给UI的属性、方法 //对象的属性vector<string> expression; //存储生成的表达式vector<string> answer; //存储表达式的计算结果void Setting(int numOfOperand, int numOfQuestion, double rangeOfQuestion, bool addition, bool subtraction, bool multiplication, bool division, bool power, bool brackets, int precision, bool properFraction, bool decimalFraction);/*设置属性:操作数数量,题目数量,数值范围,加法?减法?乘法?除法?乘方?(真分数?or小数?最后两项只可选其一,否则抛出异常)*/void GenerateAndCalc();void Generate(); //生成表达式,并存储在string当中void CalcAllExpression(); //对题目表达式依次进行计算,将结果string数组返回//获得对象的属性int getNumOfQuestion(); //获取题目数量设定值//B同学提供给A同学的方法 //计算表达式expression //返回double类型的答案double CalcDouble(string expression)throw(...); //整数/小数形式表达式:对输入表达式字符串进行运算,然后以数值形式返回double CalcFrationDouble(string expression)throw(...); //分数形式表达式:对输入表达式字符串进行运算,然后以数值形式返回//返回string类型的答案string Calc(string expression)throw(...); //整数/小数形式表达式:对输入表达式字符串进行运算,然后以数值形式返回string CalcFration(string expression)throw(...); //分数形式表达式:对输入表达式字符串进行运算,然后以数值形式返回 };