面向對象的認識論基礎與對其的編程方法論的分析

說一切都是對象是錯誤的。首先,對象表明的是認識的「對象」。因此任何與認識「過程」相關的東西,都不是對象。好比研究,學習,坐車,失敗,,,,人類語言的能力是極其強大的,其所涵蓋的領域超出任何人的想象。因此任何簡單地說一切都是什麼的想法,都值得一一斟酌!程序員

對象自己其實只是做爲「認識」的對象而提出來的。對象在英語中即客觀,是惟物主義的基礎。也就是說,一切認識都是從「對象」開始的(這可能就是「一切都是對象」的說法的來源)。一切認識都是從對象開始的並不意味着一切都是認識。由於顯然在人的生活中有些東西不是認識或不能被歸爲認識的領域,或者說,到底什麼纔是「認識」呢?無論答案是什麼,能夠確定的是它確定最終仍然包含有必定的邊界。它並不涵蓋一切。至於它的邊界到底在哪裏先放一邊,由於如今要作的並非討論哲學。編程

如今的論域是編程方法。函數式編程

面向過程與面向邏輯或面向任何其它東西的編程方法都基於必定的假設。面向過程假設一切都是過程。面向邏輯則假設一切都是邏輯。這裏的「一切都是」意指能夠被最終分解成。因此當說「一切都是過程時」,說的實際上是:一切均可以最終分解成過程。而對應到構建過程,就意味着「從過程開始」。對於一切都是邏輯,則意味着一切均可以或是從邏輯開始的。也就是說,從過程或邏輯,能夠開始一切。這是它們的構建邏輯。函數

從過程或邏輯開始的構建過程,天然隱含着認爲一切都是邏輯或過程的認識論基礎。一門語言可能同時提供多種構建手段,但那與編程方法不要緊。有關係的是真正指導編程過程的思想是什麼。語言特性固然matters,甚至在不少時候天然而然地將人引入了某種編程方法論。但這是語言與編程方法之間的適配度問題。跟對編程方法的討論仍然沒有任何關係。由於只要你使用了某種編程方法,你天然就不得不接受使用此種編程方法所能獲得的一切。不論是好的仍是壞的。工具

因此問題是,從邏輯或過程開始,是一種最好的構建過程嗎?學習

這個能夠從現實生活中找到答案。由於現實生活的覆蓋面其實很廣,而且編程的問題域正好「對應」整個現實生活。因此分析一種方法是否構建的最佳手段,其關鍵就在於在現實生活中,它是否適應面最廣的或最好的方法?編碼

先分析邏輯。因此問題就是:在現實生活中,咱們能夠從邏輯開始構建一切嗎?顯然不。不少東西都顯然跟邏輯沒有任何關係。好比感受:「疼痛」要怎麼跟邏輯扯上關係呢?高興呢,激動呢。任何情緒都沒有辦法跟邏輯扯上關係。對不少現象的描述也沒有辦法跟邏輯扯上關係。事實上,邏輯的應用面其實很窄。這可能正是邏輯編程沒有被普遍應用的緣由。由於邏輯並非一種被普遍應用的知識或工具。spa

而後分析過程。問題變成:在現實生活中,能夠從過程開始構建一切嗎?顯然不。一個答案就是對象。或者邏輯(其實只要把幾個概念在內部對比一下就已經能夠發現對象是最好的方案。由於對象能夠用來表達邏輯,也能夠用來表達過程。面向對象最偉大的地方是爲編程方法引入了主語的形式化表達)。視頻

對象如此方便,是由於它原本就是人類認識論的基礎。一切認識都從對象開始。而一切(惟物主義)知識都是從認識的基礎上發展起來的。若是沒有認識,恐怕任何表達都會變得困難。從對象開始,解決了一切認識的問題。而認識又解決了絕大部分人類知識的描述問題。因此對象能夠解決絕大部分知識的描述問題。而一旦解決了描述問題,基本上咱們就解決掉了編程的大部分問題。由於編程的目的在大部分時候並非爲了求解新知識,而只是爲了利用人類已知的知識去信息化或自動化一些過程。甚至自動化自己也能夠用來解決一些求解問題。對象

對象的另外一個好處是它是客觀的。相對於面向過程或面向邏輯的編程方法中將一切都抽象成過程或邏輯的與事實不符,緣由是一旦你開始進行非第一層(即高於第一層。如過程,邏輯)的抽象(對象---對象並不意味着物理存在。對象意味着認識或知識表達的起點),就離開了認識的基礎。而離開了認識的基礎,描述的困難天然就跟着上來了。由於從最基礎的認識出發向上抽象,過程與邏輯並非所有的路徑。從最基礎的認識即對象出發,被抽象出的概念種類繁多,其中的絕大部分都不是過程與邏輯可能描述的。由於過程與邏輯根本就不位於那些概念的構建路徑上。面向對象固然也不能幫助構建這些概念,可是它經過往下退一層,使得構建這些概念成爲可能,爲程序員提供了一個描述空間。程序員從對象出發能夠構建任何東西,包括過程,也包括邏輯。這就是爲何如今有些原本徹底是面向對象的語言同時還能夠被用來進行面向過程的編程的緣由。實際上,我以爲這多是如今的面向對象的語言最普遍的應用------這也解釋了面向過程的編程方法曾經而且正在那麼/如此流行的緣由------在大部分時候,咱們並不須要面向對象。面向過程能夠用很簡單的方法解決大部分沒有可進化性需求問題。實際上,在面向對象的語言中進行面向過程的編程正是面向對象方法極其強大的正面證據(好比,使用一個對象做爲函數的承載者來實現函數式編程)。

 

有一句很是生活化的話:退一步海闊天空。 這句話極大地描述面向對象做爲一種編程方法的價值。

另外,在網上看到搜索編程方法論時發現前面幾頁結果所有是斯坦福的編程方法論課程視頻。這個視頻幾乎從一開始就直接切入編碼方法。這是不對的。事實上,這正是不少人編程多年未得「昇華」的根本緣由:編程領域歷來就沒有出現過任何真正的理論。歷來沒有人真正研究過如何編碼,由於它實在太「容易」了。

但事實卻遠非如此。由於Programming實際上是一個涉及知識很是寬泛的領域,好比形式語言學、形式語義學、編程範式、硬件特性、協做模式、系統工程學、產品學等多個領域。何況這些還只是我如今能列出來的東西,並非所有。由於找不到相關的理論我只能憑本身的想象象徵性地列一下而已------可是這些絕對是做爲一個好程序員必需要研究的東西。而斯坦福的課程不包括這些東西的任何部分。能夠想象經過它能夠學到什麼了。

固然,這也不是說那個課程就徹底不能學。只是說Programmig methodology是一個基本上未經探索的領域。斯坦福這個課程的內容是能夠學,但千萬不要把它當成真正的編程方法論來學。由於它不是!勉強一點的話它也頂多只能算是一種高級語言層次上的編程方法論。但在我心目中做爲一門真正學科的編程方法論,即便不算系統工程學與產品學方面的內容,至少也應該要上升到編程範式的層次來討論編程方法才能被勉強冠以編程方法論的名稱。而它卻連面向對象都不討論,固然不能算Programming methodology。它更象是一種Programming technology。