博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20155303 实验三 敏捷开发与XP实践
阅读量:7100 次
发布时间:2019-06-28

本文共 6026 字,大约阅读时间需要 20 分钟。

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

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

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菜单如下:

1071476-20170505223026726-2026808585.png

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

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

1071476-20170505223409476-760167113.png

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

1071476-20170505223421445-1984179872.png

  • 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代码如下:

1071476-20170505223134492-1506146242.png

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

1071476-20170505223147679-1117427926.png

三、重构

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

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

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

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

1071476-20170505223511226-1726192097.png

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

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

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

1071476-20170505223528023-353213793.png

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

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

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

1071476-20170505223340367-184857507.png

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

附:练习

任务四:以结对的方式完成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

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

1071476-20170505223440242-226454858.png

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

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

1071476-20170505223058257-1164124874.png

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

1071476-20170505223112554-1432209143.png

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

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

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

1071476-20170505223209367-2137563081.png

查阅了资料,提示是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包即可。

1071476-20170505223222617-1610200264.png

可以看到测试通过了:

1071476-20170505223316820-138178355.png

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

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

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

1071476-20170505223541757-523000092.png

五、实验体会与总结

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

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

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

附:;;

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

六、参考资料

转载于:https://www.cnblogs.com/Vivian517/p/6815216.html

你可能感兴趣的文章
JavaScript是如何工作的:渲染引擎和优化其性能的技巧
查看>>
1017 A除以B (20 分)
查看>>
Grid布局简介
查看>>
android 微信、支付宝支付踩坑之旅
查看>>
数据库监控
查看>>
International SEO:多语言多区域网站SEO的快速入门指南
查看>>
tty的求助
查看>>
钱包开发数字货币钱包开发虚拟币多币种钱包开发
查看>>
spring cloud互联网分布式微服务云平台规划分析--spring cloud服务统一配置中心
查看>>
【Flask】关于request.json /.values /.args /.form
查看>>
Virtualbox虚拟Ubuntu共享文件夹设置
查看>>
ubuntu上安装lua
查看>>
完全检查点与增量检查点的区别
查看>>
rhel5.4安装oracle10g图文步骤1
查看>>
第一节课作业 150206119
查看>>
C++版银行家算法
查看>>
deepin中配置robot framework环境
查看>>
VMware-ESXI RHCS中fence配置
查看>>
深度解析Java内存的原型
查看>>
未能加载文件或程序集“AspNetPager”或它的某一个依赖项。参数错误。
查看>>