结对编程任务的算法流程思路
(一)、结对编程优缺点和本组成员的优缺点:
(A)宏观优点:
(1)从开发层次的角度上来讲,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
(2)从开发人员自身角度来讲,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
(3)从开发人员的心理角度讲, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
(4)从企业管理层次的角度讲,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
(5)从本人自己思考的角度讲,结对编程可以使代码不断处于复审的状态下,按照之前对于代码复审的必要性的讨论,结对编程是有利于代码的质量的提高的。
(B)宏观缺点:
(1)从员工激励的角度上来讲,结对编程容易造成滥竽充数的情况的发生,这种情况的发生对于非滥竽充数的人而言也是一种积极性的打压。
(2)从员工的心里角度上来讲,结对编程使得程序员的代码、工作方式、技术水平都变得公开和透明,这也许会引起员工的心里不适甚至是反感,所以说从某种角度上来说这是对于修为和道德的考验。
(C)本团队成员的优点:
(1)Myself:a:比较有责任心。b:做事较认真。c:比较容易和别人相处。
(2)My partner: a:时间观念强。b:待人真诚。c:团队意识比较强。
(D)本团队成员的缺点:
(1)Myself:比较固执,不太容易改变自己的想法。
(2)My partner:比较沉默,对我太容忍。。。
附上我们结对编程的照片一张:
二、信息隐藏,接口设计,松耦合
(1)、按照维基百科中的说法,所谓的信息隐藏就是通过使用语言本身机制,或者是明确的对外输出的策略来达到隐藏数据细节,从而prevent certain aspects of a class or software component from being accessible to its clients,这对这一点,适用语言自身的private 或者是protected的机制就很有效,当然也可以在这个基础上适用相应的set 和get函数。
(2)、这里面的interface design 我就把他们简单的归约到user interface design 上面了。所谓的用户界面设计是指机械或者软件的用户界面,他的主要的功能就是最大化用户的体验,他的目的就是使得用户可以尽可能的简单高效地和产品互动以实现用户的需求,针对这一点,所见即所得的用户界面设计理念就很适用。
(3)、借助维基的解释,所谓的松耦合就是指,在计算机或者是系统的设计中系统中的每一个部分和组件都只是利用很少的其他的独立的组件的知识,甚至是独立于其他的组件的。这种设计显然可以使得程序的灵活性更大,同时也更容易程序之间的调试和组装。
(三)契约式编程
所谓的契约式编程,其实描述的就是一个权利和义务的问题。如果有一方是不满足契约的规定的,那么另外一方就没有必要去践行自己的义务了,契约式编程在我们的面向对象的课程中被反复提及。
由于在契约式编程中C/S的双方的地位是要求平等的,以前被认为是强大的server没有必要再去理会无理取闹的client,所以要求C/S的双方都有比较好的代码质量,从而很好到地提升了软件工程的整体的代码质量。
契约式编程的的契约检验的过程是要有assert断言机制的,但是这种机制并不是所有的语言都支持的,所以在这也是契约式编程的一个局限的地方吧。
如果参数传递的过程中不满足要求会有相应的自定义的异常抛出,程序不再执行,也算是契约式编程的一个体现吧。
(四)测试代码覆盖率:
(五)UML类图:
()算法流程描述:
这次的结对编程的作业相较于上次的作业看似只是核心功能的嫁接过程,但是程序这个东西尤其是对于实战经验并不很足的我来讲,其实还是很有难度的,因为在这次的作业要求中新加了很多的可以由用户定制的功能要求,那么以前的取巧一些的方法在对于这种可以随意定制功能的要求之下就显得力不从心,于是对我来讲这次的作业只有部分的算法的框架还留在程序中,从代码的角度来讲的话基本所有的代码都是被重构的,作为处女座的一员即便是当初可以用的代码,再一次复审的时候发现很多不和标准的地方的有悖于自己的强迫症的地方还是不能忍受的于是果断把绝大部分的代码都重构了
对应于罗老师的要求,我把自己的算法的流程也相应地附上:
- 生成的题目不能重复(个人项目的要求)
- 四则运算在个人项目要求的基础上再支持负数,例如-1,-1/2,-3‘4/5等。
需要支持的基本设定参数:
- 题目的数量(个人项目的要求)
- 数值的范围(个人项目的要求)
- 题目中最多几个运算符
- 题目中或运算过程中有无有分数(比如进行整数除法的时候不能除尽)
- 题目中是否有乘除法
- 题目中是否有括号
- 题目中或运算过程中有无负数
(1)支持负数的这个问题其实还是有很多的细节需要考虑的,比如运算符后面如果直接是负数的话是需要加括号的,同时在解析字符串的时候也增加了不少的难度 ,在解析字符串的时候我尝试应用了C#中自带的字符串解析的函数,但是没有收到很好的效果,对于程序的控制的粒度还是太大,于是还是自己默默写了个函数自己解析了。同时负的数值在显示的时候也有很多的细节要考虑,比如说分子分母同时是负数的情况,以及只有一个是负数的情况。
(2)在支持基本的参数的设定的这个问题上,由于参数的组合真的非常的多,我甚至想到了当年做计算机组成实验的时候通过编码解析硬件指令的方式,当然在最后的实现中也真的用了,感觉使用硬件编程的思想还真的是能让思路清晰起来。
(3)其中针对支持多少个运算符的问题上我设定了一个上限是20个,其实这个是对我上次程序的一个比较大的改进,上次的程序只能最对支持3个运算符,感觉这次要是还支持最多三个运算符的设定是不是就太low了,于是费了一些时间把支持1-20个运算符的设定程序完成了,我会根据传进来的参数设定生成的字符串模式,在这个模式串里所有的数字都是用a,b,c,d等字母表示的(于是你可能也清楚了为什么有支持的上限,因为字母的个数是有限的啊)然后我会在这个标准的模式串的基础上进行加括号的算法和将抽象的字母生成具体的数字的算法。
(4)对于题目中是否有括号这个问题,我把加括号的这个算法封装的一个过程中,于是可以方便地控制是否这个过程参与表达式的生成。
(5)对于是否有负数的这个问题,我会在产生表达式后将表达式的最终结果计算出来,而就在计算的过程中运用中缀表达式的算法会把每一步的计算的结果存放下来,如果出现了负数就返回null.那么本次的生成就作废,重新再去生成。
(6)对于算数中是否有分数这个问题,我把生成数字的函数写成了是个形式,生成正整数,非正整数,正分数,非正分数。通过这四个函数控制在把字母变成数字的过程中到底用哪一类的数字替代字母。
(7)对于题目中的不能重复的要求,我只是使用了简单的字符串比较,我有的同学利用了比较复杂的和编译相关的技术,然而我没能那么超神。。。只好放弃这个想法。我第一次作业用的是比较计算的结果,如果有相同的就绝对不用,但是说实话这种的限制太强了,时间效率低下不说,关键是生成的表达式的个数很有限,严重影响了软件本身的功用。于是这回我打算使用简单粗暴的字符串比较,大道至简,也许简单的方法就是综合效果最好的方法。其实我使用这种简答的方法也是有自己的考虑的:
我考虑到的是这个软件的面向的群体,首先这个软件有三个功能:计算器,表达式生成,结果检验。计算器和结果检验不需要什么重复不重复的限定。重复不重复的限定就是针对表达式生成的,我在想如果一个人需要用这个功能来做题的话,那么他有90%的可能性只是个小学生,对于一个小学生来讲,也许形式上不一样的东西就是不一样的东西,这点应该不会影响他的体验,而且“通过有限次交换变换成同一个式子”的能力应该也不是一个需要做四则运算练习题的人所能具有的,这种抽象的程度比较大,如果算法是完全随机的,那么形式上不一样的式子应该并不会对该功能的针对群体产生不良的用户体验。
图形化界面部分的算法:
1、MessageBox.show函数比较实用,很有实战的赶脚~
2、C#的可支持拖拽的编程设计很方便,非常人性化,倒是减少了我们不少的负担
3、TabControl的功能真的太赞了,三个不同的功能可以很好地在三个不同的页面上展示出来。