面向對象編程(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 Boundary

OOP is Business Domain


瀉藥。

這是一個大話題,我無法給出高質量的回答。

參見WIKI:Object-oriented programming

實際上這裡面牽涉到的內容太廣泛。理解這個問題需要從下面幾個方面來看:

  • 軟體行業規模
  • 軟體複雜度
  • 軟體工程
  • 編程理論
  • 方法論
  • 語言進化

從語言進化的角度來說,變化的趨勢是:

組合 -&> 組合 + 繼承 -&> 組合 + 繼承(弱) -&> 多範式

繼承其實是擺脫不了的,不然就沒有了面向對象語言的顯著特徵。

OOP其實就是抽象封裝 + 關係。這裡語言提供了一個固定封裝間的關係是繼承而已。


當然了,本來就是有局限性的方法論,現在發展到啥都oop。本來通過描述關係所形成的虛線個體,直接變實線個體。從哲學角度看,還可以看到沒有關係的個體。

oop一直想自圓其說,每到一個階段出一個東西,然後加上一堆規範,但很多東西不是自己解決自身帶來的本不存在問題,就是本來就是語言級別問題。

準確說,介面不是oop概念,是一種聲明手段,一種契約。這東西很多地方都有不同表現形式。

oop需要一個自洽的形式化系統和哲學系統。


完全個人的看法:

  1. 面向過程
  2. 偽-面向對象(披著面向對象外衣的面向過程)
  3. 初級-面向對象 (抽象、封裝、繼承)
  4. 進階-面向對象 (設計模式)
  5. 成熟-面向對象 (領域模型)


在 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?

TAG:Ruby | 編程 | Java | 面向對象編程 | C |