结对项目1

结对编程初体验

这次结对项目我的小伙伴是中国的朋友闫昊,因为我的代码能力没有比他那么好所以他辛苦了很多。

结对编程是应该互相学习的,但是基本都是他一个人写的代码,所以效率相比之下比较低。

结对项目的特点:

1.通过互相讨论,优点结合到一起。

2.互相有什么错误,可以容易发现。

3.互相帮助,有什么困难的都可以解决。

缺点:

1.因为我们俩住的地方都不一样,所以不容易见面,很难以找共同的时间。

2.容易被打断思考。

关于information hiding,interface design,losse coupling和design by contract,code contract

  1. 信息隐藏
    通过类的封装实现信息的隐藏,信息隐藏使得类内部的私有属性或方法不能被类外部访问,有效地保护了类内的数据,实现了类的封装。具体的,在core.dll文件中所有类的属性都是private,供各个类间调用的方法的访问权限为internal,接口的访问权限为public以便外部程序调用。
  2. 接口设计
    在我的程序中,分为核心计算程序(core)和用户界面程序(ui),ui通过导入core生成的dll,并调用其中的函数,来实现表达式生成、判断对错和计算的功能。ui需要告诉core是否包含负数、是否支持分数、表达式数量和运算符数量等参数,core需要把计算、检验结果以及异常等信息反馈给ui。这就需要在core和ui间定义接口。同样的在类与类之间,类内部各方法相互调用也需要定义接口。接口的定义需要遵循以下原则:
    1. 单一职责原则
      Single Responsibility Principle, 简称SRP。
      定义:There should never be more than one reason for a class to change.
    2. 里氏替换原则
      Liskov Substitution Principle, 简称LSP。
      定义:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.(所有引用基类的地方必须能透明地使用其子类的对象)
    3. 依赖倒置原则
      Dependence Inversion Principle, 简称DIP
      定义:High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.
    4. 接口隔离原则
      定义:1.Clients should not be forced to depend upon interfaces that they don‘t use.(客户端不应该依赖它不需要的接口)
      2.The dependency of one class to anther one should depend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上)
    5. 迪米特法则
      Law of Demeter, LOD。又称最少知识原则(Least Knowledge Principle, LKP)。
      通俗来讲:一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没有关系,那是你的事情,我就调用你提供的public方法,其他一概不关心。
    6. 开闭原则
      Software entities like classes, modules and functions should be open for extension but closed for modifications.(一个软件实体如类、模块和函数应该对扩展开放,对修改关闭)应该有且仅有一个原因引起类的变更。

基于以上规则在ui和core间定义了如下接口:
public static string createExpression(int ExpressionCount, String outputfile_e, String outputfile_a,bool negative, bool bracker, bool muldiv, bool profraction, int range, int op_num)
public static String checkExpression(String exercisefile, String anwserfile)
public static string calculate(String expression)
分别用于产生表达式、检验表达式、计算。

  1. 松耦合
    很多设计模式就是为了解决紧耦合的问题。如果两个组件耦合太紧,则说明一个组件和另一个组件直接相关,这样的话,如果修改一个组件的逻辑,那么另外一个组件的逻辑也需修改。当能够做到修改一个组件而不需要更改其他的组件时,就做到了松耦合。利用面向对象建模的方法、信息隐藏的设计思想和遵守接口间的设计原则可以很好的降低程序间的耦合度,实现程序的松耦合。

Design by Contract & Code Contract

代码契约(Code Contract)就是让你用额外的代码来表达应用程序中对代码的假设情况,一般可以执行前置条件、后置调剂和不变式。在我看来:代码契约有点类似断言,但是比断言要强大;也类似单元测试,但是比单元测试好,根据底层也是对单元测试的一种补充。Dirk Strauss的这篇文章有简单明了的示例代码和直观的截图,对于这个工具的使用是一个很好的入门教程。

原文地址:http://www.dirkstrauss.com/programming/introducing-code-contracts#.VWCNlvnvO70

