面向對象編程的興衰

2021-01-09 InfoQ技術實驗室

面向對象編程(OOP)並沒有消亡。但與過去相比,它確實沒有那麼普及了。在 90 年代時,有很多面向對象編程相關的教科書和計算機科學課程。它就是「流行趨勢」。然而,隨著時間的流逝,人們開始意識到,嚴格的面向對象方法會帶來很多問題。這些問題往往會使代碼更複雜、更難以理解且更難以測試。

在 90 年代時,有很多面向對象編程相關的教科書和計算機科學課程。它就是「流行趨勢」,是計算機的下一個浪潮。如果沒有以這種風格編程,那麼就是一個糟糕的程式設計師,或者至少落後於潮流。

當時,計算機科學(CS)專業的學生學習 OOP 的方法非常嚴格和教條。不僅鼓勵實踐者以對象和類的形式來構建應用程式,甚至還要求他們從對象和類的角度來考慮問題空間,這種實踐方法被稱為「面向對象的分析和設計」。

然而,隨著時間的流逝,人們開始意識到,嚴格的面向對象方法會帶來很多問題。這些問題往往會使代碼更複雜、更難以理解且更難以測試。

事實證明,OOP 更適合某些特定的問題領域。例如,OOP 仍然是構建用戶界面(窗口和按鈕)最自然的方式 。但是,試圖將面向對象技術應用於關係資料庫一直是一場災難。

以下是我觀察到的一些問題。

「鴨嘴獸」效應

現實世界並不總是能被整齊地劃分成具有明確屬性定義的類別。例如,假設我們創建了一個代表動物王國的類層次結構。該類層次結構中既包含爬行動物(冷血、有鱗片、產卵等等),又包含哺乳動物 (恆溫、有毛、生育等等),還包含鳥類、兩棲動物、無脊椎動物等等。

然而,對於鴨嘴獸,它似乎不屬於我們上述定義的任何類別。我們要做什麼呢?我們是創建一個全新的類別,還是重新考慮整個分類方案呢?就工作量和程序複雜性而言,這兩種方法都會產生顯著的成本。

深層次結構

我記得當我還在谷歌工作的時候,有一個 JavaScript 庫 goog.ui,它可以用於創建基於 Web 的用戶界面。以下是這個庫中某個 UI 組件的繼承層次結構:

class ToolbarColorMenuButton* inherits from ColorMenuButton * inherits from MenuButton * inherits from Button * inherits from Control * inherits from Component * inherits from EventTarget * inherits from Disposable * inherits from Object九層的類繼承好多。然而,情況還會變得更糟糕。

在這些高層類中,有許多都被只與少數子類相關的方法和屬性「汙染」了。例如,「Control」類有 90 多個方法。它具有設置狀態的方法,即使特定的子類是無狀態的;它有添加和刪除子元素的方法,即使控制項包含子元素也沒有任何意義。

造成這種複雜性的一個重要原因是,該庫的作者試圖通過將組件放到類層次結構的不同位置來組織組件的不同功能 ,例如,組件是按鈕還是滑塊,或者組件是否有顏色 。

但實際上,這些不同功能的組件彼此之間無關。咖啡杯是紅色的,和它是用陶瓷製成的,基本上是獨立的屬性。將紅色咖啡杯歸入「紅色物品」的類別,並不比將其歸入「陶瓷製品」甚至「家居用品」的類別更正確。任何一個都是任意選擇的,因為類別是精神和社會的結構。

在谷歌工作的最後幾年裡,為了替代 goog.ui,我創建了一個名為「Quantum Wiz」的新用戶界面工具包。我們採用的規則之一(以典型的谷歌風格,寫成方程式)是:

組合 > 繼承簡單地說,這句話的意思是:

「更傾向於使用組合......

點擊了解更多,查看全文

