结对编程-地铁续(有种上个学期OO的既视感)
我们组比较特殊。。三人结对
github:https://github.com/qingchanghan/WPFUI_Metro
po一张照片:

石浩然,韩青长、陈彦吉
(台式机真的很高端,分屏贼帅)
1.结对编程的优点和缺点:
优点:
随时沟通交流,当遇到复杂的代码逻辑时,两个人比一个人能更好地理清代码思路。
一个人乱了另一个人不会乱,或者很难出现两个人一起乱,正确率整体、代码质量很高。
可以实现编程接力,在确定好todo项目后,可以交接工作,续航时间更长。一节更比六节长。
在心理上相互鼓励相互支持,在取得阶段性进展后,喜悦×n,贼开心。
缺点:
当结对编程的双方能力、性格、关注点有较大差距,且deadline紧迫时,不能更好地发挥结对编程相互指导的作用。
2.每一个人的优点和缺点
石浩然:心胸宽广,学习能力强,解决问题有独特的思路,但是由于完成个人项目时没有考虑到自己的代码会被他人用作扩展的基础,因此代码逻辑较复杂。
韩青长:学习能力强,实践能力强,目前没发现什么缺点。
陈彦吉:没什么优点。。缺点是心胸狭隘,比较怕麻烦。。
以下为结对项目博客中的共同部分。
3.INFORMATION HIDING
当开发一个完整的程序时,可将程序的每个组成部分封装在一个模块中,每个模块尽量少地对外展示模块内部的数据与对数据的处理,以此提高代码的复用性、可维护性。减少外界可见的信息,以保持模块的独立性,以此降低耦合 。
从具体实现来说,我们确保某些成员变量和功能为private,并尽可能保证高层类只会调用底层类中特定的几个可供外界访问函数,而将其他方法封装在内部,限制了高层类对底层类的调用。
4.INTERFACE DESIGN
依稀记得OO曾经上过这个。。
接口设计一共有六大原则。原则说的都很清楚。。但是具体我们如何使用还是要多摸索。。
以下整理自博客
一.单一职责原则
根据实际需求划分职责,尽量做到职责单一
二.里氏替换原则
所有引用基类的地方必须能透明地使用其子类的对象
三.依赖倒置原则
高层模块不应依赖底层模块,两者都应依赖其抽象
抽象不应该依赖细节,细节应该依赖抽象
四.接口隔离原则
接口尽量小,不要建立大接口,同时接口中方法尽量少,将接口隔离起来,将整体框架进行有效划分。
五.最少知识原则
跟information hiding有异曲同工之妙,此原则的使用可以降低程序耦合
六.开闭原则
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭,编程前对不同的模块确立明确的逻辑分工,为变化预留位置
但是我们这一次由于大结构简单,因此没有设计接口,所以这些原则没有得到很好的实践。。希望能在以后的团队项目中积累相关经验
5.LOOSE COUPLING
尽可能全面地把握耦合度的高低,平衡好耦合和内聚程度,以确保可读性、服用性、可维护性的提升
不可一味强调低耦合,例如程序中发生变更概率很小的地方,不宜强行低耦合。
还有程序中一些为大函数服务的小函数,小函数本身是依附大函数存在的,本身不会和其他模块建立过多的依赖关系,此时在耦合度上最好也做相应折衷(好吧。。主要是因为我怕麻烦)
6.DESIGN BY CONTRACT
design by contract把类与被调用类之间的关系看作契约,规定了双方的权力与义务,这一方法被认为是构建OO软件系统方法的核心。
另外,
我们通过一些知乎回答了解到的契约式设计:
目的:
在设计程序时明确规定一个模块单元在调用前后应当处于何种状态,属于一种设计风格或是语法规范
思路:强调前置条件、后置条件和不变式,当违反这些操作时程序会抛出异常。
优点是:契约式编程使代码标准化、规范化,提高了程序工程化程度。
同时,对于测试者,在我们这次作业中,我们通过在不满足前置条件的情况下抛出异常,便于测试者测试。
缺点是有点麻烦。。
7.单元测试与代码覆盖率
这次结对编程,由于函数之间的调用关系较为复杂,因此我们仅对最主要的几个函数进行了测试如下是测试函数 。

