2015年9月7日 星期一

程式開發觀念:減少重複

本篇並不談論深入的內容,主要為多少有接觸程式開發,但尚無法利用物件觀念來簡化程式的人寫所寫。

基本功:提取重複敘述

在開始之前,必須先確定你有這種能力,你可以把重複的程式包裝為方法(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.    身分證字號驗證器


沒有留言:

張貼留言