20155303 实验三 敏捷开发与XP实践

目录

一、编码标准

编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。

  • 规定的规范缩进:
public class CodeStandard {
public static void main(String [] args){
StringBuffer buffer = new StringBuffer();
buffer.append('S');
buffer.append("tringBuffer");
System.out.println(buffer.charAt(1));
System.out.println(buffer.capacity());
System.out.println(buffer.indexOf("tring"));
System.out.println("buffer = " + buffer.toString());
if(buffer.capacity()<20)
buffer.append("1234567");
for(int i=0; i<buffer.length();i++)
System.out.println(buffer.charAt(i));
}
}

这样的代码没有层次感,不符合代码的规范。适时缩进,并根据逻辑加入一些空行,改成下面这种格式就清晰多了:

public class CodeStandard {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer();
buffer.append('S');
buffer.append("tringBuffer");
System.out.println(buffer.charAt(1));
System.out.println(buffer.capacity());
System.out.println(buffer.indexOf("tring")); System.out.println("buffer = " + buffer.toString());
if (buffer.capacity() < 20)
buffer.append("1234567");
for (int i = 0; i < buffer.length(); i++)
System.out.println(buffer.charAt(i));
}
}
  • Java中的一般的命名规则:

    • 要体现各自的含义
    • 包、类、变量用名词
    • 方法名用动宾
    • 包名全部小写,如:io,awt
    • 类名第一个字母要大写,如:HelloWorldApp
    • 变量名第一个字母要小写,如:userName
    • 方法名第一个字母要小写:setName
    • ...

任务一:在IDEA中使用工具(Code->Reformate Code)格式化代码,并学习Code菜单的功能

IDEA中的Code菜单如下:

可以发现其中的功能十分丰富,同时很多功能都可以通过快捷键实现。现将几个比较常用的功能总结如下:

  • Override Methods(Ctrl+O):重载基本类的方法;
  • Implement Methods(Ctrl+I):完成当前类 implements 的(或者抽象基本类的)接口的方法;
  • Generate(Alt+Insert):创建类里面任何字段的 getter 与 setter 方法;
  • Surround With(Ctrl+Alt+T):使用if-elsetry-catchdo-while等包装代码段;

  • Insert Live Template(Ctrl-J):执行一些记不起来的 Live Template 缩写;

  • Comment with Line Comment(Ctrl+斜杠)/Comment with Block Comment(Ctrl+Shift+斜杠):用 Ctrl+斜杠 与 Ctrl-Shift-/ 来注释(或反注释)代码行与代码块。 用Ctrl+斜杠单行注释标记(“ //… ”)来注释(或反注释)当前行或者选择地代码块。而 Ctrl+Shift+斜杠则可以用块注释标记(“ /* */”)把所选块包围起来。要反注释一个代码块就在块中任何一个地方按 Ctrl+Shift+斜杠 即可;
  • Reformat Code(Ctrl+Alt+L):将代码按标准格式缩进;
  • ...

后面还有一些可以将光标所在行上移或下移的功能,如果能在实践中经常使用Code菜单的各个功能,可以大大提升编程效率。

返回目录

二、敏捷开发与XP

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

任务二:下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例

搭档的Complex代码如下:

需要测试的方法有:add()minus()multiply(),所以编写测试代码并上传到搭档码云项目上:

返回目录

三、重构

重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。

我们要修改软件,万变不离其宗,无非就是四种动机:

  • 增加新功能;
  • 原有功能有BUG;
  • 改善原有程序的结构;
  • 优化原有系统的性能 。

IDEA主要提供了以下重构功能:

那么,哪些地方需要重构呢?有臭味道(Bad Smell)的代码。这个概念非常宽泛,不仅包括代码重复,还有方法过长参数列过长条件逻辑过度复杂分支语句等等方面。通过重构,我们可以实现代码的优化。

任务三:下载搭档的代码,至少进行三项重构

下载了搭档的这样一个代码:

通过分析,我们可以发现这个程序主要存在以下几个问题:

  • 类名不符合命名规则;
  • 定义了a,b,c,d,m几个变量,但阅读下文发现只用到了a和m这两个变量,浪费内存;
  • printf是对输出文字格式化后再显示在文本模式中,但在这里只需要标准输出即可;
  • 最后一行if代码太长,可以进行修改优化;
  • ...

基于以上分析,可以将程序进行如下修改:

这样一来,代码就清秀了很多:)

