`
baiguomeng
  • 浏览: 956310 次
文章分类
社区版块
存档分类
最新评论

Java随笔一则

 
阅读更多
最近在读<<Agile Java Crafting Code with Test-Driven Development>>.

这是我在去年买了Kent Benk的<<Test-Driven Development>>后读的第三本关于Agile development
的书.<<TDD>>告诉我了测试驱动开发的大概方法,至于细节就没有面面俱到了.而<<Agile Java ...>>这本
书以JDK5.0,用一个学生MIS系统的例子展示了敏捷开发的完整过程.

我是边看书边一步步跟着作者写代码的.收获颇丰.

同时自己也看到了自己的许多不足.用Java这样的面向对象的语言写程序,非常重要的一点就是"面向对象",自己应该尽量用接口编程,不要用具体类;每个类尽量只完成属于自己的任务;而每个方法也尽量做到只完成一个任务,等等这样能够让代码更易于维护和阅读.就是这些最基本的问题,我自己平时根本没有注意到,我有个坏习惯,就是不会去看我1个月时间之前写的代码.归根到底还是自己的代码写的可读性太差!而扩展性更是没有.

老外的代码基本上都是非常面向对象的,我很羡慕这一点.一直以来,包括我还有很多象我一样的学生朋友一直追求学新的技术,这本来是没有什么不好,但是我现在在考虑:象图形界面如Swing,Swt/Jface,或是web框架如struts或spring,或是eclipse技术的插件,RCP等等,它们是否值得我们在本科时间里花大力气去学??它们不过是老外开发的技术框架罢了,无论是谁只要不笨,在参加工作后都能够很快掌握.或许值得学.但是我们首先要问问自己:基础打好了没?很多人基础没有打好就去学这学那,我觉得我就是个典型,比如:我根本就没有很好得理解面向对象是什么.我的代码没有什么可读性,更谈不上维护和扩展了.更加糟糕的是:我对有些Java最基本的概念都还没弄清楚!很多问题归根到底还是源于自己的懒惰.

再回来谈谈我对敏捷开发的感受吧,敏捷开发的基本步骤是:1.写测试代码2.写可以通过测试的代码3.重构代码4.重构
测试代码5.回到1向前推进.我觉得最重要的步骤在于重构这一步.重构消除了重复的代码.重构后的代码能变得非常漂亮.因此我也准备在读完<<Agile Java>>后阅读<<Refactoring-Improving the Design of Existing Code>>

前两天在一个国外的论坛看到一个帖子,发帖子的人问了一个这样的问题:
如何比较3个字符串?
他是这样写的:
if ( (s1.equals(s2) )&& ( s2.equals(s3) )
他问有没有更好的办法?如果是多于3个呢?

有个人给出一个精彩的回答:
String[] s = {"one", "two", "two"};
List list = Arrays.asList(s);
Set set = new HashSet(list);
System.out.println(list.size() == set.size()); // false

呵呵,非常有意思的一个解决办法.

另外还看到一个有趣的帖子:
如何不借用第三个变量对换两个变量的值?
马上有人给出答案:
A = A + B

B = A - B

A = A - B

但是高手总是喜欢开点小玩笑:)
有人给出了这样的办法:
a = a ^ b;
b = a ^ b; ((a ^ b) ^ b == a)
a = a ^ b; ((a ^ b) ^ a == b)

不仅解答有意思,就是连发帖子的那个人为何想到这个问题我都觉得搞笑:P

还有一个帖子,它给了我沉重一击,到现在我连Java最基本的问题都没弄清楚!
看了后我自己写了个测试程序:

package reference;

import junit.framework.TestCase;

public class ReferenceTest extends TestCase {
public void testReference(){
int i = 0;
change(i);
assertEquals(0, i);//测试1:这里的i没变
}
public void testArray(){
int[] j = new int[3];
expand(j);
assertEquals(3, j.length);//测试2:这里数组j的长度也没变
}
public void testArray2(){
int[] j = new int[3];
for(int p = 0; p < j.length; p++){
j[p] = 1;
}
zero(j);
assertEquals(0, j[0]);//测试3:数组的每个值都变为0了
}
/**
* 把100赋给i
*/
private void change(int i){
i = 100;
}
/**
* 把数组的长度扩展为原来的两倍
*/
private void expand(int[] array) {
array = new int[2*array.length];
}
/**
* 给数组的每个变量赋值0
*/
private void zero(int[] array) {
for (int i = 0; i<array.length; i++)
array[i] = 0;
}
}
测试1的结果还简单.测试2和测试3的原因我就有点晕头转向了.看了两篇文章后才知道为什么.
Java是按值传递的.
http://www.javaranch.com/campfire/StoryCups.jsp
http://www.javaranch.com/campfire/StoryPassBy.jsp
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics