當我們在談論面向對象時,我們在談論什麼

摘要

本文簡單的說一下就我理解的面相對象和麪向過程。以及什麼是數據及其數據類型。並且這兩種編程範式有什麼不同。重點是閒扯,算是自己學習過程的一點胡思亂想。

光的本質是什麼?是粒子?是波?本質是什麼或許不重要,也許重要的是他有什麼樣的性質。

也許觀察本身就是一種錯誤。觀察在什麼粒度上纔算是客觀的。

互聯網時代究竟有無真相可言。

ox00:面相對象vs面向過程

相信大部分人的第一門編程語言大多是C語言,我們編程的時候多多少少還是受其影響的。C是標準的命令式編程,或者說是數據和操作解耦的面向過程。也就是說我們明確規定的對於數據進行怎樣的操作。在編寫程序時,我們大多采用自頂向下的方法,將一個大的模塊拆分成小的模塊,這其中在操作小的模塊時,我們根據需要又抽象了相對應的數據。也就是說數據和過程是完全解耦的,數據只是單純的數據而已,通過這樣的方法,我們可以將一個個小的模塊聚合成大的模塊。而面相對象的編程範式呢,我們通過採用一個個的對象來完成我們的操作,我們絲毫不關心對象內部的實現方式,我們只關心他能提供給我們什麼樣的服務。

0x01:類型是什麼

這要看在什麼樣的語義下,我們怎樣去定義數據或者類型,在c語言眼裏,我們可以自定義數據結構,也就是使用typedef struct這樣的語句來定義我們想要的新的數據類型。我們不妨想想什麼情況下我們需要定義新的類型。實際上是爲了過程抽象。假如說我們想要實現複數運算的包(或者說庫、模塊)。如果我們不使用數據抽象,那麼無論是對於包的使用者還是創建者,都帶來了非常多的麻煩,對於開發者來說,實現對於外界就不是透明的了,而對於使用者來說,必須仔細閱讀設計文檔,並且瞭解其實現過程才能進行包的使用。而且由於未進行抽象,我們再使用該包進行二次開發時會更加麻煩,比如實現代數運算系統。我們不能站在複數這樣層度上進行思考,而只能時刻思考着他是如何組成的。因此,爲了過程抽象,我們只能先進行數據(類型抽象),面相過程和麪相對象採用了兩種不同的思路,面相過程其實也很直接,我們直接抽象新的數據類型,將數據進行聚合就可以了麼,然後再設計與之對應的操作(過程)即可。

下面用僞代碼進行說明:

typedef struct{
    double x;
    double y;
} complex;
complex add(complex a,complex b);
complex sub(complex a,complex b);
complex time(complex a, complex b);
complex div(complex a, complex b);

面相對象則更進一步,既然數據和操作如此重要,那麼我們直接將其聚合到一起,也就是將操作完全向數據靠攏,下面用僞代碼進行說明:

class complex{
    double x;
    double y;
    complex(x:double,y:double){
        this.x = x;
        this.y = y;
    }
    complex add(complex other);
    complex sub(complex other);
    complex time(complex other);
    complex div(complex other);
}

可以看出,將操作完全向數據靠攏,實際上若這樣看待面向對象和麪相過程也還是有點隔靴搔癢的感覺。不妨我們這樣假設,我們要設計一套代數系統,裏面有有理數,無理數,實數,複數。整數,複數,整數,自然數。儘管現實中,這些類型實際上有從屬關係。採用純面向過程的編程範式,我們只能定義每一種數據類型,然後爲每一種數據類型設計與之對應的操作。

但是採用面相對象的設計,我們可以設計良好的繼承關係,並且實現方法上的多態,下面用僞代碼進行描述:

abstract class Number {
    Number add(Number n);
    Number sub(Number n);
    Number time(Number n);
    Number div(Number n);
}
class complex extents Number{
    double x;
    double y;
   	complex(x:double,y:double){
        this.x = x;
        this.y = y;
    }
    complex add(complex other);
    complex sub(complex other);
    complex time(complex other);
    complex div(complex other);
}
//RealNumber,Integer same as above

這裏就可以看出,當我們在談論數據,談論類型時,一定與操作與之相對應。爲了將數據和操作嚴格耦合,我們引入了面相對象的方法。當我們不定義任何操作時,純數據是意義不大的。因爲我們可以採用不同的方法來解釋這些數據,從而形成新的類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章