一般来说通过assert.areequal方法可以测试大多数运算操作的值是否正确
[TestMethod()]
public void ReadDataTest()
[TestMethod()]
public void BuildGragphTest()
[TestMethod()]
public void FindNearestTransStaTest()
[TestMethod()]
public void DijkstraPathTest()
[TestMethod()]
public void BFSPathTest()
[TestMethod()]
public void MakePathSectionTest()
[TestMethod()]
public void isSameLineTest()
[TestMethod()]
public void GetLinkedStationsTest()
[TestMethod()]
public void GetShortestLinkedStationsTest()
另外,我们也测试了功能函数在遇到错误的输入时是否按照规定情况抛出了我们事先设定的异常,
我们设定了如下的异常:
1.某些情况下操作返回的空值引发的空引用异常
2.站点名称输入错误的站点输入异常
3.地图文件没有被正确开启的文件未被打开的异常
4.地图文件内部格式不符合规范的异常
5.内存溢出的异常
8.UML类图

9.关于我们的附加题和程序的一些特色


9.1我们一开始完成了一个winform开发的版本,比较粗糙,但实现了基本功能,之后采用了石浩然同学通过WPF开发的界面,简洁美观,功能强大,不得不说他确实花了很多心思在UI上,这里特别鸣谢石浩然同学
9.2关于我们的附加题。我们只需要一开始读入的txt按照我们要求的格式,并且提供一张与txt文件对应的地铁线路图,我们就可以实现其他城市的出行规划。
这里说一下我们的实现方法:txt文件中除了站点和线路,还要有每个站在线路图中的坐标,我们后期要根据这个坐标在图上显示相应的站与动画效果
9.3在winform版中,我们将站点设置为按钮并固定在了地图上,用户可以通过点击地图或输入文本框来设置起点和重点,在WPF版中,由于鼠标的点击时间与图片的拖动绑定了,因此我们省去点击地图的功能,只能通过输入文本框来进行。
9.4石浩然同学比较厉害,完成了-a的功能,并通过多线程,实现了程序可在后台计算-a,同时在前台计算用户的其他请求,当计算完成后再输出-a结果。不得不说他真的很厉害。。。特别鸣谢。。
10.个人总结
因为我们这一组是三人结对,所以比起两人结对,我们可能更偏向团队编程一些。在被deadline追赶的这几天里,我深刻地认识到了自己性格上的缺陷。
由于代码复审给我留下的印象不是很好,导致我可能对他存在一些偏见,当在决定使用他的代码为基础扩展时,我有一些抵触情绪,后来因为为了修复他的代码他和另一位同学给代码做出了较大修改,我的抵触情绪加剧了,但是不论是最后的UI还是功能,他的贡献确实是排在第一位的。这里确实要说一句辛苦了!
在结对中,我想的更多的可能是取舍的问题:代码简洁与代码高效是我们追求的两个维度,但是在很多情况下这两个难以两全齐美,所以在真正开发而且deadline紧迫时,我们应该怎样做取舍?根据什么做取舍?如何保证我们取了大的,舍了小的,不让自己亏本?以及以后团队编程中的一些编程规范的问题。
于是我想,这次结对编程对我来说可能更多的是对团队编程的一次预演,如何融洽团队,调节自身情绪,跳出偏见,公平公正地看待问题是我目前来说需要注意和改进的。以及这一次结对编程我做的真的很少,希望团队任务中我能多承担一些任务。
结对编程-地铁续(有种上个学期OO的既视感)的更多相关文章
- 结对编程UI
GitHub:https://github.com/zsl1996/UI/commits/master 一. 实验内容 这是交付给最终用户的软件,有一定的界面和必要的辅助功能.完 ...
- 现代软件工程HW2:结对编程-生成五则运算式-Core10组 [PB16110698+PB16120162]
作业具体要求点 这里 Core组要求: 1.Calc() 这个Calc 函数接受字符串的输入(字符串里就是算术表达式,例如 “5*3.5”,“7/8 - 3/8 ”,“3 + 90 * 0.3”等等) ...
- 结对编程-stage_2
教学班 罗杰.任建班周五3.4节 gitlab项目地址 Here it is. 成员 周远航(3004) 李辰洋(3477) 结对编程体验 经过了上一阶段的磨合,第二阶段我们的配合更加流畅,也熟悉了对 ...
- Week4 结对编程
1.照片 1.1 结对编程参与者:李文涛.黎柏文 1.2 展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...
- 第二次作业:结对编程,四则运算的GUI实现
小伙伴:201421123031 余洋 201421123044 潘志坚 题目要求: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是W ...
- [2019BUAA软工助教]结对编程 - 小结
[2019BUAA软工助教]结对编程 - 小结 一.评分规则 博客 博客共五十分 序号 要求 分值 1 在文章开头给出Github项目地址 1 2 在开始实现程序之前,在下述PSP表格记录下你估计将在 ...
- 结对编程 学习手记ver1.2
团队成员: 226 高雅智 164刘浩然: 一 结对编程 辛辛苦苦搞了好久的时间,就是没有人家的快,明明算法都差不多,哎~~~ 结对的优势,在于双方互相督促,对于代码能贡献自己的能力,人多力量 ...
- 软件工程启程篇章:结对编程和进阶四则运算(197 & 199)
0x01 :序言:无关的事 I wrote a sign called "Dead End" in front of myself, but love crossed it wit ...
- 2017-2018-2 1723《程序设计与数据结构》第十一周作业 & 实验三 & (总体)第三周结对编程 总结
作业地址 第十一次作业:https://edu.cnblogs.com/campus/besti/CS-IMIS-1723/homework/1933 (作业界面已评分,可随时查看,如果对自己的评分有 ...
随机推荐
- 在Windows Phone 8中使用Live Connect并保持登陆状态
Live Connect可以让各种客户端访问Live账号.获取好友列表.访问One Drive的文件等,官方地址在此:http://msdn.microsoft.com/zh-cn/live/ff51 ...
- Android应用中如何保护JAVA代码
Java Classes字节码的反编译太容易了,有很多功能强大的反编译利器可以轻松的将Java字节码 反转为源代码,但是android中普通.apk文件可以轻松的被反编译为Java源代码吗? 答案是当 ...
- C# 委托和事件(二):使用.Net框架中的EventArgs和EventHandler
前面一篇里提到事件是通过委托来进行关联的,而委托是可以带各种各样的参数的,其中就可以用事件参数(EventArgs),同时,也可以用.Net框架里边提供的一个委托EventHandler来Handle ...
- Oracle中经典分页代码!
在Oracle中因为没有top关键字,所以在sqlserver中的分页代码并不适用于Oracle,那么在Oracle中如何来实现分页呢? --查询所有数据 STUNO STUNAME STUAGE S ...
- TFS签入签出规范
TFS签入签出规范1)开发平台的约定a)开发操作系统环境和最终用户使用环境 包含Service Pack版本号开发环境 Windows2008SP1 Windows7用户环境 Windows2008S ...
- Android Volley框架的使用(2)
3. 设置请求类型和参数 Volley默认的请求类型是GET,如果需要用POST,可以在构造函数中进行设置.设置参数可以通过重写getParams()方法来实现. private void postR ...
- hibernate----N-1(一)
*************************hibernate.cfg.xml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE ...
- 说说web 2.0生态圈的那些事
先来说一道面试题吧,“说一下,web 2.0 和web 1.0的区别?” 官方的解释是这样的: Web1.0 的主要特点在于用户通过浏览器获取信息,Web2.0 则更注重用户的交互作用,用户既是网站内 ...
- JVM内存格局总结
最近一次面试,面试官让我讲讲JVM的内存这一块的理解.我回答的不满意,今天做一个总结. 做一个产品,最终要做到高并发.高可靠.归根结底,是对CPU.内存等资源受限所作出的解决方案.就内存而言,我们写的 ...
- Mysql优化的几点总结
正常情况下,初创公司的流量并不是很大,mysql数据库在未做优化的情况依然可以满足性能要求,特别是5.6版本后mysql在性能上还是有了很大提升,所以在初期并没有花精力在此上面.但后来发生的一系列问题 ...