1. 程式人生 > >程式碼重構-總結 前輩的重構經驗

程式碼重構-總結 前輩的重構經驗

總結 前輩的重構經驗

完成這樣的重構,需要幾個注意點,分享一下



1 一定要在有充分測試程式碼的前提下重構
2 測試程式碼的作用是
  1 需求固定了
  2 保證重構後邏輯不會發生變化
  3 有測試心裡有底,可以放心進行大量的結構上的重構


3 重構時,先梳理程式碼,刪除無用的邏輯,進行小的消除重複程式碼重構,封裝小方法重構,等等,目的是讓大段大段程式碼之前的耦合度降低,在這樣的基礎上才能方便的套用一些合適的程式碼組織方法(即設計模式),抽取合適的模型等等
這些說起來比較片面需要結合自己的經驗看別人的程式碼或者 重構那本書慢慢積累


另外說幾句
1 目前的程式碼,雖然我很滿意,但是肯定還是有不足的地方
比如,如果有程式碼經驗的人看到這些程式碼,肯定會吐槽出一些需要重構的地方



2 有些程式碼組織方式沒有好壞之分

  這種情況下,以團隊大部分人的習慣來

針對Android有以下幾點需要注意:

1.是不是應該把資料重新整理操作放在onResume()中?

    @Override     public void onResume() {         super.onResume();         refresh();     } ​
          public  void refresh(){         initData();     } 這樣不合適,在什麼時候重新整理是根據需要來的,並不是每次onResume()的時候都需要重新整理。 假如使用者關閉了屏幕後再開啟螢幕,頁面會重新整理,這樣沒有必要,也許幾秒中前剛重新整理過。
網易新聞客戶端就不是這樣的。

2.關於activity,fragment與彈窗

如果一個activity中有一個ViewPager,ViewPager中載入了兩個fragment,這時要特別注意的是,兩個fragment是同事載入的,雖然只顯示了一個fragment的介面,但是另外一個也是載入了的,所以如果當前顯示的fragment沒有彈窗,但是另一個fragment彈窗了也會顯示到當前activity中。

3.copy佈局檔案和複用佈局檔案的優缺點

重用優點:減少佈局檔案個數,如果幾個介面的佈局問個始終一致,那麼可以使用 重用缺點:如果其中一個佈局檔案有所改動,那麼其他頁面將不能再使用,因為佈局檔案中沒法使用 if else 。
copy優點:一個頁面對應一個xml檔案,完全解耦 copy缺點:會大量出現重複的程式碼
總結:需求隨時都可能變動,還是把佈局解耦比較好

4.優化程式碼的思路

哪段程式碼使用的頻率越高就應該先優化哪段程式碼,這樣會事半功倍!

5.千萬要保護好自己的程式碼

昨天跟我說某某模組的介面改了,要重新做,我做了。 今天來的時候又跟我說暫時不改了,還是用之前的程式碼。
天啦,幸虧我沒有刪掉之前的程式碼,不然死的心都有了。 so,程式猿們,保護好你自己的程式碼。

6.模板方法沒有寫好會很悲劇

模板方法寫好了,比如BaseAcitivity,然後開始寫它的子類,忽然除錯的時候發現模板的方法有問題,比如說要調整方法呼叫的順序或者改變方法呼叫的位置,這下好了,你的N個子類都是按照之前的模板方法去寫的,so 你就一個一個去修改子類吧。
另外,要千萬注意別人修改了公用的模板方法,要及時pull和push程式碼,不然自己寫的很多程式碼都白費了。

7.不要頻繁重複的呼叫資料

比如你要獲取10-個新聞列表資料,而且你要同一時間去獲取,那就得建立10次Http連結,這很費時的。最好的方法是讓伺服器把10個新聞列表資料寫在一個xml檔案中,這樣會顯著的節約時間。wo so,當進行遠端呼叫時,從資料提供者反覆呼叫取得資料會嚴重影響效能,比如資料庫呼叫、Web服務呼叫或者其他編解碼呼叫。這種情況下可以使用Facade模式一次獲得所有所需的資料,儘可能減小連線成本和在網路上傳輸資料的成本。

