面向對象編程(oop)從誕生到現在理念上經歷了幾次怎樣大的變遷和轉化?
面向對象編程從誕生到現在時間說長不長說短不短。有沒有經歷幾次大的理念的轉變?到底什麼是面向對象編程?怎樣才算對oop有比較深刻的理解?oop咋覺得越看越懸呢?
(我現在對面向對象的理解程度是一個軟體有好多個模塊組成 各個模塊除介面外不可見 各自負責好自己的事情 程序的運行依靠模塊間的通信)
從概念上講,面向對象的萌芽其實來自於Abstract data type,而 ADT 的概念最初應該是由 David Parnas 在 1972 發表的《On the Criteria to Be Used in Decomposing Systems into Modules》論文中提出來的。
1973年,Simula 67 發表,Simula 67 通常意義上被稱為第一個面向對象語言。
1975年,是面向對象語言里程碑的一年,這一年 Barbara Liskov 發明了CLU 語言,面向對象編程的基石之一的里氏替換原則(Liskov substitution principle)就是她提出來的,說里氏是OO之母絲毫不為過(因為自此之後 OO 可以生子)。里氏之後可以說面向對象的很多理論都基本成型。
1983年,Smalltalk 發表,被認為是第二個面向對象語言,Smalltalk 由 Actor model 中受到啟示,使用了消息傳遞式的設計,這可以說是現代面向對象語言中 this/self 的原型;另外像 public/private 這樣的概念也在 Smalltalk 中有了基本的雛形。
80年代後期及90年代初期,面向對象範式成為了一時風潮,湧現了許多面向對象語言,其中一些至今仍然堅挺如 C++,當時甚至連 FP 的鼻祖 Lisp 都趕了把 OO 的時髦。
最終,到了1996年,Java 發表,可以說是現代面向對象範式成熟的一個里程碑。
在我的理解里,其實面向對象語言沒有什麼神秘的地方,無外乎 class 和 object,method 是跟著 class 走的,而data 是跟著 object 走的,而我們平時編程其實就是在處理 data,即就是在處理 object,所以才叫 Object Oriented Programming。
思考題:C++允許「我們都是人,所以我可以把你私有的眼睛借來隨便玩,再還給你」,這難道是一種設計上的妥協?這種survey性的專業問題,題主可以考慮查查paper,不過是莫衷一是的。
我談一下OOP在我腦海里的進化過程:OOP is Class (C++)OOP is Message Passing (SmallTalk)OOP is Service (SOA)
OOP is Software Responsibility BoundaryOOP is Business Domain瀉藥。
這是一個大話題,我無法給出高質量的回答。
參見WIKI:Object-oriented programming實際上這裡面牽涉到的內容太廣泛。理解這個問題需要從下面幾個方面來看:- 軟體行業規模
- 軟體複雜度
- 軟體工程
- 編程理論
- 方法論
- 語言進化
從語言進化的角度來說,變化的趨勢是:
組合 -&> 組合 + 繼承 -&> 組合 + 繼承(弱) -&> 多範式繼承其實是擺脫不了的,不然就沒有了面向對象語言的顯著特徵。OOP其實就是抽象封裝 + 關係。這裡語言提供了一個固定封裝間的關係是繼承而已。
當然了,本來就是有局限性的方法論,現在發展到啥都oop。本來通過描述關係所形成的虛線個體,直接變實線個體。從哲學角度看,還可以看到沒有關係的個體。
oop一直想自圓其說,每到一個階段出一個東西,然後加上一堆規範,但很多東西不是自己解決自身帶來的本不存在問題,就是本來就是語言級別問題。
準確說,介面不是oop概念,是一種聲明手段,一種契約。這東西很多地方都有不同表現形式。
oop需要一個自洽的形式化系統和哲學系統。完全個人的看法:
- 面向過程
- 偽-面向對象(披著面向對象外衣的面向過程)
- 初級-面向對象 (抽象、封裝、繼承)
- 進階-面向對象 (設計模式)
- 成熟-面向對象 (領域模型)
在 Ruby 作者松本行弘的書里,很好的講了 OOP 編程的發展演變,讀起來超爽。推薦下。
談下個人的理解,要和面向過程對比,例如實現「把石頭搬到家裡」。
面向過程就是實現了「把石頭搬到家裡」,沒有辦法搬其他東西。而面向對象是實現了「人」,進而實現「人把石頭搬到家裡」,這樣的好處是我們實現的對象「人」還能做更多的事情比如「把雞蛋搬到籃子里」。
模塊化則是更多關注怎麼實現對象「人」,比如把人拆成骨,肉,血。這樣骨、肉、血還能組成猴子。甚至可以把「人」拆成細胞去實現更多生物。面向對象-&>設計模式-&>架構
沒啥重大變化,主要OO的思想就是讓程序更有效的組織而已,是程序建立的一種模型而已。推薦閱讀:
※C++ 11為什麼引入nullptr?
※為什麼判斷 std::vector 是否為空時,用 if(0==vec.size()) 提示效率低,但用 if (vec.empty()) 正常?
※C/C++中char/int/long等基本內置類型為何要編譯器相關而不是固定長度?
※Visual C++.NET的存在意義是什麼?
※如何評價 JetBrains 的新 C/C++ IDE CLion?