20155303 实验三 敏捷开发与XP实践
20155303 实验三 敏捷开发与XP实践
目录
-
问题二:JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
问题三:IDEA错误:错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum
一、编码标准
编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。
- 规定的规范缩进:
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-else
、try-catch
、do-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的路径,只要修改两个地方的设置就可以了:
- 在Modules设置里勾选”Inherit project compile path”
- 设置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% |
六、参考资料
- 实验三 敏捷开发与XP实践——娄老师的博客
- Java 密码学算法——娄老师的博客
- 错误:非法字符:“\ufeff”
- IDEA错误:Cannot start compilation: the output path is not specified for module "Test". Specify the out
- JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
- Java代码重构的几种模式详解
- java 代码重构(系列讲解)
- IntelliJ IDEA使用技巧一览表
20155303 实验三 敏捷开发与XP实践的更多相关文章
- 20145213《Java程序设计》实验三敏捷开发与XP实践
20145213<Java程序设计>实验三敏捷开发与XP实践 实验要求 1.XP基础 2.XP核心实践 3.相关工具 实验内容 1.敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法 ...
- 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...
- JAVA课程实验报告 实验三 敏捷开发与XP实践
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:韩玉琪 学号:20135317 成绩: 指导教师:娄嘉 ...
- 20145225《Java程序设计》 实验三 "敏捷开发与XP实践"
20145225<Java程序设计> 实验三 "敏捷开发与XP实践" 实验报告 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 git 上 ...
- 20145215实验三 敏捷开发与XP实践
20145215实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软 ...
- 20145325张梓靖 实验三 "敏捷开发与XP实践"
20145325张梓靖 实验三 "敏捷开发与XP实践" 程序设计过程 实验内容 使用 git 上传代码 git上传中遇到的问题 使用 git 相互更改代码 实现代码的重构 git ...
- 20162311 实验三 敏捷开发与XP实践 实验报告
20162311 实验三 敏捷开发与XP实践 实验报告 实验内容 一.研究学习IDEA中的Code菜单 使用Code ->Reformate Code功能将以下代码格式化 public clas ...
- 2018-2019-20175205 实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告
2018-2019-20175205 实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...
- 20175314 实验三 敏捷开发与XP实践
20175314 实验二 Java面向对象程序设计 一.实验内容 XP基础 XP核心实践 相关工具 二.实验步骤 (一)代码格式化 创建"175314.exp3"项目,在该项目下创 ...
随机推荐
- LeetCode 638 Shopping Offers
题目链接: LeetCode 638 Shopping Offers 题解 dynamic programing 需要用到进制转换来表示状态,或者可以直接用一个vector来保存状态. 代码 1.未优 ...
- UIView 添加闪烁的渐变光
CGRect gradientRect=CGRectMake(- imageView3.bounds.size.width*, * imageView3.bounds.size.width, imag ...
- Docker in Docker的安装 路不通
1. 先启动centos 镜像 然后 再docker cp文件 然后再执行安装报错 [root@CentOS75 ~]# docker run -it centos /bin/bash [root@1 ...
- jira 插件介绍地址
1. 官方的 介绍地址 http://confluence.gjingao.com/pages/viewpage.action?pageId=328170 序号 插件名称 功能概要 供应商 资源 10 ...
- 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 ...
- idea和eclipse的区别
使用基于IntelliJ的IDE,都会对project和module的关系比较糊涂.用简单的一句话来概括是: IntelliJ系中的Project相当于Eclipse系中的workspace.Inte ...
- Kangax 的 ES7 兼容性表格
Kangax 的 ES7 兼容性表格 https://kangax.github.io/compat-table/es2016plus/ Sort by Engine type ...
- C++11 初始化
C++11 初始化 统一初始化语法 C++11新添加初始化列表 std::initializer_list<>类型,可以通过{}语法来构造初始化列表 .初始化列表是常数:一旦 ...
- MT【187】余弦的线性组合
已知$\alpha+\beta+\gamma=\pi,(\alpha,\beta,\gamma\ge0)$ 求:$3\cos\alpha+4\cos\beta+5\cos\gamma$的最大值____ ...
- Mac中把光盘转存为iso文件
因为Mac是类Unix的,因此,dd命令同样适用于Mac,那么,就很简单了,复习一下dd的用法而已 [xiaosilent@rmbp Volumes]$ drutil status Vendor Pr ...