2013年12月24日 星期二

OOAD原則 (九) 封裝

何謂封裝?

對資料所做的任何計算都受到保護,因為資料不會被存取。
也就是隱藏程式執行內部事物的部分。

舉個例子

Ted.gotoTaipeiStation()
Bob.gotoTaipeiStation()

有時候我們只在乎 Ted and Bob 都到了台北,我們不會去care
Ted 住在台北  所以他搭捷運到北車
Bob住在台南,所以他必須搭高鐵到北車

封裝隱藏了實際實作的部分。



封裝在某些情況也避免了使用者錯誤的操作

例如

networkParser.getUserData()
dbParser.getUserData()

networkParser的動作可能包含了
1.連到網路 2.取得正確網址 3.取得資料 4. 擷取UserData

dbParser得動作可能包含了
1.連線到db 2.query db table資料並取得資料

但是使用者不需要知道詳細的情況,使用者只需要知道現在要拿userdata就好了
封裝讓使用者輕易的取得UserData,而不需要實際去操作,這避免了使用者錯誤的使用


該如何使用封裝?
可以看看以下的範例


interface GotoTaipeiBehavior
{
 void gotoTaipeiStation();
}
class Ted implements GotoTaipeiBehavior
{

 @Override
 public void gotoTaipeiStation() {
  // TODO Auto-generated method stub
  System.out.println("Tkae SubWay");
 }
 
}

class Bob implements GotoTaipeiBehavior
{

 @Override
 public void gotoTaipeiStation() {
  // TODO Auto-generated method stub
  System.out.println("Tkae HightSpeedRail");
 }
 
}
public class person {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  GotoTaipeiBehavior behavior = new Ted();
  behavior.gotoTaipeiStation();
  behavior = new Bob();
  behavior.gotoTaipeiStation();
 }

}

這個範例就說明了 Ted 和 Bob去台北車站的例子,
main裡面就是client使用時呼叫 ted 和 bob 要去台北車站,
可以注意到這邊我們只在乎他們的行為(GotoTaipeiBehavior )不在乎他們是誰,
在我們將Ted 或Bob 創建出來之後,我們將他們一視同仁(都是behavior),然後要去台北車站,
這樣寫的好處是,不管是誰要去台北車站都可以使用gotoTaipeiStation這段程式,
程式的可用性提高了,而且使用者不需要知道裡面實際做了甚麼事情,只需要知道人到了台北,這同時也提升了程式的可讀性。


結論

封裝會隱藏物件的實做,以及保護資料避免被user操作,同時他也可以將某些user不需要知道資料隱藏起來(例如某些控制開關的flag)。
封裝可以降低程式的耦合度,同時若加上良好的命名封裝同時也可以提升程式的可讀性,進一步提升了程式的維護性。

沒有留言:

張貼留言