Android開發(fā)教程之重構程序_第1頁
Android開發(fā)教程之重構程序_第2頁
Android開發(fā)教程之重構程序_第3頁
Android開發(fā)教程之重構程序_第4頁
Android開發(fā)教程之重構程序_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Android開發(fā)教程之重構程序什么是重構程序清晰易讀好處MVC模式MVC模式套用1可以運作的程序跟可以維護的程序之間,還有一道難以言說的鴻溝。 一個程序設計之初,是用來解決特定問題。就像在前面章節(jié)的學習中,我們也已經寫好了一個可以運作的 BMI 程序。但是對程序設計來說,當我們寫越多程序,我們會希望可以從這些程序之中,找到一個更廣泛適用的法則,讓每個程序都清晰易讀,從而變得更好修改與維護。什么是重構2讓程序清晰易讀有什么好處呢?當一段程序被寫出來,之后我們所要做的事,就是修改它與維護它。一旦程序越長越復雜,溷亂到無法維護的境界時,就只好砍掉重練。 所以若我們能透過某些方式,例如重新組織或部分

2、改寫程序碼,好讓程序容易維護,那麼我們就可以為自己省下許多時間,以從容迎接新的挑戰(zhàn)。 我們回過頭來看看前面所寫的 Android 程序。Android 平臺的開發(fā)者已經先依照 MVC 模式,為我們將顯示界面所用的 XML 描述檔、顯示資源所用的 XML 描述檔從程序碼中區(qū)隔開來。將與程序流程無關的部份分開來組織,讓程序流程更清楚,相對易于維護。程序清晰易讀好處3而在主要程序碼(Bmi.java) 方面,雖然程序碼量很少,還算好讀,但整體上并不那麼令人滿意。例如,假使我們要在這段程序碼中再多加上按鍵、適用于多種螢幕顯示模式、或是再加入選單等等內容,很快地程序碼就開始變得復雜,變得不容易閱讀,也開

3、始越來越不容易維護。 因此,在繼續(xù)新的主題之前,我們先來重構這個 BMI 應用程序。在重構的過程中,也許我們能學到的東西,比學任何新主題還重要呢 。4我們打算重構 BMI 程序的部份 java 程序碼。既然我們已經照著 Android 平臺的作法,套用 MVC 模式在我們的程序組織上,那麼,我們不妨也試著套用同樣的 MVC 模式在 Bmi.java 程序碼上。 如何套用 MVC 模式到 Bmi.java 程序碼上呢? 原來的程序片段是這樣的 代碼 : 1 Override 2 public void onCreate(Bundle icicle) 3 super.onCreate(icicle

4、);MVC模式54 setContentView(R.layout.main); 5 6 /Listen for button clicks 7 Button button = (Button) findViewById(R.id.submit); 8 button.setOnClickListener(calcBMI); 9 6上面的程序片段中,包含了所有 Android 程序共用的標準內容, 整個程序的大致架構在前面章節(jié)中已經講解過,現在我們從中取出我們感興趣的部分來討論: 代碼: Button button = (Button) findViewById(R.id.submit); bu

5、tton.setOnClickListener(calcBMI); 在第7 行我們看到一段程序碼來宣告按鈕物件,與針對該按鈕物件作動作的程序碼。 button.setOnClickListener 程序碼的意義是指定一個函式,來負責處理 按下 這個 按鈕 后的動作。7我們可以想像,在同一個畫面中,多加入一些按鈕與欄位后,onCreate 這段程序將變得臃腫,我們來試著先對此稍作修改: 首先,我們可以套用 MVC 模式,將宣告界面元件( 按鈕、數字欄位) 、指定負責函式等動作抽取出來,將 onCreate 函式改寫如下 代碼: Override public void onCreate(Bund

6、le icicle) super.onCreate(icicle); setContentView(R.layout.main); findViews();MVC模式套用8setListensers(); 接著我們將宣告界面元件的部份寫成一個獨立的findViews 函式: private Button calcbutton; private EditText fieldheight; private EditText fieldweight;9private void findViews() calcbutton = (Button) findViewById(R.id.submit); f

7、ieldheight = (EditText) findViewById(R.id.height); fieldweight = (EditText) findViewById(R.id.weight); 順便將原本很沒個性的按鈕識別參數button 改名成calcbutton ,以后在程序中一看到calcbutton ,就知道是一個按下后將開始處理計算工作的按鈕。10同樣地,我們也將指定特定動作( 按按鈕) 的負責函式獨立出來: 代碼: /Listen for button clicks private void setListensers() calcbutton.setOnClickLi

8、stener(calcBMI); 如此一來,我們就將程序邏輯與界面元件的宣告分離開來,達成我們重構的目的。11完整程序如下: 代碼: package com.demo.android.bmi; import java.text.DecimalFormat; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextVi

9、ew; 12public class Bmi extends Activity /* Called when the activity is first created. */ Override public void onCreate(Bundle icicle) super.onCreate(icicle); setContentView(R.layout.main); findViews(); setListensers(); 13private Button button_calc; private EditText field_height; private EditText fie

10、ld_weight; private TextView view_result; private TextView view_suggest; 14private void findViews() button_calc = (Button) findViewById(R.id.submit); field_height = (EditText) findViewById(R.id.height); field_weight = (EditText) findViewById(R.id.weight); view_result = (TextView) findViewById(R.id.re

11、sult); view_suggest = (TextView) findViewById(R.id.suggest); 15/Listen for button clicks private void setListensers() button_calc.setOnClickListener(calcBMI); private Button.OnClickListener calcBMI = new Button.OnClickListener() public void onClick(View v) DecimalFormat nf = new DecimalFormat(0.0);

12、16 double height = Double.parseDouble(field_height.getText().toString()/100; double weight = Double.parseDouble(field_weight.getText().toString(); double BMI = weight / (height * height); /Present result view_result.setText(getText(R.string.bmi_result) + nf.format(BMI); 17 /Give health advice if(BMI

13、25) view_suggest.setText(R.string.advice_heavy); else if(BMI20) view_suggest.setText(R.string.advice_light); else view_suggest.setText(R.string.advice_average); ; 18同樣是calcBMI 函式,在完整程序中,改將calcBMI 函式從原本的OnClickListener 宣告成 Button.OnClickListener 。這個改變有什么差別呢? 閱讀原本的程序碼,在匯入(import) 的部分可以看到,OnClickListen

14、er 是來自于android.view.View.OnClickListener 函式: 代碼: import android.view.View.OnClickListener; 改成Button.OnClickListener 后,Button.OnClickListener 就變成來自 于android.widget.Button 中的OnClickListener 函式,在查閱程序時,整個Button 與OnClickListener 之間的關係變得更清晰。19另外,我們偷偷將OnClickListener 中其他會存取到的界面元件識別參數,也補進 findViews 宣告中: 代碼:

15、 private void findViews() button_calc = (Button) findViewById(R.id.submit); field_height = (EditText) findViewById(R.id.height); field_weight = (EditText) findViewById(R.id.weight); view_result = (TextView) findViewById(R.id.result); view_suggest = (TextView) findViewById(R.id.suggest); 20同時,我們也把識別參數的命名方法做了統一:按鈕的識別參數前加上 button_ 前綴,可輸入欄位的識別參數前加上field_ 前綴,用作顯示的識別參數前則加上view_ 前綴。將變數名稱的命名方法統一有 什么好處呢?好處在于以后不管是在命名新變數,或是閱讀程序碼時,都能以更快速度命名或理解變數的意義,讓程序變得更好讀。 我們也把原本在程序中直接寫進的字串21代碼: TextView result = (TextView) fi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論