8.類中的成員變數前加"m"

本類的所有成員變數前加"m",好處是:敲"m"就能提示本類的一些成員變數

9.一定要有自己的技術部落格和帖子

別人的部落格和帖子是別人的,要有自己的,不斷補充,不斷完善,以後再檢視的時候才方便。 另外 ,強迫自己寫技術部落格和帖子就是強迫自己總結,加深技術知識的印象。

10.一個類應該純粹,一個類就只應該做一件事情

比如寫一個瀑布流類(自定義View),幹了很多事情,佈局了瀑布流模型,設定了重新整理功能。 這不應該在一個類中出現,瀑布流就是瀑布流,重新整理是另外一回事,獲取資料又是另外一回事!不要混在一起,寫在一個類中! 一個類應該是純粹的,儘量的簡單,就是幹一件事情。完成一個功能我們可以把多個類組合在一起,或者引用等等方法。 好處在於拆卸方便,當不需要什麼功能的時候能快速明晰的剝離掉。如果什麼程式碼都混在一塊那是灰常難以剝離的。

下面是一些經常出現的錯誤:

1、安裝apk檔案出現相應的錯誤

(1)提示錯誤OLDER_SDK,這表明現有的android的sdk版本太低,應該使用較高版本的sdk。

(2)提示錯誤UPDATE_INCOMPATIABLE,這表明apk與現有的sdk存在相容性上的衝突,可以檢查一下是否使用了完全一樣的skin等引數設定,這些引數與apk應用程式的不一致也會導致安裝時候出現錯誤。

(3) 有時安裝apk沒有出現錯誤,但是一執行就出現“程式異常終止”的錯誤:

         原因一般有:應用程式的許可權沒有設定好,出現了問題;應用程式可能會使用sdcard,而沒有掛載sdcard映象。

(4)目前Android的開發主要是基於800*480(WVQA800)的面板,面板的不同可能會影響應用程式的相容性。

2、在模擬器的sdcard映象插入的圖片後,不能通過圖片瀏覽器進行顯示。

如果是在android執行的過程中,往sdcard中插入圖片,不會立即顯示出來,需要重啟android虛擬器。

 3、開發Android應用程式,容易忽視的一點就是:忘記給應用程式賦予合適的訪問許可權。<uses-permission>

在通過DDMS模擬GPS定位時,模擬器在install apk之後,始終顯示“無法顯示物理位置”的錯誤資訊,後來重啟一下,就可以了。所以得到啟發:如果某個應用程式有一定問題的話,嘗試把android重啟一下,或許就可以了!

4、android的Google MAP相關內容

(1)Google MAP API的獲取

Android Maps API Key Signup

The Android Maps API lets you embed Google Maps in your own Android applications. A single Maps API key is valid for all applications signed by a single certificate.

You also need a Google Account to get a Maps API key, and your API key will be connected to your Google Account.

Android Market enables developers to easily publish and distribute their applications directly to users of Android-compatible phones.

(2)執行android與Google Map相關的應用程式時,提示錯誤:Failed to find an AVD compatible with target 'Google APIs'.

其實問題在於:之前應用程式載入的都是沒有Google api的android21的平臺,google api是可選包。所以必須重新建立一個有android和google api的21平臺。

 5、如何匯入Android SDK中的Sample程式碼

(1)不能通過file->import來載入,因為這裡import是已經建立好的工程,而Sample中的只是source檔案

(2)所以需要file->new->android project->creating project from existing sample.在下拉框中選擇具體的Sample。

        注意不能選擇creating projects from exisiting source,這樣建立的工程是有錯誤的,沒有R.java檔案。

 (3)出現的沒有R.java檔案的問題 :

存在這樣一種可能:由於res目錄的一些xml檔案中對於單引號沒有使用“/”進行轉義,這個還是通過console中的錯誤提示看出來的。

6、安裝改進版本後的apk檔案出現如下的錯誤

Com.xiedong.calendar: 

signatures do not match the previously installed version ignoring