契约式设计(Design by Contract)是一种设计计算机软件的方法。这种方法要求软件设计者为软件组件定义正式的,精确的并且可验证的接口,这样,为传统的抽象数据类型又增加了先验条件、后验条件和不变式。这种方法的名字里用到的“契约”或者说“契约”是一种比喻,因为它和商业契约的情况有点类似,在DbC中,使用者和被调用者地位平等,双方必须彼此履行义务,才可以行驶权利。调用者必须提供正确的参数,被调用者必须保证正确的结果和调用者要求的不变性。双方都有必须履行的义务,也有使用的权利,这样就保证了双方代码的质量,提高了软件工程的效率和质量。缺点是这个契约在项目的不断迭代中,由于需求、功能发生的变化,这个契约很可能会改变,并且契约式编程并未被标准化,因此项目之间的定义和修改各不一样,给代码造成了混乱。在我的代码中,对方法间的调用采用了契约的思想,调用者必须保证传入参数是正确的,否则被调用者不保证结果的正确性。

单元测试

核心算法

主要的算法分为两个部分
1.表达式运算
在定义好分数之间的运算的前提下可以利用调度场算法进行计算。

调度场算法详见:http://blog.csdn.net/kyfvc/article/details/7404752
2.判断表达式是否重复
分离表达式含有的运算数和运算符,把运算数从大到小排列,把运算符按出现顺序排列将这两个字符串拼接起来形成表达式的id,在判断表达式是否重复的时候只需判断表达式id是否出现过。这种方法虽然简单但也有缺陷,可能导致不同的表达式的id是一样的从而导致过滤掉不该过滤的表达式,但是这种情况的概率很小。更好的方法是根据运算符为每个表达式构造一棵树,判断并生成这棵树的最小表示,由于这个方法有些麻烦,为了提高开发效率选择了前种算法。

时间: 2024-09-29 04:28:01

结对项目1的相关文章

结对项目更新

本周确实对结对项目没投入多少时间,新的需求没进行跟进,应该要被老板扣钱的吧.只针对之前的程序进行了争论和修改,之前的程序在处理除法的时候其实是有缺陷的,我们二人就此展开过讨论,在并没有达成共识的情况下,用各自的方法进行了编程试验,也没有解决问题,最后询问了同学,采用了新的办法,才解决了遗留的问题.

结对项目 - 词频统计Ⅱ

目的与要求 代码复审练习 结对练习 编写单元测试 基于上一个结对项目的结果,读取小文本文件A_Tale_of_Two_Cities.txt 或者 大文本文件Gone_with_the_wind.txt,统计某一指定单词在该文本文件中出现的频率. 命令行格式: 提示符> Myapp.exe -f filename.txt -w word (PS:C++ 程序,Java 程序输出方式类似) 解释: 选项 -f 表示打开某一文件 选项 -w 表示统计其后单词在打开的文件中的频率 详细内容 开发语言:J

结对项目之小游戏编程(斗地主)

一.题目简介    本次的项目是编写一个斗地主的小游戏,实现语言:java:主要完成了GUI设计.计时线程.算法.本次项目的主要目的是对算法的学习.算法分析在心得里面. 技术难点:1.图片的移动    2.计时线程的设定   3.对牌的分割,必须考虑到优先拆分方案,将权值低的拆分方案舍去. 4.在删除的时候遇到问题了,删除不了. 二.结对分工及过程 本次结对项目的成员有两个,张国伟:负责对GUI界面的设计,完成功能:洗牌功能,发牌功能,打牌功能的图片的位移处理,基本打牌的桌面等等. 我主要负责对

结对项目—地铁出行路线规划

