編程方法學 – 公開課學習筆記(八)

來源:互聯網
上載者:User

第22課 Component和Comtainer 2011.8.9-10

這是一張圖,可以從中看出componenet和Container的關係,而JComponent,例如Swing,是Container的一個子類。

A component is anything that can appear in a window, A containers contains other components。從圖上可以看到,Container是繼承了Component,也就是Container也是一個Component。

介紹了component大小隨著視窗resize而自動適配的方式。根據自上而下的編程方式,在Program中放置一個可自適應尺寸的MyCavas,pulic class MyCavas extends GCanvas implements ComponmentLister{}。其中ComponmentLister中重寫resize的情況,其實也就是removeAll()之後,重新畫,而畫是基於size的,以此來實現。課程舉了兩個例子也說明此過程。

第23課 尋找、排序和演算法效率分析 2011.8.19

Searching和Sorting是在C語言學齡前學習中進行頭腦體操用,在Java中,我經常使用HashMap來處理,所以降到尋找和排序,好似回複很久以前的年代,至少JAVA中不需要考慮鏈表。尋找和排序來講,效率很重要,但是簡潔易懂的程式同樣很重要。

介紹線性掃描,對於隨機無序的資料,貌似沒有什麼其他好方法。對於已排序好的,C中我一般用二分法,效率高嘛。接著就介紹了這種binary search的方法。二分法如下,對於整數,low+high可能會超過邊界(int 32bits)的問題,如果你需處理的資料真的很多很多。

while(lh <= rh){
    int mid =(lh+rh)/2;
    if(key == disp.get(mid)) return mid;
    if(key <= disp.get(mid)){
        rh = mid-1;
    }else{
        lh = mid+1;
    }
}
return -1;

排序首先介紹冒泡法,古老的回憶,值得寫下來。但是冒泡的效率為N(N-1)/2,可以對之進行改造,設計N個隊列,每個隊列有一定大小範圍,將資料放入這些隊列,使之成為長度較短的隊列,大幅度降低N,然後對之進行排序,最後在組成一個有序的隊列。

for(int lh = 0; lh < array.length; lh ++){
    int rh = findSmallest(array,lh,array.legnth);
    swapElements(array,lh,rh);
}

第24課 管理大型資料中的良好軟體工程原理 2011.8.23

從這一課開始,沒有中文翻譯了。本課介紹與組織資料相關的設計思路。資料管理包括線上商店,社交網路,web search,有下面的原則:

  • 名詞nouns –>Classes,例如Song,Album
  • 動詞verbs  –>methods
  • 唯一ID標識 unique identifier,用於尋找,或需要通過key來組織的結構。

在設計中,用Collection來管理對象集合。Collection提供add, remove, clear, contains, size, isEmpty,iterator的方法。

舉一個音樂線上商店的例子,有很多音樂Song,以及專輯Album(包含若干Songs),名詞是Song和Album。對應兩個Class:Song和Album。對於這個商店例如叫FlyTurn,動作例如addSong和AddAlbum。

類Song,我們考慮哪些是nouns,哪些是verbs,nouns包含name,band,price,增加unique Identifier,因為名字和band都是可能會重複,本例ID採用name+band共同決定。這裡price是可以變更的,因此動作有getName(), getBand(), getPrice()和setPrice(),此外還有toString(),是否會發生變化,將確實是否會有set的方法。假設採用Map的方式,即需要key,不適合使用name和band兩個標識,可以將toString()作為唯一標識(其實就是由name和band共同確定)。

類Album。Alumb的相關名詞有:title,band,list of Songs(ArrayList,不採用Array因為長度不確定)。對於動作,addSong()已放置Song進入list,如果需擷取songs,設計通過Iterator<Song> getSongs()。唯一ID採用title來確定。類經常會提供toString()方法用於顯示資訊。

資料群組織:例子採用ArrayList<Song> songs來保管songs,採用HaspMap<String,Album> albums來保管album。可以通過圖例來清晰表達這些資料之間的關係。

注意到這些song指向同一個對象,成為Shallow copy,是通常的方式,保證資料一致性。只有某些特殊的情況,才會採用deep copy(完全copy一個副本,成為兩個對象)。

相關連結:我的與編程思想相關的文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.