什麼是OO?物件導向與封裝
說來慚愧,寫了兩年的物件導向語言,真的意識這是一個「物件導向」語言,這件事情也是最近的事情。當然是要回去惡補一下何為物件導向,同時也想記錄一下自已的心得,讓以後的自已檢視一下。
什麼是物件導向程式設計?
其實平常我們常使用的程度語言,絕大部分都是物件導向語言。從 C++,Java,Python,PHP 等等(不好意思,不要問我JavaScript算不算),我們真的是活在物件導向語言的圈子當中。那我們真的有使用到物件導向的功能嗎?
物件導向 - 簡稱 OO ,是一種程式設計方式,其他的程式設計方式分別有:結構式程式設計與函式程式設計。這次的主題是 OO,那 OO 的主要特性會是什麼呢?
物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有物件概念的程式程式設計典範,同時也是一種程式開發的抽象方針。它可能包含資料、屬性、程式碼與方法。物件則指的是類別的實例。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充性,物件裡的程式可以存取及經常修改物件相關連的資料。在物件導向程式程式設計裡,電腦程式會被設計成彼此相關的物件。
(節錄自 — 維基百科)
是不是看不懂?對,維基的東西就是這麼複雜🤬。
以我的話來說,OO 就是以一種人類日常分類方式來設計程式。什麼是人類日常分類?就好比現在我請在座各位描述一下,何為杯子?
可能為們會說,可以裝水、可以飲料、有一個圓圓的形狀、有耳朵能拿等等,這些都是杯子的特徵,而這些特徵會構成一件物品,讓人聽到「給我個杯子」這句話時,知道要給他一個「杯子」,而不會是叉子。
而在程式上面,我們同樣需要面對這種描述的問題。當我們要在程式裡描述一個杯子時,我們就可以用到 Class 這個 OO 的特性了。
Class 中文稱為類別,在 OO 中是一個相當重要的概念。當我們在程式中有了類別之後,就等於人類有了抽象能力一樣重要。我們可以為一種專門裝水與飲料的容器抽象為杯子,正正是我們在程式中用一樣的方式為擁有某種/些特性的程式碼/功能抽象為類別一樣。
當我們要用程式來表達杯子時,我們可以怎麼寫?我會分別寫下沒有類別時的寫法與類別的寫法︰
int cupSize = 50cm * 50cm; bool cupHaveEar = false; String cupName = "my love"; public Array function cupManufacture(int cupSize, bool cupHaveEar, String cupName){ array materialList = [cupSize, cupHaveEar, cupName]; return materialList; }
Class Cup { String name; int size; bool haveEar; public Array function manufacture(int size, bool haveEar, String name){ array materialList = [size, haveEar, name]; return materialList; }
以上沒有類別與類別為基礎的差別我認為是結構。當我們隨意寫一段杯子的 code 時,這些 code 可能會散落在世界各地,沒有一個統一個地方可以維護。但當我們宣告杯子為一個類別時,在類別內的都是杯子的特性(屬性),這樣一個杯子的藍圖(抽象想法)就出現了。
那現在作為一名工匠(程式猿),我們就可以按照杯子的藍圖來做出一個杯子來了!
Class Cup { String name; int size; bool haveEar; // 建構函式 public function __constructor(String name, int size, bool haveEar){ this->name = name; this->size = size; this->haveEar = haveEar; } public Array function manufacture(int size, bool haveEar, String name){ array materialList = [size, haveEar, name]; return materialList; } } //以下是在Controller實作一個杯子出來 Class Controller { Cup myTeaCup = new Cup("Tea", "500", true); }
這邊不會多說明一些 code 的細節,如什麼是 contructor。但是以上的 code 就是以一個 Cup 的類別,帶上一個杯子所需要的初創化參數,就可以創造出一個真正的杯子出來。
跟上面沒有類別的對比起來,每當我們要做一個新的杯子時,我們只要
new Cup() 出來就可以馬上製造出一個杯子出來了!不用再來瘋狂宣告變數來創出一個個不同杯子的特性。
當我們使用 Class ,我們設計程式時就可以像人類抽象思考一樣,為每一個我們想要描述的東西抽象化,來寫出一個具通用特性的類別。
其實上面的把一堆 code 寫進 Class 中就是我們的物件導向三本柱之一:封裝!!!!!
當然封裝有很多種手法可以形成封裝,把東西抽象化是一種再包起來,才被外界呼叫就是一種常用的封裝手法。簡單到一個 function ,也是一種封裝手法。
當有了類別,我們就可以創造物件。但是杯子有好多不同的型態,可能不是一個 Cup 的類別就可以表達清楚,如有馬克杯、保溫瓶等等。因此,我們還需要一些其他物件導向特性。還請看下一集的 OO 三本柱之繼承。
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!
- 来自作者