7 分鐘閱讀

物件導向-封裝

介紹這主題之前,歡迎先看我寫的物件導向的文章

從軍報國

當兵進去軍營,手機都會被收走

Phone
User
PhoneNumber
GooleMap()
UberEat()
FB()
Youtube()
Bank(string passWord)
class Phone{
  public string User;
  public string PhoneNumber;
  public void GoogleMap(){...};
  public string UberEat(){...};
  public void FB(){...};
  public void Youtube(string searchName){...};
  public string Bank(string passWord){...};
  public string On(){...};
  public string Off(){...};
}

你一定不會希望長官可以隨意使用你的手機

但我們的設計,長官想做什麼都可以,他可以輕易地使用你的手機,如FB

Phone yourPhone = new Phone();
yourPhone.FB();

還好,你可以使用私有的技術,這是使用物件很有效的技巧

class Phone{
  ...
  private void FB(){...};
  ...
}
Phone yourPhone = new Phone();
yourPhone.FB();   //這一行就會無法執行

長官甚至不知道你有FB這一個方法

封裝表示讓某些資料私有化

public 表示資料是公共的,權限是開放的,物件內物件外都可以被存取 private 表示資料是私有的,該欄位只能在該物件內部從取

當你讓資料私有化,再撰寫一些公用的程式碼,就叫做封裝 以我們這邊的例子

class Phone{
  '''
  private void FB(){...};
  public void RunFB(string email, string passWord){...};
  '''
}

私有資料沒有公用方法可以存取

你就無法從外部存取該資料,想要存取某個私有資料,必須有公用方法 存取所需的資料。你把資料封裝就表示,你給他一個合理的方法存取或執行 某些公用方法,但是不會讓它們干擾所依賴的資料。

例如密碼,宣告成private比較合理

 public void RunFB(string email, string passWord){...};

我們可以開放讓外部使用RunFB方法,但不接受外部修改FB的密碼

什麼情形會想要宣告為私有的

物件在運行的時候會記錄一下必要資訊,而且不需要給外不知道的資料。 以現實來說,每天使用的手機,我們應該都很熟才對,

例如它會有一個私有變數去紀錄目前的Android或ios是什麼版號,運行的時候 手機需要知道,但我們使用者不需要知道,我們需要知道的是如螢幕的亮度。

封裝的好處

  • 容易使用
    • 當你的類別有私有變數的時候,智能代碼補全(intellisense)就不會被顯示出來, 因為這些欄位或方法不會被外部所使用
  • 容易維護
    • 有時候,一些公有欄位或變數,會因為你直接存取或者本不應該開放給外部,程式 有可能會碰上你不預期的狀況,會成成 Bug,所以加入私有會讓你的程式更容易維護
  • 更有彈性
    • 封裝代表是整理程式的一種方法,當你程式有規劃不是一盤散沙,當這個程式需要 被修改的時候,你可以更容易對它進行修改,更省時間。

現實上的封裝

電風扇的轉速有快、中、慢三個按鈕,你只需要按下某一按鈕,它就會給你應有的轉速, 你不會想要自己的去控制它的電壓,讓它變成你想要的轉速,這樣子太累。今天,廠商 都會幫電風扇封裝好,讓我們更方便的使用而且不容易出錯。

而且,你也更容易維護,因為被你封裝起來了,假如今天你想要改快快的轉速,清晰的程式碼 會幫助你重新利用它。

關於封裝的想法

  • 全部都是public
    • 剛開始撰寫程式時可能免強記得住,當變數變多時也是容易讓人混亂,還有經過時間的 推移,自己都不知道還記得多少,更何況如果有其他人要用到你的類別呢?
  • 有必要時間才宣告為public
    • 當你全部的程式都是public,會沒有分類的感覺,你有辦法在沒分類的房間內找到你想 找到的東西嗎?思考一下什麼適合private,甚麼適合public,當下多花一點時間,一定 能在未來省下更多時間

標籤:

更新時間: