余帆:155 && 黄上:189


一、结对编程:


 

邹欣老师告诉我们:

http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html

结对编程中有两个角色:

(a)驾驶员(Driver)是控制键盘输入的人。

(b)领航员(Navigator)起到领航、提醒的作用。

  这两个角色是可以互换的。和现实生活中的例子类似,一个人负责具体的执行(驾驶,用键盘编辑程序等),另一人负责导航、检查、掩护等。

  其实在平时我个人就属于邹欣老师举例中的不喜欢和别人搭档写代码,觉得自己一个人写轻松自在也不会有交流不顺的麻烦。但是在这一次的结对编程中也感受到了合作不一样的魅力。(官方的)结对编程的优点:

(1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。

(2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。

(3)在心理上,  当有另一个人在你身边和你紧密配合, 做同样一件事情的时候,  你不好意思开小差, 也不好意思糊弄。

(4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。

总之,如果运用得当,结对编程能得到更高的投入产出比(Return of Investment)。


 现在我只谈谈自己在这次结对编程中的收获和感想:

  (1)结对编程两人合作,在某种意义上促使两个人更积极地投入在程序里,更早的开始规划开始编程开始讨论,作为一个拖延症患者,在这次的作业里也尽快搞定了主要代码,加快了完成速度。合作可以激励双方共同完成。

  (2)合作有一种事半功倍的能效,两个人可能因为一些功能的处理想法不同,然后通过两个人的讨论分析得到一个好一点的方案甚至在两个人的基础上讨论出一个更好的方案。知识以及经验的交流,双方都有收获。

  (3)在工作过程中肯定会遇到一些一时想不通的bug浪费你的时间并且打击你的自信心,很经常这个时候我们会发牢骚或者先放弃,我们知道这样的反应其实不对所以这个时候如果有人鼓励你一下,你就坚持下去了。这也是合作的魅力所在。


 结对编程不太好的地方也有:

  (1)结对编程适合有相同的工作时间以及工作地点的伙伴。否则两个人都要互相配合彼此的时间是一件很麻烦的事情,而且如果没办法面对面的交流很多地方文字解释不清楚。理解起来相当有难度。

  (2)结对编程不适合两个编程能力都不太好的伙伴,不是否定做不出来想要的成品,只是在交流的过程中因为双方的只是水平都有限制没办法有好的突破或者完善。


结对伙伴:13061189 黄上

优点:(1)认真(2)仔细(3)努力(4)理性(5)善于思考

缺点:(我们俩共同的硬伤……)知识面较窄



二、程序分析:


 

程序的独特之处可能并没有,但是自己觉得满意的一些优点还是有的。

(1)UI设计虽然很简单,但是麻雀虽小五脏俱全,功能都能满足。采用VS2012自带的界面设计功能。

(2)主要功能放在一个Core类里,继承接口。

    public interface CoreInterface
    {
        void setting(int n, int r, int s, bool fraction, bool bracket, bool muldiv, bool negative);
        bool create();
        bool checkout(string exer, string ans);
        string calculate(string f);
    }

界面上的每一个button都对应Core的一个函数。

(3)每一个功能对应的代码都是分开保存的。

Core.calculate():Calc

Core.create():Create,expression, expressionList

Core.checkout():Calc


三、原则分析:


1、Information Hiding(信息隐藏)

  信息隐藏是结构化设计与面向对象设计的基础。在结构化中函数的概念和面向对象的封装思想都来源于信息隐藏。

  David Parnas在1972年最早提出信息隐藏的观点。他在其论文中指出:代码模块应该采用定义良好的接口来封装,这些模块的内部结构应该是程序员的私有财产,外部是不可见的。
      Fred Brooks在《人月神话》的20周年纪念版中承认了当时自己对Parnas的批评是错误的。他说道:“我确信信息隐藏--现在常常内建于面向对象的编程中--是唯一提高设计水平的途径”。
一些信息隐藏原则的应用:
     1、 多层设计中的层与层之间加入接口层;
     2 、所有类与类之间都通过接口类访问;
     3 、类的所有数据成员都是private,所有访问都是通过访问函数实现的;

(以上内容来自博客http://blog.csdn.net/acloudhuang/article/details/6635230)

  在写面向对象类型的软件或者程序的时候,要考虑到用户的使用问题,也要注意自己的代码保密问题,这个原则的使用能够很好的维护这个问题。

2、interface design(接口设计)

  清晰是第一步,也是最重要的工作界面。什么算是有效使用你设计的一个接口?人们必须能够认识到它是什么,关心他们为什么会使用它,帮助他们理解接口相互作用,预测使用它会发生什么,然后成功地与之交互。

  最 好的接口是根本没有,当我们能够直接操纵物体在我们的世界。因为这并不总是可能的,这个世界上有越来越多的信息和对象,我们创建接口来帮助我们与它们进行 交互。很容易添加更多的接口层,创建overly-wrought按钮,chrome,图形,选择,偏好,附件和其他繁琐的东西。这样我们最终操纵的UI 元素而不是重要的事情。相反,追求原始的目标直接操作,设计一个接口与尽可能少的足迹,识别尽可能多的自然人类的手势。理想情况下,界面非常轻,,用户直 接操作他们关注的对象。

3、loose coupling(松耦合)

  松耦合的基本概念是:允许改变或者当问题发生在“电线的一端时”来避免影响到其他的端点。也就是说,改变或者供应者或者服务的问题不能影响到用户——或者用户的问题不应影响到供应者或者服务。

  举 例来说,如果服务的新版本被推出的话,服务的用户就不必非要去修改,不必非要去改变路线,甚至不必经历停滞期----因为它(服务的新版本被推出)能清 楚地向他们显示出来。相对而言,如果服务的一个用户决定改变他们正在使用的供应者(可能有了一个更低价格的服务供选择),这不需要用户应用必须要被重新编 码,甚至是中断来做这样的改变。

  程序组件之间的松散耦合可以通过使用增强的标准数据类型参数。通过定制数据类型或对象需要组件定义数据定义的知识。松散耦合的服务可以增强通过减少信息传递到一个服务的关键数据。


四、unit test:


        [TestMethod]
        public void TestMethod6()
        {
            No2.Core temp4 = new No2.Core();
            string exer = "Exercises.txt";
            string ans = "Answers.txt";
            bool re = temp4.checkout(exer, ans);
            Assert.IsTrue(re == true || re == false);
        }
        [TestMethod]
        public void TestMethod14()
        {
            No2.expressionList temp = new No2.expressionList(3);
            No2.expression e = new No2.expression(1);
            temp.Addexpression(e);
            Assert.IsTrue(temp.exp[temp.exp.Count - 1].Equals(e));
        }

(以上为部分测试代码)

(上图为代码覆盖率)