结对成员:何小松 && 李入云
一、对结对编程的认识
优点:
1)程序员互相帮助,互相教对方,可以得到能力上的互补。
2)可以让编程环境有效地贯彻Design。
3)增强代码和产品质量,并有效的减少BUG。
4)降低学习成本。一边编程,一边共享知识和经验,有效地在实践中进行学习。
5)在编程中,相互讨论,可能更快更有效地解决问题。
当然,结队编程也会有一些不好的地方:
1)对于有不同习惯的编程人员,可以在起工作会产生麻烦,甚至矛盾。
2)有时候,程序员们会对一个问题各执己见(代码风格可能会是引发技术人员口水战的地方),争吵不休,反而产生重大内耗。
3)两个人在一起工作可能会出现工作精力不能集中的情况。程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效率比单人更为低下。
4)结对编程可能让程序员们相互学习得更快。有些时候,学习对方的长外,可能会和程序员们在起滋生不良气氛一样快。比如,合伙应付工作,敷衍项目。
二、结对成员简介
下面重点介绍我的结对伙伴何小松~
优点:
- 对事认真,积极完成老师布置的各项学习任务
- 学习能力强,乐于挑战和学习新的知识
- 团结友爱,乐于与同学交流,并伴有萌萌的幽默感~共事很轻松愉快
缺点:
拖延症患者(我们是拖延症组合= =
三、相关概念认识
概念就不在这里赘述,在这里想分享一下我的认识和理解:
- information hiding
软件的功能在于用户体验,因此设计应当优先考虑使用的方便,信息隐藏保证了用户在不了解代码内部实现原理的基础上就可以轻松的使用软件。
在这次项目中,直接将参数形象化为窗体,便于用户根据自己的需求修改输入,保证了代码的模块化和封闭性。
2. interface design
界面设计应当简单易行,突出软件的功能
3. loose coupling
松耦合提高了软件的可拓展性和灵活性,当你能够做到修改一个组件而不需要更改其他的组件时,你就做到了松耦合。对于多人大型系统来说,有很多人参与维护代码,松耦合对于代码可维护性来说至关重要。你绝对希望开发人员在修改某部分代码时不会破坏其他人的代码。
当一个大系统的每个组件的内容有了限制,就做到了松耦合。本质上讲,每个组件需要保持足够瘦身来确保松耦合。组件知道的越少,就越有利于形成整个系统。
在这次项目中我们设计了两个类:管理表达式输出、解析的express.class和管理操作数运算、打印的fraction.class,每一个类、每一个函数都有独立的功能
四、Design by Contract, Code Contract
DbC中,使用者和被调用者地位平等,双方必须彼此履行义务,才可以行驶权利。调用者必须提供正确的参数,被调用者必须保证正确的结果和调用者要求的不变性。双方都有必须履行的义务,也有使用的权利,这样就保证了双方代码的质量,提高了软件工程的效率和质量。
缺点是对于程序语言有一定的要求,契约式编程需要一种机制来验证契约的成立与否。而断言显然是最好的选择,但是并不是所有的程序语言都有断言机制。那么强行使用语言进行模仿就势必造成代码的冗余和不可读性的提高。
五、UML以及unit test
六、算法介绍
生成器:1)设置操作数栈和运算符栈,其中操作数栈保存运算出现的全部操作数,包括中间数
2)操作数两两入栈,遇到加法或者乘法,将较小的数先入栈
解析器:1)根据输入表达式生成逆波兰式,并进行计算
2)将表达式的计算结果输出到string ,与用户输入的答案进行字符串匹配,相同即为right,不同即为wrong
针对用户的不同需求:
1)用户如果选择运算过程中无负数,即将操作数栈中含有负数的表达式删掉
2)表达式不含有括号,将含有括号的表达式删掉
3)表达式中不允许有分数,将表达式和答案中含有‘/’的删掉
4)表达式中不含有乘除法,在生成运算符个数op_num时,op_num = rand(0,1),其中0 = ADD,1 = SUB,2 = MUL,3 = DIV;
七、Bug修复
1、类初始化问题
1 lass express 2 { 3 public: 4 vector<char*> opnum; 5 char optype[4]; 6 char expression[100]; 7 fraction answer;
这里需要注意类属性中char数组的初始化:
1 //方法一
2 memset(optype, 0, sizeof(optype));
3 memset(expression, 0, sizeof(expression));
4 //方法二
5 optype[0] = '