假設你讀《編程導論(Java)·1.1.2 顛倒的世界(柏拉圖法則)》感到無趣,請嘗試評價這個段子。express
Classes drive me crazy. That might seem strange, so let me explain why.編程
Clearly classes should be great. Our brain excels at classifying everything around us. So it seems natural to classify everything in OO programs too.
However, in the real world, there are only objects. Classes exist only in our minds. Can you give me a single real-world example of class that is a true, physical entity?設計模式
No, I didn’t think so.
Now, here’s the problem. Have you ever considered why it is so much harder to understand OO programs than procedural ones?框架
Well, in procedural programs procedures call other procedures. Procedural source code shows us … procedures calling other procedures. That’s nice and easy, isn’t it?編程語言
In OO programs, objects send messages to other objects. OO source code shows us … classes inheriting from classes. Oops. There is a complete disconnect in OOP between the source code and the runtime entities. Our tools don’t help us because our IDEs show us classes, not objects.
I think that’s probably why Smalltalkers like to program in the debugger.ide
The debugger lets us get our hands on the running objects and program them directly.Here is my message for tool designers: please give us an IDE that shows us objects instead of classes!post
《編程導論(Java)》將Plato法則、Liskov原則和Parnas原則做爲面向對象編程範式的三大基石。學習
面向對象範式的第一原則,yqj2065稱之爲柏拉圖法則。它是對象技術的觀念範式和心理範式的根源。對象技術是經過顛倒的理念世界而模擬惟物的真實世界。spa
★柏拉圖法則:類的世界獨立存在,對象世界由類建立而來。.net
儘管有人以爲。這一原則很天然。沒有必要提出和強調,但是,我發現。對這一原則的理解和接納程度,決定了你對面向對象的領悟程度。
常常有人說,學習面向對象,關鍵是掌握其思想。什麼是「思想」——太中國化的詞彙,事實上,就是面向對象編程範式。
儘管學科的邏輯體系——規則範式很是重要,好比面向對象規則範式不只包含多態、封裝、繼承和麪向對象設計的概念。還包含設計模式、面向對象軟件project、統一建模語言、JUnit等(不過任意地舉例,不全面)。
但是。程序觀(觀念範式)和編程的心理範式也很是重要。需要教材或教師重複地、潛移默化地傳遞或灌輸給學生。單純的講授語法。是最糟糕的教學方式。這也是我強調柏拉圖法則的一個理由。因此,列出這個原則,不是爲了裝B,而是我以爲它真的很是重要。
一、對象(object)是一個具備濃郁的哲學味道的術語。原意是指用一種或多種(人的)感官。尤爲指用視覺或觸覺可以感受到的東西、物體或物品。真實世界就是由對象/客體組成的。
二、人們看見這條黃狗、那條哈巴狗,這時,人類發揮其抽象(v. abstract)能力。從一個個的詳細對象中提煉出類別/類型性的概念‘狗’或‘Dog’。進一步的演化則使人困惑——人類抽象出一些沒有直接的物理相應物的概念。好比,幾何中的「圓」,現實生活中沒有一個對象能全然知足圓在數學上的完備性,即便當心翼翼地使用圓規。
三、軟件的問題域是真實世界的一部分。柏拉圖的理念論。正好適用於軟件的解域:一切皆概念/類型!
² 類先於對象存在。類可以獨立存在。
做爲概念,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表達式。
觀念範式:指看待世界、運用科學的不一樣方式。
這是一套依據特有的價值觀念和標準所造成的、關於外部世界的形而上的信念。
好比牛頓眼裏沒有「不肯定性」的東西,而微觀物理學描寫敘述了諸多不肯定性。
OOP的觀念範式:正如在[1.1.3 面向對象]中所言,
★面向對象技術經過顛倒的理念世界而模擬惟物的真實世界。
1.程序爲鬆散耦合的類的集合。
2.程序運行/進程是一個包括了不少對象的綜合體。對象們組成了一個相互依存,相互交互的社會。
3.編程不是編寫指令集,而是創造一個自我管理、彼此交互的對象的世界。
【參見 0.2.2 操做符和操做數】
從絕對終極的意義上說。編程就是編寫一串計算機將亦步亦趨的指令集。然而,從解決實際問題的角度看。依照機器的思惟觀察問題並不逗人喜歡。它既不符合人的思路,又不便於程序猿表達本身的想法以解決大型和複雜的問題。
因此,以人的理解方式而不是機器的理解方式看待程序,以更符合人的思路的方式將程序組織起來。正是面向對象技術實用和有趣之處,也是對象技術成爲當前主流編程技術的重要緣由。
心理認知因素—— 心理範式。在不一樣的天然觀和邏輯體系下,科學共同體對其範式有着「虔誠的狂熱」,併力圖把天然界「強迫歸入」範式所規定的思想框架內,從而展開卓有成效的研究活動。當範式改變時,不但從事科學研究的人更換了,評價選擇的標準、整個社會心理、研究傳統以及世界圖式都改變了。因此新舊範式是不可通約的、不可比較的。
面向對象程序猿應該依照平常生活的隱喻進行編程(心理範式).
編程範式也許是學習不論什麼一門編程語言時要理解的最重要的術語,因爲講授一門詳細的語言不是計算機科學教育的目的,而應該介紹語言背後的範式。