《編程導論(Java)·1.1.2 顛倒的世界(柏拉圖法則)》,學園都市之顛倒法則
《編程導論(Java)》將Plato法則、Liskov原則和Parnas原則作為物件導向編程範式的三大基石。
物件導向範式的第一原則,yqj2065稱之為柏拉圖法則,它是對象技術的觀念範式和心理範式的根源,對象技術是通過顛倒的理念世界而類比唯物的真實世界。
★柏拉圖法則:類的世界獨立存在,對象世界由類建立而來。
雖然有人認為,這一原則非常自然,沒有必要提出和強調,但是,我發現,對這一原則的
理解和接納程度,
決定了你對物件導向的領悟程度。
提出的依據:
1、對象(object)是一個具有濃鬱的哲學味道的術語,原意是指用一種或多種(人的)感官,尤其指用視覺或觸覺可以感覺到的東西、物體或物品。真實世界就是由對象/客體組成的。
2、人們看見這條黃狗、那條哈巴狗,這時,人類發揮其抽象(v. abstract)能力,從一個個的具體對象中提煉出類別/類型性的概念‘狗’或‘Dog’。進一步的演化則令人困惑——人類抽象出一些沒有直接的物理對應物的概念。例如,幾何中的“圓”,現實生活中沒有一個對象能完全滿足圓在數學上的完備性,即使小心翼翼地使用圓規。
3、軟體的問題域是真實世界的一部分。柏拉圖的理念論,正好適用於軟體的解域:一切皆概念/類型!
應用:
² 類先於對象存在。類可以獨立存在。作為概念,Dog.class可以靜態地存在於硬碟中,它並不在意世界上(記憶體中)有沒有活動的狗。JDK中的類,1-3所示,存在於硬碟中。而程式運行時,Dog.class預先動態地存在於記憶體中,而後(如果需要)建立本類的對象,參考[7.1類載入]。
² 有一種自然的存在,類的靜態成員。【yqj2065不贊同ACM Java Task Force/Java特別工作群組的觀點,不認為:靜態成員不合時宜,是一個教學痛點】
² 程式啟動並執行起點,public static void main(String [ ] args),它無中生有。從該起點開始建立第一個對象。一個對象通過執行其方法能夠建立其他的對象。
² 作為模板,概念建立自己的對象。建立對象的基本方式是“new 構造器()”運算式,稱之為類的執行個體建立運算式(class instance createexpression),本書直呼其為new運算式。
範式(paradigm)
觀念範式:指看待世界、運用科學的不同方式。這是一套根據特有的價值觀念和標準所形成的、關於外部世界的形而上的信念。例如牛頓眼裡沒有“不確定性”的東西,而微觀物理學描述了諸多不確定性。OOP的觀念範式:正如在[1.1.3 物件導向]中所言,
★物件導向技術通過顛倒的理念世界而類比唯物的真實世界。
1.程式為鬆散耦合的類的集合。
2.程式執行/進程是一個包含了許多個物件的綜合體,對象們組成了一個相互依存,相互互動的社會。
3.編程不是編寫指令集,而是創造一個自我管理、彼此互動的對象的世界。【參見 0.2.2 操作符和運算元】
從絕對終極的意義上說,編程就是編寫一串電腦將亦步亦趨的指令集;然而,從解決實際問題的角度看,按照機器的思維觀察問題並不逗人喜歡,它既不符合人的思路,又不便於程式員表達自己的想法以解決大型和複雜的問題。所以,以人的理解方式而不是機器的理解方式看待程式,以更符合人的思路的方式將程式組織起來,正是物件導向技術有用和有趣之處,也是對象技術成為當前主流編程技術的重要原因。
心理認知因素——
心理範式。在不同的自然觀和邏輯體系下,科學共同體對其範式有著“虔誠的狂熱”,并力圖把自然界“強迫納入”範式所規定的思想架構內,從而展開卓有成效的研究活動。當範式改變時,不但從事科學研究的人更換了,評價選擇的標準、整個社會心理、研究傳統以及世界圖式都改變了,所以新舊範式是不可通約的、不可比較的。
物件導向程式員應該按照日常生活的隱喻進行編程(心理範式).
編程範式或許是學習任何一門程式設計語言時要理解的最重要的術語,因為講授一門具體的語言不是電腦科學教育的目的,而應該介紹語言背後的範式。
常常有人說,學習物件導向,關鍵是掌握其思想。什麼是“思想”——太中國化的詞彙,其實,就是物件導向編程範式。
雖然學科的邏輯體系——規則範式很重要,例如物件導向規則範式不僅包括多態、封裝、繼承和物件導向設計的概念,還包括設計模式、物件導向軟體工程、整合模組化語言、JUnit等(僅僅是隨意地舉例,不全面)。但是,程式觀(觀念範式)和編程的心理範式也非常重要,需要教材或教師反覆地、潛移默化地傳遞或灌輸給學生。單純的講授文法,是最糟糕的教學方式。這也是我強調柏拉圖法則的一個理由。所以,列出這個原則,不是為了裝B,而是我認為它真的很重要。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。