ChunYeung
ChunYeung

哲學系畢業,軟體工程師,喜愛學習,認為知識應該是開放的。在網路學習的同時也希望能回饋其他人。

什麼是OO?物件導向與封裝

Google 物件得出的結果,果然大部分都是跟程式有關的內容呢。
說來慚愧,寫了兩年的物件導向語言,真的意識這是一個「物件導向」語言,這件事情也是最近的事情。當然是要回去惡補一下何為物件導向,同時也想記錄一下自已的心得,讓以後的自已檢視一下。

什麼是物件導向程式設計?

其實平常我們常使用的程度語言,絕大部分都是物件導向語言。從 C++,Java,Python,PHP 等等(不好意思,不要問我JavaScript算不算),我們真的是活在物件導向語言的圈子當中。那我們真的有使用到物件導向的功能嗎?

物件導向 - 簡稱 OO ,是一種程式設計方式,其他的程式設計方式分別有:結構式程式設計與函式程式設計。這次的主題是 OO,那 OO 的主要特性會是什麼呢?

物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有物件概念的程式程式設計典範,同時也是一種程式開發的抽象方針。它可能包含資料、屬性、程式碼與方法。物件則指的是類別的實例。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充性,物件裡的程式可以存取及經常修改物件相關連的資料。在物件導向程式程式設計裡,電腦程式會被設計成彼此相關的物件。
(節錄自 — 維基百科)

是不是看不懂?對,維基的東西就是這麼複雜🤬。

以我的話來說,OO 就是以一種人類日常分類方式來設計程式。什麼是人類日常分類?就好比現在我請在座各位描述一下,何為杯子?

This is a cup.

可能為們會說,可以裝水、可以飲料、有一個圓圓的形狀、有耳朵能拿等等,這些都是杯子的特徵,而這些特徵會構成一件物品,讓人聽到「給我個杯子」這句話時,知道要給他一個「杯子」,而不會是叉子。

而在程式上面,我們同樣需要面對這種描述的問題。當我們要在程式裡描述一個杯子時,我們就可以用到 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 三本柱之繼承。
CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…

发布评论