返回目录

附:练习

任务四:以结对的方式完成Java密码学相关内容的学习,结合重构、git、代码标准等

Java安全体系结构总共分为4个部分:

  • JCA( Java Cryptography Architecture, Java加密体系结构):JCA提供基本的加密框架, 如证书、 数字签名、消息摘要和密钥对产生器。
  • JCE( Java Cryptography Extension, Java加密扩展包):JCE在JCA的基础上作了扩展, 提供了各种加密算法、 消息摘要算法和密钥管理等功能。JCE的实现主要在javax.crypto包( 及其子包) 中
  • JSSE( Java Secure Sockets Extension, Java安全套接字扩展包):JSSE提供了基于SSL( Secure Sockets Layer,安全套接字层) 的加密功能。 在网络的传输过程中, 信息会经过多个主机(很有可能其中一台就被窃听) , 最终传送给接收者, 这是不安全的。这种确保网络通信安全的服务就是由JSSE来提供的。
  • JAAS( Java Authentication and Authentication Service, Java鉴别与安全服务):JAAS提供了在Java平台上进行用户身份鉴别的功能。

进行了学习之后,我与搭档选择了实现MD5算法,以结对的方式完成了代码编写的工作。

首先,我们一起学习了java.security包中的MessageDigest类,以及类中的方法,包括update()digest()等。

大致了解了MD5算法需要用到的方法框架后,我编写了伪代码:

/**
* 伪代码:
*
* MD5算法:把一个任意长度的字节串变换成一定长的十六进制数字串
* 具体步骤:(1)生成MessageDigest对象
*(2)传入需要计算的字符串
*(3)计算消息摘要
*(4)处理计算结果
*/

搭档参考伪代码,编写了产品代码:

import java.security.MessageDigest;

public class DigestPass{
public static String md5Encode(String inStr) throws Exception {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
return "";
} byte[] byteArray = inStr.getBytes("UTF-8");
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
}

最后,我编写了测试代码对产品代码进行测试:

public static void main(String args[]) throws Exception {
String str = new String("amigoxiexiexingxing");
System.out.println("原始:" + str);
System.out.println("MD5后:" + md5Encode(str));
}

返回目录

四、实验过程中遇到的问题及解决

问题一:IDEA错误:Cannot start compilation: the output path is not specified for module "XXX". Specify the out

拷贝下搭档的代码后,不能正常运行,出现以下错误提示:

这个错误是因为没有设置output的路径,只要修改两个地方的设置就可以了:

  1. 在Modules设置里勾选”Inherit project compile path”

  1. 设置Project中的”Project compiler output” ,选择”Project的路径”+”\out”

将这两处改好后就能正常运行了。

问题二:JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误

运行测试类出现以下错误提示:java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

查阅了资料,提示是JUnit版本的问题,缺少hamcrest的包。官网上有这样一段话:

  • junit.jar: Includes the Hamcrest classes. The simple all-in-one solution to get started quickly.Starting with version 4.11, Hamcrest is no longer included in this jar.
  • junit-dep.jar: Only includes the JUnit classes but not Hamcrest. Lets you use a different Hamcrest version

加粗处说明4.1.1中没有hamcrest包了,导入hamcrest-core-1.3-jar包即可。

可以看到测试通过了:

问题三:IDEA错误:错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum

这是因为:IDEA可以自动把UTF-8+BOM文件转为普通的UTF-8文件,但Android Studio需要重新转一下。所以需要将编码格式UTF-8+BOM文件转为普通的UTF-8文件。

解决方法为:在右下角,将编码改为GBK,再转为UTF-8即可。

返回目录

五、实验体会与总结

这次实验是第一次真正意义上的“结对编程”,让我深刻体会到了“众人拾柴火焰高”这句真理。结对实践过程中需要经常与搭档交流,包括对代码架构的设想和建议,以及程序细节上的修改方案等等。

从某种程度上讲,结对编程效率更高,在结对过程中可以随时分享自己的经验,遇到问题也可以一起讨论解决,整个过程不再枯燥无趣,而仿佛成为了一场思维的碰撞。

