Java隨筆一則__Java
最後更新:2018-07-25
來源:互聯網
上載者:User
最近在讀<<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等等,它們是否值得我們在本科時間裡花大力氣去學??它們不過是老外開發的技術架構罷了,無論是誰只要不笨,在參加工作後都能夠很快掌握.或許值得學.但是我們首先要問問自己:基礎打好了沒?很多人基礎沒有打好就去學這學那,我覺得我就是個典型,比如:我根本就沒有很好得理解物件導向是什麼.My Code沒有什麼可讀性,更談不上維護和擴充了.更加糟糕的是:我對有些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