2008年9月28日 星期日

[Design-Pattern] Open-closed Principle(OCP)

Robert C. Martin 曾經說道 "Software entities should be open for extension, but closed for modification."

在設計一個模組時,應該使該模組之後可以在不被修改的前提下被擴充。i.e.不必修改程式碼的情況下使模組改變行為。

這樣的假設之下,乍看之下是不可能的,但如果借用 interface 以及 abstract class 的幫助之下,這樣的情況就有可能會實現。利用 interface 及 abstract class 定義出 method 的 signature 來作為系統中的抽象層,因此這些signature 制定了可能的擴充,i.e.在設計系統之初,就必須為系統的可擴充性加以構想,這也就使得系統中的抽象層不必再修改,i.e.關閉修改之窗。

藉由 implement 抽象層的 object 來實現具體行為,並藉由改變實體行為的模式,來達到擴充的功能,i.e.開啟擴充之窗。

如此就可以滿足"Open-closed Principle",並且具有兩大優點:

1.藉由擴充來位系統提供新的行為,以滿足要求。

2.關閉修改模組可以使系統擁有原有的穩定性。

系統在初期設計時的確很難去思考到 OCP,因為一開始系統在分析時遇到的 class 數量可能不是很多,但是隨著系統的逐步增長, class 的數量可能就會越來越多,當 class 之間的關係越來越複雜的情況下,如果不遵守 OCP,最後系統就會是一團無法擴充與維護的垃圾,因為系統中的 class 之間有著極高的 coupling 與極低的 cohesion,這會造成牽一 class 而動全系統的悲劇。

所以在系統成長到一定程度時,programmer 就要開始思考 class 之間的關聯是否會太過於緊密而失去彈性。

[Object-Oriented] Interface

在JAVA中,interface的使用對於有學過JAVA的人來說,我想一定是不陌生的。但是,確實該如何好好的使用interface的強大功能,我想沒有經驗的programmer應該是陌生的!

有相當多的書籍中,皆有提到關於Polymorphism的強大之處,但是想要真正使用到,對於沒有經驗的人來說,有點困難之處。

Polymorphism與interface之間的關連,就像是Mechanism與Policy一樣。Polymorphism是一種Mechanism,而interface就是一種實現Polymorphism的Policy。

舉個簡單的例子,假設我們要採用"防盜"的機制(Mechanism),那我們可以選擇的策略(Policy)就有很多種,我們可以選擇加裝更好的鎖來達到防盜的目的,或是我們可以請保全公司來加裝保全系統等,都是可以達到我們當初所設定的目標。所以 Mechanism 是一種目標,而 Policy 則是達成目標所可以選擇的方法。

回想起在某一本書中看到,interface定義一種data type,某個class implements interface就會擁有該種data type。然而,interface的使用,不僅僅可以讓程式變得簡潔有力,並且達到限制基本功能的能力,還可以增加系統的彈性。就像對於學生與老師之間的關連,老師接受教導學生,但是學生本身卻有上千種不同特質,所以我們可以利用interface來定義所有的學生,並且要求他們具有基本的能力,諸如:選課、翹課等。

所有想要被老師所教導的各種學生,都必須實做出學生interface所約束的基本能力,i.e.選課與翹課。老師接受一個實做學生interface的object,就可以對他的基本能力做呼叫,這樣就算是一種Polymorphism。

也就是,見人說人話,見鬼說鬼話。

interface使得系統中的Extensibility, Flexibility, Pluggability 獲得保證

2008年9月12日 星期五

[Agile Method] Pair-Programming

Pair-programming 顧名思義就是 pair-thinking 或是 pair-doing something

在台灣的公司,幾乎看不到這樣的情形,因為台灣的文化與思想都是一個人獨立思考、獨立作業。

但是,pair-programming 確實是有他的好處,當自己真的去實踐才會有體會!

在我的碩士生涯中,雖然只有短短的兩年,不過我已經自己接下兩個 CASE,一方面是為了賺取生活費,但是目的卻是在於學習。

CASE 通常都是一個人在自行開發的,我也不例外。我在實驗室中被分配到開發工業研究技術院(Industrial Technology Research Institute of Taiwan,以下簡稱 ITRI)的計畫,不過很特別的是我的指導教授 - 陳振炎教授,他特別提到說,我與我的開發夥伴 - Brian 必須一起作同一件事,也就是實行 pair-programming。

所謂的 pair-programming 就是我跟 Brian 要一起寫同一支程式,但不是各寫各的,是要一起寫,所以就是一個人負責 key-in codes 而另一個人負責檢查邏輯。現在市面的不論是付費或是免費的 IDE 都已經具備有程式 syntax 的檢查,但是邏輯的檢查卻是只能靠 programmer 自己去解決,而 pair-programming 就是在解決一個思考漏洞的問題。

實際上這很有趣,因為我們從來沒有這樣的經驗,不過我卻也深深地體會到,一個人的能力真的很有限!因為我跟 Brian 之間的實力在伯仲之間,所以我們的思考與想法都很接近,但是人與人之間一定會存有衝突!那怎麼辦?好在我們兩在進入碩士前就彼此認識,所以在溝通上我們都盡量以雙方意見的結合為最終的結果,所以一直到現在我們都很順利的在開發。

反觀我所接的 CASE,因為只有我一個人開發一個部份,所以所有的問題我只能自己想辦法自己解決,除非我真的想不出來,我才會去請教朋友。

但是問題出現在實際面上,一個企業不可能僱用兩個人去作同一件事,這對於台灣的企業來說是不符合成本的,所以現階段要讓 pair-programming 在台灣實現事很有困難的!