• 结对编程:电梯调度 (张恿、赵骞)


    一、

    照片:

       

    结对编程的优点: 

      每人在各自独立设计、实现软件的过程中不免要犯这样那样的错误。在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高的那一位。这样,程序中的错误就会少得多,程序的初始质量会高很多,这样会省下很多以后修改、测试的时间。具体地说,结对编程有如下的好处:
    (1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
    (2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
    (3)在心理上,  当有另一个人在你身边和你紧密配合, 做同样一件事情的时候,  你不好意思开小差, 也不好意思糊弄。
    (4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
    总之,如果运用得当,结对编程能得到更高的投入产出比(Return of Investment)。

     

    结对编程的缺点:

      当出现弱弱结对的时候,由于缺乏带领,会导致项目开发难以展开,开发进度停滞不前。

     

    张恿的优点与缺点:对事情比较上心、有创造力、比较肯干,但是面对这次作业感到智商捉鸡。

    赵骞的优点与缺点:遇事喜欢思考,善于交流,但比较懒惰、容易懈怠。

     

    二、好的设计方法

     1. 信息隐藏(Information Hiding)

      信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。

      其实现在的面向对象程序设计当中的封装性便是信息隐藏的一个很好的例子。程序设计隐藏了某一方法的具体执行步骤,取而代之的是通过消息传递机制传送消息给它。而在我们的程序设计中,信息隐藏也十分重要。例如,在“学生乘电梯”这个事件中,学生只需要知道“往上走按上,往下走按下”即可,并不用关心电梯是如何运行、如何调度的。相反,若是学生(乘客)知道了电梯的调度方法,并不能保证没有人对这个调度做手脚,使得电梯的运行出现故障。因此信息隐藏是十分有必要的。我们在程序设计中也大量使用了信息隐藏的方法,其中最主要也是最直接的就是用private关键字来实现类的封装性,从而将信息隐藏。

         2. 接口设计(Interface Design)

      众所周知,接口是提供给其他模块或者系统使用的一种约定或者规范。因此接口必须要保证足够的稳定性和易用性。接口必须相对稳定,否则将导致接口的使用者和提供者为了适应新接口而不断修改接口的实现,可能重复进行无用功,严重时影响整个软件开发进度。而且接口是提供给第三方使用的,较难用的接口会导致接口使用者的抱怨。当然,除此之外,接口设计还有许多其他要求,例如:规范性、可移植性、鲁棒性、安全性、兼容性等。我们采用OOD思想来进行接口的设计,比如IRequest、IEvaluator、IPassenger、IScheduler等接口。事实证明,在使用过程中这些接口十分方便。

         3. 松耦合(Loose Coupling)

      耦合性是指组件(函数)之间相互依赖的程度,而松耦合是指功能函数之间,尽量依赖程度不要太高。否则,修改完一个底层函数后,会对多个上层函数,进行大量的测试。

      松耦合的方法,一般是底层函数功能尽量单一,尽量避免修改底层函数。功能相近的函数,可以设计2个以上,不要为了减少代码量,把一个函数的功能设计的太多。

    三、契约式设计(Design by Contract)

      契约式设计要求软件设计者为软件组件定义正式的,精确的并且可验证的接口,这样,为传统的抽象数据类型又增加了先验条件、后验条件和不变式。这种方法的名字里用到的“契约”,或者说“契约”是一种比喻,因为它和商业契约的情况有点类似。契约式设计的核心思想是对软件系统中的元素之间相互合作以及“责任”与“义务”的比喻。这种比喻从商业活动中“客户”与“供应商”达成“契约”而得来。

      契约式设计的提出,主要基于软件可靠性方面的考虑。可靠性包括正确性和健壮性,正确性指软件按照需求规格执行的能力,健壮性指软件对需求规格中未声明状况的处理能力。健壮性主要与异常处理机制相关 。正确性一方面包括对象元素内部运行的正确性,另一个重要方面是与其它对象元素交互时的正确性。契约式设计就是要求提供一套机制,在客户程序与提供者之间明确的声明双方的职责与权利,即契约,并能够对这些契约进行验证。

     

     

    四、UNIT TEST

       

     

    五、 UML图

     

     

     

    六、算法的关键以及独到之处

       1. 当电梯停止的时候

        ⑴ 让要到这一层楼的人下电梯。

        ⑵ 如果还有请求,就响应离当前层最近的(分电梯上行时与下行时讨论)

        ⑶ 当电梯内部没有请求的时候,考虑电梯外部的请求序列

          ① 如果等待队列也为空,就回到1层

          ② 等待队列不为空时

            如果电梯在较高层的位置,则先考虑上层请求(即楼上有人要上楼、楼上有人要下楼、楼下有人要下楼、楼下有人要上楼的顺序处理请求);

            否则按楼下有人要下楼、楼下有人要上楼、楼上有人要上楼、楼上有人要下楼的顺序处理请求。

      2. 当电梯运行时

        按照电梯内部的请求停在相应楼层,并且在还有容量的情况下带上顺道的人。

     

    七、感想与收获

      本次作业再次极大的锻炼了我的意志品质!我喜欢这种先通过读代码了解问题然后再用自己的方法改进解决方案的方式,这能减少我们学习的盲目性,让我们学到更多。同时这次任务也让我了解到一个较复杂问题的解决过程与一个较复杂程序的构成,对Information Hiding, interface design, loose coupling以及Design by Contract有了更为深刻的了解。

          

     

     

     

     

     

     

  • 相关阅读:
    CSS background API
    Vistual Studio 2019下载离线包与离线包更新
    flex布局属性速查表
    Vuex-核心概念-State 学习笔记
    前端环境搭配ESLint和Prettier
    Windows下VScode Scss开发环境配置
    Vue2.5开发去哪儿网App 从零基础入门到实战项目之6-1 Vue项目预热
    Webpack深入与实战 慕课网 免费 讲师qbaty 学习笔记
    Linux安装RabbitMQ
    docker-compose 搭建 kafka 集群
  • 原文地址:https://www.cnblogs.com/yongzh/p/3355697.html
Copyright © 2020-2023  润新知