相關焦點

  • 什麼是面向過程和面向對象編程
    一張圖帶你看懂什麼是面向過程和面向對象編程兩種思想的對比:面向過程是具體的東西,而且面向過程是面向對象的基礎。比如開汽車去某個地方,你就需要先有個汽車而且你需要會開車,而汽車有開車,加減速和剎車等功能,關於汽車的操作每一個都需要一個具體的過程來實現總結來說就是,面向過程是一種基礎的方法,它考慮的是實際的實現。一般情況下,面向過程是自頂向下逐步求精,其最重要的是模塊化的思想方法。因此在模塊化編程的時候才會有「低耦合,高內聚」的思想來提高效率。
  • 如何給女朋友解釋什麼是面向對象編程?
    女朋友拿著一本《面向對象編程》過來找我。什麼是面向對象?是要面向我寫代碼嗎?不是啦,這個面向對象的對象不是你這個對象啦。此時,我突然感受到了一股莫名的殺氣。什麼?你還有其他對象嗎?有我好看嗎?有我瘦嗎?不對。你不能有其他對象。什麼是面向對象?面向對象,英文名字叫Object Oriented,是一種軟體開發方法。
  • Python面向對象編程的基本概念
    九道門商業數據分析學院提供介紹在學習面向對象的編程時。我決定深入了解它的歷史,結果令人著迷。術語「面向對象程序設計」(OOP)是艾倫·凱(Alan Kay)在1966年讀研究生時提出的。名為Simula的語言是第一種具有面向對象編程功能的程式語言。它是在1967年開發的,用於製作仿真程序,其中最重要的信息稱為對象。
  • 一句話概述面向對象思想,徹底理解面向對象編程
    面向對象是把一組數據結構和處理他們的方法組成對象,把具有相同行為的對象歸納成類,通過封裝隱藏類的內部細節,通過繼承使類得到泛化,通過多態實現基於對象類型的動態分派。之前在面試Java的時候遇到關於面向對象的問題,好久沒複習,概念都忘了,當時沒能回答完整。今天整理了一下,徹底搞懂了什麼叫面向對象,下面用通俗的話詳細講解面向對象的相關概念。
  • 面向對象編程會被拋棄嗎?這五大問題不容忽視
    儘管這個想法很巧妙,但直到 1981 年,面向對象編程才成為主流。在那之後,它就沒有停止過吸引新的和經驗豐富的軟體開發者。面向對象的程式設計師市場一如既往地忙碌。但是在最近幾年中,這種已有幾十年歷史的編程範式受到越來越多的批評。難道是在面向對象編程大行其道 40 年之後,技術已經超越了這種範式?
  • 面向對象編程從小白到王者系列-認識對象
    在學習面向對象程式語言時很多人都是被什麼是對象這個神一樣的概念給打敗的。被打敗後從此就開始過得渾渾噩噩了,聽課學習時都是迷迷糊糊地,開始變得像聽天書一樣,從而興趣一落千丈,慢慢被「程序猿」給淘汰。在所有的教材中或是教程中都是把一個很簡單對對象解釋搞得特別高大上。
  • 經典:面向對象編程,我的思想(上部)
    前言:整理這份資料的目的是為了幫助我的同學能夠更直觀的理解面向對象的編程。讓後來者能夠少走一些彎路。但其中不免有許多漏洞及錯誤,也還請前輩提出寶貴的更改意見,畢竟交流會讓我們不斷的進步。技術是日新月異的,他不會等待你的成長。技術要拿出來於別人交流,自己學是自己主觀意識上的理解,有對有錯!交流會讓進步變得更快。
  • 聊聊面向對象編程的幾個基本原則
    進行面向對象編程,有下面幾個原則:一. 面向抽象原則二. 開閉原則三. 多用組合少用繼承原則四. 高內聚-低耦合原則下面首先先介紹抽象類和接口,然後介紹面向抽象編程。watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFucGk0NjQ4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)面向抽象所謂面向抽象編程,是指當設計一個類時,不讓該類面向具體的類,而是面向抽象類或者接口,即所設計類中的重要數據是抽象類或接口聲明的變量
  • 圖說Java中的OOPs(面向對象編程系統)基本概念
    面向對象編程是一種編程概念,其核心思想是允許用戶創建所需要的對象,然後提供處理這些對象的方法,使用者通過操作對象而獲得運算數據。本文將以簡潔的方式對面向對象編程中的概念進行梳理。1. Class(類)你可以將類理解為對一組相似實體的統稱。
  • 什麼是面向對象,如何理解它?
    面向對象簡稱是OOP,是目前主流的編程思想,可能許多讀者並不了解,希望能通過下面的講解能讓大家了解什麼是面向對象。JavaScript本身也是面向對象的程式語言,對於動態網頁行為的編程,只要稍微對它有了解就可以的。
  • 什麼是面向對象,有什麼特點
    在程式語言中,面向對象的使用是非常重要的,在PHP語言中也是用了很多年才獲得這項技術。面向對象的出現是系統開發中一個偉大的改革,程式語言開始從應用程式回到數據上。面向對象將編程過程中焦點轉向建模的真是實體上,讓應用程式更加接近現實世界。下面小編為大家主要介紹面向對象。
  • 雲計算開發學習筆記:Python3 面向對象技術簡介
    來源:TechWeb.com.cnPython從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創建一個類和對象是很容易的。本章節我們將詳細介紹Python的面向對象編程。如果你以前沒有接觸過面向對象的程式語言,那你可能需要先了解一些面向對象語言的一些基本特徵,在頭腦裡頭形成一個基本的面向對象的概念,這樣有助於你更容易的學習Python的面向對象編程。接下來我們先來簡單的了解下面向對象的一些基本特徵。面向對象技術簡介① 類(Class): 用來描述具有相同的屬性和方法的對象的集合。
  • 面向對象編程從小白到王者系列-04編程裡神奇的變量
    我們在前面已經通過自己的動手來搞定了一個個關卡,現在我們遇到的是編程當中一個讓人難以理解的知識點變量。變量這個名詞一下子聽到以後可能不太容易理解,那接下來我們就一起理解一下。我們來看一下C#程式語言中的數據類型都有哪些?在 C# 中,變量分為以下幾種類型:這個知識我在學習C#必須掌握的那些關鍵字,新手必看中已經給大家介紹過一次了值類型(Value types)引用類型(Reference types)指針類型(Pointer types)值類型(Value types)值類型變量可以直接分配給一個值。
  • 新書速遞:周立功教授心血新力作《面向AMetal框架與接口的編程(上)》
    本文引用地址:http://www.eepw.com.cn/article/201708/363264.htm  在致遠電子公眾號後臺回復關鍵字【編程】可在線閱讀。  由於 AWorks 制定了統一的接口規範,並對各種微處理器內置的功能部件與外圍器件進行了高度的抽象,因此無論你選用的是 ARM 還是 DSP,通過「按需定製」的外設驅動軟體和相關組件,以高度復用的軟體設計原則和只針對接口編程的思想為前提,則應用軟體均可實現「一次編程、終生使用和跨平臺」。
  • 嘿,你對象在這兒——Java 面向對象編程:類和對象
    等到我們學面向對象的時候不得不去了解一下什麼是類,什麼是對象,他倆是啥關係。關於面向對象,網上那個寫得很好的例子已經被我抄到C語言與Java的區別那篇了,感興趣的小夥伴可以點左上角的菜單去查看。那麼類和對象到底是什麼呢?類就是有某些共同特徵的實體的集合;對象就是類的實例,一個對象當然就是一個類的實例。
  • 如何以面向對象的思想設計有限狀態機
    這個時候就需要以面向對象的思想來設計有限狀態機。面向對象法設計狀態機面向對象基本概念以面向對象的思想實現的狀態機,大量涉及了對於函數指針的用法,必須對這個概念比較熟悉上述所提到了兩個設計方法都是基於面向過程的一種設計思想,面向過程編程(POP)是一種以過程為中心的編程思想,以正在發生的事件為主要目標,指導開發者利用算法作為基本構建塊構建複雜系統。
  • Objeck v5.6.1 發布,面向對象程序設計語言
    Objeck 是一種受 Java 啟發,同時受 Scheme 和 UML 影響的面向對象程序設計語言。Objeck 特性為快速,易於使用,輕巧且跨平臺。Objeck 把所有的數據類型都當成是對象,包含一個編譯器和虛擬機,具有內存管理和 JIT 編譯器。
  • 「c 技術」第7章 面向對象的程序設計
    本章要點: 面向對象的基本概念 類的定義與對象的聲明 構造函數和析構函數 類的靜態成員和實例成員 方法重載及運算符重載的編程實現 類的繼承與多態性的編程實現 類的屬性的實現7.1 循序漸進學理論7.1.1 面向對象程序設計概述1.面向對象程序設計的由來
  • 如果程式語言是12星座妹子
    如果把這些特質都分門別類 ,那麼12星座的妹紙可以代表哪一種程式語言呢?perl語言需要不斷更新「編程範式」,給出最佳的解決算法而和金牛妹相處,也是需要不斷滴去呵護她滿足她~她的雙面性讓人著迷,既可以面向對象,又可以面向過程。
  • 假如女人是一種程式語言 - OSCHINA - 中文開源技術交流社區
    假如女人是一種程式語言,也許每個男人心中都有自己最喜歡的那一個吧?我認為女人可分兩類,「面向過程」和「面向對象」。「面向對象」的女人以尋找終身伴侶為目標,而「面向過程」的,則以經歷難以忘懷的愛情時光為己任。各位程序猿當然也要按需選擇最適合自己的「程式語言」,不要因為時髦而盲目追求「面向對象「,有時候過程可能比結果更重要。