与之前每次实验过程一样,这次实验不可避免地出现了各种各样的错误提示,但“存在即合理”,我们遇到的每一个错误都是有原因的,这些错误提示反而为我们提供了思路。参考老师的教程、去CSDN上搜索学习,甚至凭借自己的经验猜测并通过实践验证等等,方法多种多样,总能解决问题。

附:我的码云地址搭档的码云地址搭档的博客链接

步骤 耗时 百分比
需求分析 12min 10%
设计 10min 8%
代码实现 48min 40%
测试 40min 34%
分析总结 10min 8%

返回目录

六、参考资料

返回目录

20155303 实验三 敏捷开发与XP实践的更多相关文章

  1. 20145213《Java程序设计》实验三敏捷开发与XP实践

    20145213<Java程序设计>实验三敏捷开发与XP实践 实验要求 1.XP基础 2.XP核心实践 3.相关工具 实验内容 1.敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法 ...

  2. 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...

  3. JAVA课程实验报告 实验三 敏捷开发与XP实践

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

  4. 20145225《Java程序设计》 实验三 "敏捷开发与XP实践"

    20145225<Java程序设计> 实验三 "敏捷开发与XP实践" 实验报告 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 git 上 ...

  5. 20145215实验三 敏捷开发与XP实践

    20145215实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软 ...

  6. 20145325张梓靖 实验三 "敏捷开发与XP实践"

    20145325张梓靖 实验三 "敏捷开发与XP实践" 程序设计过程 实验内容 使用 git 上传代码 git上传中遇到的问题 使用 git 相互更改代码 实现代码的重构 git ...

  7. 20162311 实验三 敏捷开发与XP实践 实验报告

    20162311 实验三 敏捷开发与XP实践 实验报告 实验内容 一.研究学习IDEA中的Code菜单 使用Code ->Reformate Code功能将以下代码格式化 public clas ...

  8. 2018-2019-20175205 实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告

    2018-2019-20175205 实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...

  9. 20175314 实验三 敏捷开发与XP实践

    20175314 实验二 Java面向对象程序设计 一.实验内容 XP基础 XP核心实践 相关工具 二.实验步骤 (一)代码格式化 创建"175314.exp3"项目,在该项目下创 ...

随机推荐

  1. LeetCode 638 Shopping Offers

    题目链接: LeetCode 638 Shopping Offers 题解 dynamic programing 需要用到进制转换来表示状态,或者可以直接用一个vector来保存状态. 代码 1.未优 ...

  2. UIView 添加闪烁的渐变光

    CGRect gradientRect=CGRectMake(- imageView3.bounds.size.width*, * imageView3.bounds.size.width, imag ...

  3. Docker in Docker的安装 路不通

    1. 先启动centos 镜像 然后 再docker cp文件 然后再执行安装报错 [root@CentOS75 ~]# docker run -it centos /bin/bash [root@1 ...

  4. jira 插件介绍地址

    1. 官方的 介绍地址 http://confluence.gjingao.com/pages/viewpage.action?pageId=328170 序号 插件名称 功能概要 供应商 资源 10 ...

  5. Java 8新特性之 Nashorn(八恶人-6)

    Joe Gage 盖奇·乔 “First time in my life I made a pretty penny.And, figured I'd come home and spend time ...

  6. idea和eclipse的区别

    使用基于IntelliJ的IDE,都会对project和module的关系比较糊涂.用简单的一句话来概括是: IntelliJ系中的Project相当于Eclipse系中的workspace.Inte ...

  7. Kangax 的 ES7 兼容性表格

    Kangax 的 ES7 兼容性表格 https://kangax.github.io/compat-table/es2016plus/ Sort by             Engine type ...

  8. C++11 初始化

    C++11 初始化 统一初始化语法        C++11新添加初始化列表 std::initializer_list<>类型,可以通过{}语法来构造初始化列表 .初始化列表是常数:一旦 ...

  9. MT【187】余弦的线性组合

    已知$\alpha+\beta+\gamma=\pi,(\alpha,\beta,\gamma\ge0)$ 求:$3\cos\alpha+4\cos\beta+5\cos\gamma$的最大值____ ...

  10. Mac中把光盘转存为iso文件

    因为Mac是类Unix的,因此,dd命令同样适用于Mac,那么,就很简单了,复习一下dd的用法而已 [xiaosilent@rmbp Volumes]$ drutil status Vendor Pr ...