热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

软件工程:结对编程1

结对编程人员:徐钧鸿学号12061193李睿琦学号12061187一、结对编程的优点和缺点优点:(1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。(

结对编程人员:

徐钧鸿 学号 12061193

李睿琦 学号 12061187

 

一、结对编程的优点和缺点

优点:

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

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

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

(4)结对编程的过程也是一个互相督促的过程,每个人的一举一动都在别人的视线之内,所有的想法都要受到对方的评价。由于这种督促的压力,使得程序员更认真地工作。结对编程“迫使”程序员必须频繁地交流,而且要提高自己的技术能力以免被别人小看。

(5)结对编程让两个人所写的代码不断地处于“复审”的过程。复审是不断地审核,提高设计和编码质量的过程,这样能够及时地发现问题和解决问题,避免把问题拖到后面的阶段。

(6)结对编程中驾驶员和领航员的互换可以让程序员轮流工作,从而避免出现过度思考而导致观察力和判断力下降。

缺点:

(1)结对编程是一个相互学习、相互磨合的渐进过程。开发人员需要时间来适应这种新的开发模式。刚开始的结对编程很可能不比单独开发效率更高。

(2)如果团队的人员要在多个项目中工作,不能充分保证足够的结对编程时间,那么成员要经常处于等待的状态,反而影响效率。

(3)当两个人的技术水平或经验不均衡的时候,那么水平较弱或缺乏经验的一方往往会成为旁观者,或者需要对方给予一定的讲解,这无疑拖延了编程的进度。

(4)当其中一人希望独自思考一段时间时,有可能会被认为是一种不合作的表现。

 

二、结对的成员的优点和缺点

姓名

优点

缺点

徐钧鸿

代码编写与调试经验相对丰富

编写程序时逻辑性、层次性强

体力充沛,可以长时间连续进行编码

在遇到非常规bug的时候会比较烦躁

李睿琦

接受能力强,能够通过搜索互联网快速学习不熟悉的语法内容

英语阅读水平较好,能够充分理解作业要求

善于学习,能够不断反思不断进步

完美主义倾向,容易将数学思维带入到工程实践中去,导致很多想法无法实现

 

三、关于利用Information Hiding, interface design, loose coupling等设计方法

信息隐藏(Information hiding)是程序设计过程中的一种隔离原则,可以防止用户接触到一个类的某些部分。一个程序模块可以将它的信息隐藏起来,对外仅仅展现出一种接口。当这个模块的具体实现发生改变时,只要保证它的接口不发生变化,则就算不修改模块外的其他代码,程序依旧可以正确执行。这种接口的设计保证了整个工程的稳定性。

所以在进行信息隐藏时,一定要认真地研究各个模块的接口的设计,设计得越恰当,当需要修改模块的实现时会显得更加容易。接口设计(Interface design)主要考虑的就是两个模块之间连接和发送信号的方式。

接口的设计要满足的一个原则就是松耦合(loose coupling)。当一个类为了使另一个类做出一些改变而包含一个指向它的指针的时候,这两个类是强耦合的。在这种情况下,当后者发生改变时,前者很难保持不变。而如果一个类包含的指针指向的不是类而是一个接口,当实现这个接口的类的具体实现发生改变时,由于接口没有改变,则不需要修改引用接口的类,程序依旧可以正确运行。松耦合的接口设计使得程序设计的可拓展性大大增强。新设计的类通过实现某个接口,可以轻轻松松地替换当前的某个类,而无需修改调用这些接口的类。

 

四、Design by Contract, Code Contract的优点与缺点

契约式设计(Design by Contract)是一种软件设计方法,它规定软件设计者应该为软件的各组成部分定义规范的、清晰的、可以实现的接口规格,这些规格的定义扩充了抽象数据类型关于前提条件、后置条件和不变式的一般形式。在这里规格的含义与通常意义上讲的商业合同的性质是一样的,它的本质就是一种契约。

契约式编程的优势在于我们只需要观察模块的接口规格就可以迅速了解到这个模块的功能作用以及接口形式。但另一方面,若契约被违反(有意地或无意地)则程序中则一定会有bug。

在完成作业的过程中,我们详细阅读了程序的接口和实现相关接口的类,从接口和类的内容中分析提取出规格,在修改这些类的时候我们依靠这些规格来实现代码,即通过规格来指导过程的再设计。

 

五、UML图

 

六、算法说明

其实在拿到整个程序的时候整个人够不好了。将近1000行代码的阅读+理解,再在一个很不熟悉的环境(C#)下进行编码,起始时间很辛苦的事情。不过最后看看这个过程还是很有意义的。

下面讲一下代码的实现思路

在看代码的时候知道,整个电梯分为乘客、电梯运行和电梯调度几个部分。而乘客和电梯运行这两个部分已经实现的相当完整,基本不用改动,而我们需要做的就是在Schedule类的调度算法中调用Elevator类的ReqStopAt()方法,让电梯停在该停的地方,以实现电梯调度。而在已经写好的Schedule类,有一个IRequest类的Queue,是装载当前时间点之前的发出的指令。而在老师提供的简单调度算法中没有使用,但是已经成功的将指令加入到队列之中了,所以我决定实用这个请求队列,来控制整个调度算法。

首先,电梯是不知道电梯外的人的目标楼层与体重的,这与现实相符。

在设计算法的时候,先假设不考虑代码的细节(比如电梯上升一层需要五秒这种一步一步的事情,当做直接5秒一步上来)。我们设计出来的算法是:

针对电梯外的指令x,发出楼层n

①如果电梯i在这个时刻恰好到达楼层n,并且一定要停下来,那么这次开门的时间原本就是要浪费的。所以就讲指令x分配给电梯i。

②如果不存在①的情况,但是恰好有电梯j路过楼层n,而且电梯方向与请求的方向相同,那么就停下来将指令x带走

③如果没有前两种情况,指令待机

针对电梯内指令:

既然乘客已经上了电梯,就一定要将乘客送到目标。而且在设计算法中我们设定电梯内指令的优先级大于电梯外指令(虽然这个条件会使代码达到不了最优平均时间,但是相对来说比较符合现实生活。而且,代!码!好!写!)。这样,电梯就会在同次同方向运行时将目标指令完成。

而在设计的过程中,由于电梯可以一次带走多条指令,而且还会有电梯内指令,所以我在电梯里设计了一个记录目标楼层的布尔型数组,用来记录此电梯需要在哪些楼层停下。这样,在之前的算法中,只需要将电梯需要停的楼层的序号对应的布尔型变量标记为TRUE(原来都是FALSE),在整个指令循环结束的时候进行判断就可以确定该电梯最近一个的目标楼层了。

而且,在指令集合里面,有完成的也有没完成的指令,所以我们需要给指令添加一个标志位,表示这个指令是否已经完成。原本我是想设计成0,1,2的标志位,分别表示没完成,已经或者马上就能完成(比如电梯在8层已经向上走,9层指令就是马上完成)和很快就能完成(用于优化,比如9层向上指令就可以选取8层或7层向上电梯,但是7层不是马上来,所以置为2)。不过由于优化的代码处理起来比较麻烦,加上时间紧迫,所以我在程序里将有把指令置为2的,但是作用于0相同。

对于空闲电梯的使用方法,我认为将空闲电梯转起来是非常不错的。因为,转动起来的电梯很有可能在分布相对比较平均的数据中,更容易快速搭载乘客。所以,当有电梯空闲时,我会让电梯走向最早的未完成指令的楼层。至于中间会不会被其他乘客搭载就看天命了。

还有一个关键点是对于乘客上电梯的条件判断。原始程序在两个地方都有判断(Passenger类的EnterElevator()方法和ElevatorStopped()方法)。但是,如果一条指令在ElevatorStopped()方法中被拒绝,在我的程序设计中这条指令不会回到调度器的指令库里。在这里产生了n多个bug,最后才发现在调试的时候,很多的错误就是在这里出现的,浪费的很多时间。所以,我ElevatorStopped()方法只判断了电梯的停靠楼层是不是乘客的请求发出楼层和乘客的is_Inside和is_Arrived这两个状态,而将其余的所有判断送到EnterElevator()方法进行统一处理


推荐阅读
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 初探设计模式之代理模式:原理与应用解析
    在设计模式中,代理模式通过一个代理对象来控制对真实对象的访问。UML图展示了代理类(如MathProxy)维护了一个引用,使得代理能够访问实际的主题对象。代理模式不仅能够延迟初始化昂贵的对象,还能在访问前后添加额外的操作,如权限检查或日志记录。这种模式在远程服务调用、虚拟代理和智能引用等方面有广泛应用。 ... [详细]
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 在配置Nginx的SSL证书后,虽然HTTPS访问能够正常工作,但HTTP请求却会遇到400错误。本文详细解析了这一问题,并提供了Nginx配置的具体示例。此外,还深入探讨了DNS服务器证书、SSL证书的申请与安装流程,以及域名注册、查询方法和CDN加速技术的应用,帮助读者全面了解相关技术细节。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 在C语言程序开发中,调试和错误分析是确保代码正确性和效率的关键步骤。本文通过一个简单的递归函数示例,详细介绍了如何编写和调试C语言程序。具体而言,我们将创建一个名为 `factorial.c` 的文件,实现计算阶乘的功能,并通过逐步调试来分析和解决可能出现的错误。此外,文章还探讨了常见的调试工具和技术,如GDB和断点设置,以帮助开发者高效地定位和修复问题。 ... [详细]
  • 如何精通编程语言:全面指南与实用技巧
    如何精通编程语言:全面指南与实用技巧 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 本文源自极分享,详细内容请参阅原文。技术债务如同信用卡负债,随着时间推移,修复成本会越来越高,因此程序员必须对此有深刻认识。此外,团队应致力于培养一种持续维护和优化代码的文化,以减少技术债务的累积。 ... [详细]
  • 深入解析设计模式之开闭原则的应用与实践
    本文深入探讨了设计模式中的开闭原则,详细解析了其核心理念及其在多种设计模式中的应用。文章首先介绍了开闭原则的基本概念,随后通过实例分析了该原则在策略模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、桥梁模式以及外观模式中的具体实现。通过对这些模式的对比和讨论,旨在帮助读者更好地理解和应用开闭原则,提升软件系统的可扩展性和可维护性。 ... [详细]
author-avatar
MEow珍
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有