關於OOP的個人小感

關於OOP可以先看看Wiki上的說明,後面我會分享一下我的想法。

OOP主要有三點:封裝、繼承、多型。

先來談談封裝,封裝除了把data設為private、要存取都要靠getter/setter以外,最大的好處是使用者在透過getter/setter存取data的時候,都能夠確保data能符合設計者的想法。理想的情況下,若是使用者透過setter試圖寫入時,設計者應該會檢查傳入值,甚至是在程式運作時提示使用者傳入值有問題。Getter亦同,在data有問題時能夠正確的提示呼叫端,好比呼叫一個pointer的getter時,如果該pointer所指向的資料有問題就清空資料回傳nullptr。除此之外,還能夠確保不同class之間的低耦合,讓呼叫者只需要知道呼叫getter/setter就能夠存取到正確的資料,而不用另外撰寫過多檢查的程式。

再來是繼承,若是有查過繼承是甚麼的話,大概會知道有個is-a原則,即若A是B,那麼A可以繼承B。我個人的看法是,假如我要實作X跟Y兩個機器的class,那我可以試著找到X跟Y相同的部分,將其作為X與Y的base class,再利用virtual function去實作兩者不同的部分。換個例子,假如X是Y的改版,那麼我可以讓X繼承Y,讓X直接獲得Y的所有功能,再透過override virtual function去實作改版的功能。說穿了就是減少相同功能的重複coding,在新增功能時只實作不同的部分。

最後是多型,多型可以透過base class的pointer就能夠讓程式執行derived class的function,如此一來可以減少很多針對不同類別的檢查,減少人為發生錯誤的機會。

順帶一提,在C++中還有Name Hiding的機制,在derived class宣告一個和base class中同名但不同參數的function後,會無法直接利用derived class呼叫base class的function,需要特意使用Derived_ptr.Base::f(x)的方式呼叫,又或者是在derived class中加入using Base::f;的宣告。這麼做可以避免意外呼叫到不該呼叫的function,因為programmer不見得有意要使用base class的member function。

發表留言