2017-2018-2 20165315 实验三《敏捷开发与XP实践》实验报告
一、编码标准
编写代码一个重要的认识是“程序大多时候是给人看的”,编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。
编码标准中的版式就是一个很好的例子,版式虽然不会影响程序的功能,但会影响可读性。程序的版式追求清晰、美观,是程序风格的重要因素。
--娄老师《敏捷开发与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));
}
}
程序没有最基本的缩进,让人读起来很费劲,但是在IDEA中利用插件可以轻松解决:
- 打开
Settings
->Plugins
->Browse repositories...
- 在搜索框输入
alibaba
即可看到Alibaba Java Code Guidelines
插件,点击Install
进行安装,然后重启IDE生效:
- 在项目名称上单击右键,在弹出菜单上选择编码规约扫描即可扫描出不规范代码:
代码标准中很重要的一项是如何给包、类、变量、方法等标识符命名,能很好的命名可以让自己的代码立马上升一个档次。Java中的一般的命名规则有:
- 要体现各自的含义
- 包、类、变量用名词
- 方法名用动宾
- 包名全部小写,如:
io
,awt
- 类名第一个字母要大写,如:
HelloWorldApp
- 变量名第一个字母要小写,如:
userName
- 方法名第一个字母要小写:
setName
- ...
任务一:在IDEA中使用工具(Code->Reformate Code)格式化代码,并学习Code菜单的功能
- 打开工具栏中的
Code
选项,选择Reformate Code
功能,即可格式化代码
- 通过学习
Code
菜单,现将基本功能总结如下:-
Override Methods(Ctrl+O)
:重载基本类的方法; -
Implement Methods(Ctrl+I)
:完成当前类接口或者抽象基本类的接口的方法; -
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+斜杠)
:用块注释标记(“ /* */”)把所选块包围起来 -
Reformat Code(Ctrl+Alt+L)
:将代码按标准格式缩进; -
Move Statement Up/Down
:向上/向下移动代码语句; -
Move Line Up/Down
:向上/向下移动光标所在行 - ...
-
二、敏捷开发与XP
结对编程是XP中的重要实践。在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。他们并排坐在一台电脑前,面对同一个显示器,使用同一个键盘、同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起做单元测试,一起做集成测试,一起写文档等。
结对编程中有两个角色:
- 驾驶员(Driver)是控制键盘输入的人。
- 领航员(Navigator)起到领航、提醒的作用。
如何结对编程,为何要结对编程,大家参考一下结对编程和两人合作 ,重点是:
- 驾驶员:写设计文档,进行编码和单元测试等XP开发流程;
- 领航员:审阅驾驶员的文档、驾驶员对编码等开发流程的执行;考虑单元测试的覆盖率;思考是否需要和如何重构;帮助驾驶员解决具体的技术问题;
- 驾驶员和领航员不断轮换角色,不要连续工作超过一小时,每工作一小时休息15分钟。领航员要控制时间;
- 主动参与。任何一个任务都首先是两个人的责任,也是所有人的责任。没有“我的代码”、“你的代码”或“他/她的代码”,只有“我们的代码”;
- 只有水平上的差距,没有级别上的差异。两人结对,尽管可能大家的级别资历不同,但不管在分析、设计或编码上,双方都拥有平等的决策权利。
--娄老师《敏捷开发与XP实践》
任务二:在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例
- 登录码云后,进入自己的项目,点击
管理
,进入后选择项目成员管理
,将搭档加入自己的项目
- 找到搭档的
Complex
代码如下:
- 在IDEA的
Git
选项选择连接搭档的代码,下载后对照Complex
代码写出不少于三个Junit测试类
- 需要测试的类有:
getRealPart()
、getImagePart()
、Add()
、Sub()
、Multi()
、Div()
,将测试代码上传到搭档码云上
三、重构
重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。
--娄老师《敏捷开发与XP实践》
重构中一个非常关键的前提就是“不改变软件外部行为”,它保证了我们在重构原有系统的同时,不会为原系统带来新的BUG,以确保重构的安全。
我们要修改软件,万变不离其宗,无非就是四种动机:
- 增加新功能;
- 原有功能有BUG;
- 改善原有程序的结构;
- 优化原有系统的性能 。
需要重构的代码有哪些呢?
IDEA提供的重构功能在Refactor
选项中:
一个完整的重构流程包括:
- 从版本控制系统代码库中
Check out code
- 读懂代码(包括测试代码)
- 发现
bad smell
Refactoring
- 运行所有的
Unit Tests
- 往代码库中
Check in code
任务三:下载搭档的代码,至少进行三项重构
- 选择搭档的
Rational
代码 - 找出此代码中存在的四个问题
- 变量名不符合命名规则
- 类名不符合命名规则
- 类中的变量都是友好变量,改成私有变量更好
- 定义了多余的变量
- 根据上述问题,对搭档代码进行重构
四、Java密码学
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平台上进行用户身份鉴别的功能。
Java密码学算法:
- 体验加解密--凯撒密码
- Java对称加密--DES算法
- Java非对称加密--RSA算法
- 使用密钥协定创建共享密钥
- Java摘要算法- MD5
- Java混合密码系统
任务四:以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准
和搭档对各种算法进行学习研究后,我们选择了MD5
算法:
使用Java计算指定字符串的消息摘要,java.security
包中的MessageDigest
类提供了计算消息摘要的方法
-
首先生成对象,执行其
update()
方法可以将原始数据传递给该对象,然后执行其digest( )
方法即可得到消息摘要。具体步骤如下:- 生成
MessageDigest
对象:MessageDigest m=MessageDigest.getInstance("MD5");
- 传入需要计算的字符串:
m.update(x.getBytes("UTF8" ));
- 计算消息摘要:
byte s[ ]=m.digest( );
- 处理计算结果(必要的话可以使用如下代码将计算结果s转换为字符串)
String result="";
for (int i=0; i<s.length; i++){
result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);
} - 生成
编写代码如下:
- 对源代码进行格式化与重构
产品代码:
import java.io.UnsupportedEncodingException;
import java.security.*;
public class MD5Encrypt {
public static void main(String args[]) throws Exception {
String originalStr = args[0];
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
m.update(originalStr.getBytes("UTF8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte byteStr[] = m.digest();
GetResult getResult = new GetResult();
for (int i = 0; i < byteStr.length; i++) {
getResult.result += Integer.toHexString((0x000000ff & byteStr[i]) |
0xffffff00).substring(6);
}
}
public static class GetResult {
String result = "";
}
}
- 编写测试类代码
/*测试输入输出*/
String str = new String(originalStr);
System.out.println("明文:" + str);
System.out.println("密文:" + getResult.result);
实验过程中遇到的问题及解决
- 最开始不知道如何将搭档加入自己的项目,以为是建立一个项目,项目成员只有我和搭档两个人:
解决过程:
经过询问同学,知道了应该在自己项目的管理中邀请搭档成为该项目成员的开发者:
- 在对搭档的代码进行重构时,花了一番心思,因为搭档对代码的编写非常细致,很少有需要重构的地方
解决过程:
经过对重构的仔细学习和对搭档代码的认真检查,还是找到了几处需要重构的地方:
实验体会与总结
我通过本次实验学会了如何规范、格式化代码,如何将搭档加入自己的码云项目并进行合作编写代码,如何重构以及Java密码学相关知识。
在自己上手实践操作过程中,加深了对平时不清楚的知识点的理解,也掌握了重构等新知识点。这次实验是第一次真正意义上的“结对编程”,让我深刻体会到了“众人拾柴火焰高”这句真理,实时观测搭档的代码使得编程效率大大提高。
PSP(Personal Software Process)时间
步骤 | 耗时 | 百分比 |
---|---|---|
步骤 | 耗时 | 百分比 |
需求分析 | 30min | 19% |
设计 | 30min | 19% |
代码实现 | 60min | 38% |
测试 | 10min | 6% |
分析总结 | 30min | 18% |