结对项目—地铁出行路线规划 我的搭档:陈鸿超 14061216 https://github.com/ChengFR/PairProgramming_SubwayRoute- 会在十一期间发布新版本 结对编程体会: 结对编程的优点: 站在软件开发的角度,两个人共同面对同一台电脑进行开发,无论是效率还是软件质量都要超过一个人进行开发的情况. 对于还处于学习阶段的年轻软件开发者来说,结对编程是一个很好的互相学习的机会 结对编程时动力.责任感更强 结对编程的缺点: 对于我们来说,寻找两个人共同的时间进

软工_结对项目总结博客

关于结对编程 第一次进行真正的结对编程,而且我们组又是最奇葩的三人组合(14061183韩青长)(14061195陈彦吉),在经历了三天的合作以后,感觉收获还是蛮多的,下面是我对于结对编程的一些个人体验. 优点 在结对编程的过程中,两个人共同面对同一份代码,编码时旁边时刻有人提示监督.这样写出的代码,首先考虑的特殊情况会更多,能避免很多一个人编程时因为考虑不周而在某个不起眼的地方产生的Bug,代码质量更高,少了很多调试时间. 同时,由于两个人交替工作,一方面可以缓解疲劳,同时又因为身旁有人共同工

软件工程 结对项目总结

在结对项目中我和王以正同学一组.我们决定以王以正同学个人项目为基础开发.原因主要有几点:我使用的C++在开发效率和难易度上没有王以正用的java好:java语言的跨平台特性可以更好地支持网页端.安卓端:还有就是王以正同学个人项目的功能比我的更为完善.综合以上几点我们选用王以正同学的作为基础开发. 在这次结对项目中我学到了结对编程的方法.感觉这个方法十分实用,效率很高.因为个人开发的话遇到问题很容易陷入困境.止步不前继而工作效率十分低下.结对编程除了两个人分工合作提高了效率之外遇到问题也可以一起解

结对项目2

题目:构造程序,分别是: •不能触发Fault •触发Fault,但是不能触发Error. •触发Error,但是不能产生Failure. 结对对象:王翰林   博客地址:http://www.cnblogs.com/whl1127/p/5405639.html 双方贡献比例:1:1 编程照片: 源代码: import java.util.Scanner; public class MainTest { public static void main(String[] args) { doubl

结对项目总结

时为几周的结对项目结束了,经历了整个结对项目开发周期,我对结对开发软件有了一些新的认识.不同于个人的开发,结对项目强调的是两个人的合作关系.之前一个人能够搞定的问题,这下不得不两个人来做,开始时我是拒绝的.但是逐渐我发现,在两个人讨论的过程中,能够发现一些隐含的问题.比如,一个人设计的时候,有些事情没想明白就先做别的了,之后就忘掉了,但是在结对项目里面,这些问题想不搞清楚也不行,经常是随便提一句,然后就讨论了起来,然后就xx了:).咳 总的来看,整个结对项目可以分为几个大的阶段:一是讨论阶段,如

结对项目(附加题)开发总结

结对项目(附加题)开发总结 这次附加题的任务就是把两个小组写的独立的UI和CORE模块打乱重组,拼接成一个新的APP. 我们小组选择了大神刘乾所在小组和我们合作交换.一拿到乾神的核心代码,我不得不说,乾神就是乾神,代码一出,直接把我镇住了,各种参数看不懂咋办?咋写UI? 还好我们的乾神同志给我们提供了帮助文档,介绍了各个参数的作用,现摘录如下: 对于计算表达式的值(CALC模式): AnswerGet(string s)其中s是给定的算式,以等号结尾. 调用生成器时,使用: public Gen

结对项目总结博客

结对编程 这次结对项目由我和陈谋共同完成.下面是一张我们在一起讨论时委托他人帮忙拍摄的图片: 结对编程的优点: 1.相互之间能够进行代码复审,在代码复审中的提问与回应能帮助两人之间互相了解,更好的发现自己程序的瑕疵. 2.在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作解决问题的能力更强. 3.对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感. 4.结对能更有效地交流,相互学习和传递经验,分享知识. 结对编程的缺点: 1.对于有不同习惯的编程人员,在一起工