物件導向-封裝
物件導向-封裝
介紹這主題之前,歡迎先看我寫的物件導向的文章
從軍報國
當兵進去軍營,手機都會被收走
| 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,當下多花一點時間,一定 能在未來省下更多時間