zoukankan      html  css  js  c++  java
  • 20145205 《Java程序设计》实验报告三:敏捷开发与XP实践

    开发与XP实践
    实验要求
    1.XP基础
    2.XP核心实践
    3.相关工具

    实验内容
    敏捷开发与XP
    软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。

    人们在开发、运营、维护软件的过程中有很多技术、做法、习惯和思想体系。软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”。软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性。

    光有各种流程的思想是不够的,我们还要有一系列的工具来保证这些思想能够在实践中有效率地运作。软件开发很重要的一点不是看你能对多少理论讲的头头是道,还要看你对相关工具应用的如何,比如Java中单元测试要和JUnit的应用结合起来,建模要和UmbrelloStarUML的应用结合起来。编程学习是一个习而学的过程。

    常见的公式是:软件工程=开发流程+工具

    常见的开发流程有:

    RUP(Rational Unified Process)

    PSP(Personal Software Process )

    TSP(Team Software Process )

    Agile Process
    ……

    XP软件开发是什么样的
    通过XP准则来表达:

    沟通 :XP认为项目成员之间的沟通是项目成功的关键,并把沟通看作项目中间协调与合作的主要推动因素。
    简单 :XP假定未来不能可靠地预测,在现在考虑它从经济上是不明智的,所以不应该过多考虑未来的问题而是应该集中力量解决燃眉之急。
    反馈 :XP认为系统本身及其代码是报告系统开发进度和状态的可靠依据。系统开发状态的反馈可以作为一种确定系统开发进度和决定系统下一步开发方向的手段。
    勇气:代表了XP认为人是软件开发中最重要的一个方面的观点。在一个软件产品的开发中人的参与贯穿其整个生命周期,是人的勇气来排除困境,让团队把局部的最优抛之脑后,达到更重大的目标。表明了XP对“人让项目取得成功”的基本信任态度。

    一项实践在XP环境中成功使用的依据通过XP的法则呈现,包括:快速反馈、假设简单性、递增更改、提倡更改、优质工作。

    XP软件开发的基石是XP的活动,包括:编码、测试、倾听、设计。

    项目成员用户成功执行XP活动的技术通过XP实践来呈现,包括编程、团队、过程相关的12条实践.

    编码标准

    编写代码一个重要的认识是“程序大多时候是给人看的”,编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。

    编码标准中的版式就是一个很好的例子,版式虽然不会影响程序的功能,但会影响可读性。程序的版式追求清晰、美观,是程序风格的重要因素。

    这里老师给出了一个国外的比赛,里面有C语言的格式错误示范,这里面的代码都是可以运行的,但是格式实在不符合一个程序员该有的格式。(这里有一个链接大家可以看看。)
    -C语言混乱代码大赛之错误的示范

    虽然他们的格式有问题,但是都是可以运行的代码,这又从另一个方面说明了,他们的C语言水平是真的高,这又是我们应该去努力靠近的。

    结对编程
    结对编程是XP中的重要实践。在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。他们并排坐在一台电脑前,面对同一个显示器,使用同一个键盘、同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起做单元测试,一起做集成测试,一起写文档等。

    结对编程中有两个角色:

    驾驶员(Driver)是控制键盘输入的人。
    领航员(Navigator)起到领航、提醒的作用。
    如何结对编程,为何要结对编程,大家参考一下结对编程和两人合作 ,重点是:

    驾驶员:写设计文档,进行编码和单元测试等XP开发流程。
    领航员:审阅驾驶员的文档、驾驶员对编码等开发流程的执行;考虑单元测试的覆盖率;思考是否需要和如何重构;帮助驾驶员解决具体的技术问题。
    驾驶员和领航员不断轮换角色,不要连续工作超过一小时,每工作一小时休息15分钟。领航员要控制时间。

    主动参与。任何一个任务都首先是两个人的责任,也是所有人的责任。没有“我的代码”、“你的代码”或“他/她的代码”,只有“我们的代码”。

    只有水平上的差距,没有级别上的差异。两人结对,尽管可能大家的级别资历不同,但不管在分析、设计或编码上,双方都拥有平等的决策权利。

    团队精神是好多地方都强调的一个精神,最小的团队就是一对一的二人团队了,培养团队精神从结对编程开始吧。社会生活中人与人相处最重要的是诚信,有同理心,互利。结对编程中大家会出现分歧,如何更有效地合作要做到对事不对人,掌握这些是可以终生受益的。

    版本控制

    XP的集体所有制意味着每个人都对所有的代码负责;这一点,反过来又意味着每个人都可以更改代码的任意部分。结对编程对这一实践贡献良多:借由在不同的结对中工作,所有的程序员都能看到完全的代码。集体所有制的一个主要优势是提升了开发程序的速度,因为一旦代码中出现错误,任何程序员都能修正它。

    这意味着代码要放到一个大家都能方便获取的地方,我们叫代码仓库。这引出另外一个话题叫版本控制(Version Control)

    不论是对于团队还是个体,版本控制都提供了很多好处。

    版本控制提供项目级的 undo(撤销) 功能: 没有什么事情是终结版本, 任何错误必须很容易回滚。 假设你在使用世界上最复杂的文字处理系统。 它具备了所有的能想到的功能,就是没有支持 DELETE(删除) 键。想象你打字的时候得多么的谨慎和缓慢吧, 特别是一篇超大的文档的快临近末尾的时候, 一个不小心就要重新再来(试想你选中所有的文字, 不小心按了 DELETE 键, 因为没有撤销功能,只好重新录入)。编辑文字和版本控制相同,任何时候都需要回滚,无论是一个小时, 一天, 还是一周, 这让你的团队工作自由快速的工作, 而且对于修正错误也非常自信。

    版本控制允许多人在同一代码上工作, 只要遵守一定的控制原则就行。 再也不会发生诸如一个人覆盖了另一个人编辑的代码,导致那个人的修改无效这样的情况。

    版本控制系统保存了过去所作的修改的历史记录。如果你遭遇到一些惊讶的代码,通过版本控制系统可以很容易找出是谁干的, 修改了什么, 修改的时间, 如果幸运的话,还能找出原因。

    版本控制系统还支持在主线上开发的同时发布多个软件版本。在软件发布的时候也不需要整个团队的停止工作,不需要冻结代码。

    版本控制也是项目级的时间机器,你可以选择任何一个时间, 精确地查看项目在当时的情况。 这对研究非常有用, 也是重现以前某个有问题的发布版本的基础。

    流行的版本控制工具有CVSSVNGit等,更多的可以参考这里。GitLinus除了Linux操作系统外的另外一个重要发明。

    实验过程
    首先是共建项目和互相设置权限
    共建项目

    设置权限


    之后是方浩南同学先进行代码的一次上传

    因为我有了权限之后可以将他的代码克隆到我的电脑里进行修改编译

    在修改完成后上传

    这样就完成了使用git进行合作开发的一次简单尝试
    实验代码
    首先是方浩南同学编写了一个复数类

    
       public class ComplexNumber
    {
     double r,i;
      
    
    public  ComplexNumber(){
    	this.r=0;
    	this.i=0;
    }
    public ComplexNumber(double r, double i){
    	this.r=r;
    	this.i=i;
    }
    public double GetRealPart(){
    	return this.r;
    }
    public double GetImaginaryPart(){
    	return this.i;
    }
    public void SetRealPart(double r){
    	this.r=r;
    }
    public void SetImaginaryPart(double i){
    	this.i=i;
    }
    public ComplexNumber ComplexAdd(ComplexNumber a,ComplexNumber b)    
    {
    	ComplexNumber temp = new ComplexNumber();
        temp.r = a.r + b.r;
        temp.i  = a.i  + b.i;
        return temp;
    }
    public ComplexNumber ComplexMinus(ComplexNumber a,ComplexNumber b)    
    {
    	ComplexNumber temp =new ComplexNumber();
        temp.r=a.r - b.r;
        temp.i =a.i - b.i;
        return temp;
    }    
    public ComplexNumber ComplexMulti(ComplexNumber a,ComplexNumber b)    
    {
    	ComplexNumber temp = new ComplexNumber();
        temp.r = a.r*b.r-a.i*b.i;
        temp.i  = a.r*b.i+a.i*b.r;
        return temp;
    }
    public void ComplexAdd(ComplexNumber c){
    	this.r=this.r+c.r;
    	this.i=this.i+c.i;
    }
    
    
    public void ComplexMinus(ComplexNumber c){
    	this.r=this.r-c.r;
    	this.i=this.i-c.i;
    }
    public void ComplexMulti(ComplexNumber c)                
    {
        double temp=this.r;    
        this.r=this.r*c.r-this.i*c.i;
        this.i =temp*c.i+this.i*c.r;
    }
    public void printComplexNumber(){
    	System.out.print(""+this.r+"+"+this.i+"i");
    }
    
    
    
    

    之后我克隆我的本地后,为之加上了测试代码,来测验其功能

      public class ComplexNumber
    {
     double r,i;
      
    
    public  ComplexNumber(){
    	this.r=0;
    	this.i=0;
    }
    public ComplexNumber(double r, double i){
    	this.r=r;
    	this.i=i;
    }
    public double GetRealPart(){
    	return this.r;
    }
    public double GetImaginaryPart(){
    	return this.i;
    }
    public void SetRealPart(double r){
    	this.r=r;
    }
    public void SetImaginaryPart(double i){
    	this.i=i;
    }
    public ComplexNumber ComplexAdd(ComplexNumber a,ComplexNumber b)    
    {
    	ComplexNumber temp = new ComplexNumber();
        temp.r = a.r + b.r;
        temp.i  = a.i  + b.i;
        return temp;
    }
    public ComplexNumber ComplexMinus(ComplexNumber a,ComplexNumber b)    
    {
    	ComplexNumber temp =new ComplexNumber();
        temp.r=a.r - b.r;
        temp.i =a.i - b.i;
        return temp;
    }    
    public ComplexNumber ComplexMulti(ComplexNumber a,ComplexNumber b)    
    {
    	ComplexNumber temp = new ComplexNumber();
        temp.r = a.r*b.r-a.i*b.i;
        temp.i  = a.r*b.i+a.i*b.r;
        return temp;
    }
    public void ComplexAdd(ComplexNumber c){
    	this.r=this.r+c.r;
    	this.i=this.i+c.i;
    }
    
    
    public void ComplexMinus(ComplexNumber c){
    	this.r=this.r-c.r;
    	this.i=this.i-c.i;
    }
    public void ComplexMulti(ComplexNumber c)                
    {
        double temp=this.r;    
        this.r=this.r*c.r-this.i*c.i;
        this.i =temp*c.i+this.i*c.r;
    }
    public void printComplexNumber(){
    	System.out.print(""+this.r+"+"+this.i+"i");
    }
    public static void main(String[] args)        //测试代码
    {
        ComplexNumber cc=new ComplexNumber(4,5);
        cc.printComplexNumber();
        System.out.println();
        ComplexNumber dd=new ComplexNumber(2,4);
        dd.printComplexNumber();
        System.out.println();
        System.out.println("-----------------");
        System.out.println();
        ComplexNumber ff=new ComplexNumber();
        
        ff=ff.ComplexAdd(cc,dd);
        ff.printComplexNumber();
        System.out.println();
        ff=ff.ComplexMinus(cc,dd);
        ff.printComplexNumber();
        System.out.println();
        ff=ff.ComplexMulti(cc,dd);
        ff.printComplexNumber();
        System.out.println();
        
        System.out.println("-----------------");
         
    }
    }
    

    运行结果如图

    总结感想:
    本次实验中,第一次用到了git 的去进行一个合作模式下开发项目,因为之前对于git 的实用性不熟悉导致了过程一定的弯路,但是之后发现,如果真的是在开发过程中,我们就只需要知道对方的开源中国位置,之后就可以完全在git里操作,不需要其他操作,所以在合作开发一个大的项目的时候就会很方便,而且还可以多人进行共同开发。

    小组合作情况
    20145205武钰:进行测试代码的编写,博客的主要编写以及git环境的设置
    20145237方浩南:进行初始代码的编写,协作完成博客。

    PSP时间

    步骤 耗时 :100分钟 百分比
    需求分析 10分钟 10%
    设计 15分钟 15%
    代码实现 45分钟 45%
    测试 10分钟 10%
    分析总结 20分钟 20%
  • 相关阅读:
    数组review
    算法复杂度分析
    利用栈判断括号是否匹配(Parentheses)
    java实现stack和queue
    路由器结构
    层次化路由简介
    es 嵌套对象和父子文档对比
    远心镜头的远心度
    Delphi编程细节汇总
    halcon深度学习总结(二)
  • 原文地址:https://www.cnblogs.com/20145205y/p/5428617.html
Copyright © 2011-2022 走看看