




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Android開發(fā)教程之重構(gòu)程序什么是重構(gòu)程序清晰易讀好處MVC模式MVC模式套用1可以運(yùn)作的程序跟可以維護(hù)的程序之間,還有一道難以言說的鴻溝。 一個(gè)程序設(shè)計(jì)之初,是用來解決特定問題。就像在前面章節(jié)的學(xué)習(xí)中,我們也已經(jīng)寫好了一個(gè)可以運(yùn)作的 BMI 程序。但是對程序設(shè)計(jì)來說,當(dāng)我們寫越多程序,我們會希望可以從這些程序之中,找到一個(gè)更廣泛適用的法則,讓每個(gè)程序都清晰易讀,從而變得更好修改與維護(hù)。什么是重構(gòu)2讓程序清晰易讀有什么好處呢?當(dāng)一段程序被寫出來,之后我們所要做的事,就是修改它與維護(hù)它。一旦程序越長越復(fù)雜,溷亂到無法維護(hù)的境界時(shí),就只好砍掉重練。 所以若我們能透過某些方式,例如重新組織或部分
2、改寫程序碼,好讓程序容易維護(hù),那麼我們就可以為自己省下許多時(shí)間,以從容迎接新的挑戰(zhàn)。 我們回過頭來看看前面所寫的 Android 程序。Android 平臺的開發(fā)者已經(jīng)先依照 MVC 模式,為我們將顯示界面所用的 XML 描述檔、顯示資源所用的 XML 描述檔從程序碼中區(qū)隔開來。將與程序流程無關(guān)的部份分開來組織,讓程序流程更清楚,相對易于維護(hù)。程序清晰易讀好處3而在主要程序碼(Bmi.java) 方面,雖然程序碼量很少,還算好讀,但整體上并不那麼令人滿意。例如,假使我們要在這段程序碼中再多加上按鍵、適用于多種螢?zāi)伙@示模式、或是再加入選單等等內(nèi)容,很快地程序碼就開始變得復(fù)雜,變得不容易閱讀,也開
3、始越來越不容易維護(hù)。 因此,在繼續(xù)新的主題之前,我們先來重構(gòu)這個(gè) BMI 應(yīng)用程序。在重構(gòu)的過程中,也許我們能學(xué)到的東西,比學(xué)任何新主題還重要呢 。4我們打算重構(gòu) BMI 程序的部份 java 程序碼。既然我們已經(jīng)照著 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 程序共用的標(biāo)準(zhǔn)內(nèi)容, 整個(gè)程序的大致架構(gòu)在前面章節(jié)中已經(jīng)講解過,現(xiàn)在我們從中取出我們感興趣的部分來討論: 代碼: Button button = (Button) findViewById(R.id.submit); bu
5、tton.setOnClickListener(calcBMI); 在第7 行我們看到一段程序碼來宣告按鈕物件,與針對該按鈕物件作動作的程序碼。 button.setOnClickListener 程序碼的意義是指定一個(gè)函式,來負(fù)責(zé)處理 按下 這個(gè) 按鈕 后的動作。7我們可以想像,在同一個(gè)畫面中,多加入一些按鈕與欄位后,onCreate 這段程序?qū)⒆兊糜纺[,我們來試著先對此稍作修改: 首先,我們可以套用 MVC 模式,將宣告界面元件( 按鈕、數(shù)字欄位) 、指定負(fù)責(zé)函式等動作抽取出來,將 onCreate 函式改寫如下 代碼: Override public void onCreate(Bund
6、le icicle) super.onCreate(icicle); setContentView(R.layout.main); findViews();MVC模式套用8setListensers(); 接著我們將宣告界面元件的部份寫成一個(gè)獨(dú)立的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); 順便將原本很沒個(gè)性的按鈕識別參數(shù)button 改名成calcbutton ,以后在程序中一看到calcbutton ,就知道是一個(gè)按下后將開始處理計(jì)算工作的按鈕。10同樣地,我們也將指定特定動作( 按按鈕) 的負(fù)責(zé)函式獨(dú)立出來: 代碼: /Listen for button clicks private void setListensers() calcbutton.setOnClickLi
8、stener(calcBMI); 如此一來,我們就將程序邏輯與界面元件的宣告分離開來,達(dá)成我們重構(gòu)的目的。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 。這個(gè)改變有什么差別呢? 閱讀原本的程序碼,在匯入(import) 的部分可以看到,OnClickListen
14、er 是來自于android.view.View.OnClickListener 函式: 代碼: import android.view.View.OnClickListener; 改成Button.OnClickListener 后,Button.OnClickListener 就變成來自 于android.widget.Button 中的OnClickListener 函式,在查閱程序時(shí),整個(gè)Button 與OnClickListener 之間的關(guān)係變得更清晰。19另外,我們偷偷將OnClickListener 中其他會存取到的界面元件識別參數(shù),也補(bǔ)進(jìn) 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同時(shí),我們也把識別參數(shù)的命名方法做了統(tǒng)一:按鈕的識別參數(shù)前加上 button_ 前綴,可輸入欄位的識別參數(shù)前加上field_ 前綴,用作顯示的識別參數(shù)前則加上view_ 前綴。將變數(shù)名稱的命名方法統(tǒng)一有 什么好處呢?好處在于以后不管是在命名新變數(shù),或是閱讀程序碼時(shí),都能以更快速度命名或理解變數(shù)的意義,讓程序變得更好讀。 我們也把原本在程序中直接寫進(jìn)的字串21代碼: TextView result = (TextView) fi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 財(cái)務(wù)培訓(xùn)結(jié)業(yè)匯報(bào)
- 探討酰胺質(zhì)子轉(zhuǎn)移成像在阿爾茨海默病診斷中的價(jià)值
- 互聯(lián)網(wǎng)平臺公司并購生活服務(wù)類企業(yè)的并購動因及績效分析
- 四年級數(shù)學(xué)下冊第4章巧手小工匠-認(rèn)識多邊形第5課時(shí)平行四邊形的認(rèn)識
- 記錄書寫管理規(guī)程
- 港口業(yè)投資項(xiàng)目可行性分析報(bào)告
- 八年級數(shù)學(xué)上冊期中達(dá)標(biāo)測試卷作業(yè)
- 通信設(shè)備批發(fā)企業(yè)ESG實(shí)踐與創(chuàng)新戰(zhàn)略研究報(bào)告
- 菜籽油批發(fā)企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報(bào)告
- 麻辣燙企業(yè)縣域市場拓展與下沉戰(zhàn)略研究報(bào)告
- 標(biāo)準(zhǔn)預(yù)防與隔離技術(shù)教學(xué)培訓(xùn)課件
- 20CJ96-1外墻內(nèi)保溫建筑構(gòu)造(一)FLL預(yù)拌無機(jī)膏狀保溫材料內(nèi)保溫構(gòu)造
- 第七屆石油工程設(shè)計(jì)大賽-單項(xiàng)組地面工程獲獎作品
- 《幼兒文學(xué)》課程標(biāo)準(zhǔn)
- 2024年內(nèi)蒙古醫(yī)療機(jī)構(gòu)放射工作人員放射防護(hù)培訓(xùn)考試題
- 地形圖的基本知識課件
- 醫(yī)務(wù)人員手衛(wèi)生規(guī)范培訓(xùn)課件預(yù)防醫(yī)院感染的手衛(wèi)生措施
- 康復(fù)治療評定量表(WHO認(rèn)證)
- 2024屆上海市閔行區(qū)民辦上寶中學(xué)七年級數(shù)學(xué)第二學(xué)期期末復(fù)習(xí)檢測試題含解析
- 江蘇省科技計(jì)劃項(xiàng)目申請書
- 倉儲物流投標(biāo)書范本
評論
0/150
提交評論