Package couldn't not be installed  in /data/ app / com.xiedong.calendar.apk

解決方法:

(1)刪除之前建立的avd,然後重新建立,編譯和執行

(2)或者在已經存在的avd基礎上,啟動過程中選擇上 wipe user data 如截圖所示


下面是一些好的程式碼庫案例:

Android經典的開源專案其實非常多,但是國內的部落格總是拿著N年前的一篇複製來複制去,實在是不利於新手學習。今天爬爬把自己熟悉的一些開源專案整理起來,希望能對Android開發同學們有所幫助。另外,如果你有比較好的專案推薦,也煩請在評論裡分享出來,我會定期更新部落格內容。

專案篇:
  • :oschina網站的客戶端哦,wp版,iOS版都有開源
  • :今天才知道是開源的,趕緊收藏
  • :谷歌開發者大會應用,雖然有點難懂,還是很有參考價值(比如其中的圖片載入)
  • :eoe網站Android客戶端也開源咯,嘿嘿
  • :一個上傳圖片到facebook的客戶端,其中使用了很多開源專案,作者()本身也非常NB~
元件篇:
  • :可以實現類似FlipBoard那種華麗麗的翻頁
  • :可以拖動item重新排序的listview,效果非常贊
  • :咳咳,有些同學非常喜歡Android的holo風格,這個專案絕對讓你happy
  • :這玩意可以讓ViewPager翻起來更酷,誰用誰知道~~
  • :這個是抽屜介面(就是facebook那種)的各種實現版本中,最好的,木有之一!
  • :iPhone上經常有這個,就是listview的……不知道怎麼解釋,自己下載看看吧
  • :這是一個瀑布流佈局的實現,還不是很完善,但作為學習的案例或者在其基礎上擴充套件還是不錯的
  • :android的非同步請求元件,我個人習慣使用asynctask,不過這個實現還是很優秀的,也推薦給大家
  • :大家熟知的ActionBar在2.x上的相容性方案;類似的相容性元件還有許多,有時間為大家一一列出;
  • :不止是一個SDK那麼簡單哦,比某浪和某人的SDK強幾個數量級;
  • :想在2.xSDK上使用Android 3.0新增的動畫API,那就是它了;沒用過的同學一定要試試哦,非常方便~
  • :讓listview的item可以向右滑動,新版Gmail和Pocket裡面有用到哦~
  • :Android的RESTful封裝,沒聽過RESTful?你去死吧
  • :和上面的DataDroid同樣屬於美化底層程式碼的,這個lib簡化了不同元件之間的事件傳遞
  • :Android3.0以上才有的switch,有好心人給遷移到2.x上了,哈
  • :我們都知道webview,也知道Android的chrome又自己的核心,這個專案就是把chrome的核心給匯出來做成一個chromeview了,大家可以在自己的專案裡用,有興趣的可以玩玩
  • :來自square的圖片非同步載入,好像是最近才開源的,API風格很獨特,哥很喜歡~
  • :把actionbar做成毛玻璃效果,看上去還是很漂亮的
好吧,大中午的,就先寫這些吧~~哦,順便推薦大家幾個網站,我常去的:
  • :各種專案很多,就是不容易挖掘,但是開發者必備
  • :曾經一般,現在越做越好了,很多開源專案;
  • :經過一番整理,現在非常強大;小作品居多;
  • :我曾經想做這麼一個網站來著,很多開源元件的集合,嘿嘿
  • :Android開發組核心成員,主要複製widget開發,我們用的Listview啥的都是這位帥哥寫的。
  • 爬爬的部落格:歡迎造訪,嘿嘿
大家都說github上面的專案不容易發現,但其實還是有辦法的,比如:
  • 關注java專案排名:大家戳 這個網址
  • 搜尋“Android”,並按star排序:戳 這裡 直達
  • 最後,還有一招,就是關注些牛人,他們通常會關注或fork一些很有水平的專案
另外,貌似好多同學不會玩git,給大家推薦一個動態教程,~ (http://www.eoeandroid.com/thread-272453-1-1.html) 很不錯