Java隨筆一則__Java

來源:互聯網
上載者: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.