基本功:提取重複敘述
在開始之前,必須先確定你有這種能力,你可以把重複的程式包裝為方法(method),在不同的概念下也有人稱為function、副程式、函數等。這樣好處有很多,大概列出幾項:
1. 以後要使用直接呼叫,不用再寫一次。
2. 多處的處理都會參照到一個方法,日後若需修正,僅需改一個地方(即修改方法的內容)。
3. 防止你忘了處理某些細節,因為相關的動作被包起來了,一次完成。
包裝成方法多半需要傳入參數與制定傳回值,這部分務必弄清楚,不同語言可能有不同的規範,請自行參閱各語言的書籍,這邊不再贅述。
若你對傳入/傳回沒有概念,這邊提供簡短的說明。舉例來說,你需要在Android內顯示Dialog,你可以編寫如下的method:
private void showDialog(String msg){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getString(R.string.strTitle));
builder.setMessage(msg);
//……
builder.create().show();
}
在這個例子當中,會變動的只有Message(訊息)內容,其他的動作都是不變的,若你想讓Title也可以變動,那麼可以在showDialog後方的括號內,再加上第2個輸入參數,例如showDialog(String msg, String title)並在method內將其應用即可。
那麼傳回值呢?這個例子的傳回值是void,意即沒有傳回值,假設你需要在Dialog顯示後傳回True或False,那請把void修正為boolean,並於method內適當的地方加入return true; 或 return false; (視你的目的而定)。
但會這種包裝是不夠用的,在一些情況下你必須跨類別執行相同(或相似)的行為,這是可以利用「物件」的概念來處理。
善用物件
我們也可以透過物件導向的觀念來提升程式的重用。在物件導向領域中應該多少聽過封裝、繼承、多型,三者都非常重要(且深奧),本篇不探討細節內容,網路上已有不少大師提出看法與建議,值得大家參考。就先談談最基本的封裝吧,簡單說就是要把一些處理過程包裝起來(最終包成class),而為什麼要這麼做呢?舉幾點好處:
1. 為了自己方便,在日後的開發過程呼叫已經包裝好的東西即可。
2. 為了同伴方便,要實現相同功能只要呼叫你包裝好的即可。
3. 安全性考量,畢免日後忘了進行某些處理。
而繼承可以讓你更方便的擴充,多型可以讓你的擴充更有彈性 (這是非常簡短的說法,詳細內請自行參考相關資料,不然真的談不完),善用這些觀念,可使程式更易維護,更白話點,好處即是程式碼可以方便的重複使用與管理。
來看看封裝的例子,你可以把網路連線的系列動作包裝成一個類別「網路存取.class」,其下有一些相關的屬性(Property),像是解析HTML使用的固定Tag、定義回傳狀態Tag、連線目標(URL)等,以及一些方法(method),如「檔案下載」與「檔案上載」。這邊的method如同本文前半段所提,那在這邊為何要再說一次呢?
因為這邊的method是寫於「網路存取.class」裡面,這個class聚合一些相關的方法與成員,專門設計來處理網路的相關事項,今後你若有相近的需求,基本上僅需這麼處理:
網路存取 i = new 網路存取();
i.檔案下載("http://hefetech.blogspot.tw/");
那繼承與多型呢?以本例而言不見得會使用到,而且相關的例子也不適合在這邊舉出,先跳過這個部分。
思考如何建立類別
有不少人在接觸物件導向時,難以將現實體驗轉化為虛擬的類別,若你也有這種問題,多練習還是最適當的方法,你可以試試以下例題,想想如何把它轉化為類別(class),思考這個類別裡面可能有什麼屬性與方法。1. 鍵盤
2. 計算機
3. 滑鼠
4. 西瓜
5. 畢業證書
6. 智慧型手機
7. 魔術方塊
8. 行動電源
9. 鏡子
10. 山豬
你說怎麼沒有汽車嗎?倒是有個山豬可以讓你試著使用萬年動物「梗」,像是跑()、叫()…。這些都是現實世界的實體,概念鮮明,容易學習,但其通常與你寫的程式無關,你真正需要的是培養將較抽象概念轉為類別的能力,在這種情況下你很可能要「無中生有」,自己規劃類別中的內容,跟據實際需求進行定義。
在實際規劃上,以下這些例題不一定只產生單一類別,很可能會再拆分,但那屬於更進階的部分,不在本文討論的範圍。:
1. 會員
2. HTTP連線管理器
3. 身分證字號驗證器
沒有留言:
張貼留言