91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你是使用函數(shù)式編程還是面向?qū)ο缶幊谭绞剑?/h1>

作為程序員,你是使用函數(shù)式編程還是面向?qū)ο缶幊谭绞剑?br />
在本文中,擁有 10 多年軟件開發(fā)經(jīng)驗(yàn)的作者從面向?qū)ο缶幊痰娜筇匦浴^承、封裝、多態(tài)三大角度提出了自己的疑問,并深刻表示是時(shí)候和面向?qū)ο缶幊陶f再見了。

幾十年來我都在用面向?qū)ο蟮恼Z言編程。我用過的第一個(gè)面向?qū)ο蟮恼Z言是 C++,后來是 Smalltalk,最后是 .NET 和 Java。 我曾經(jīng)對(duì)使用繼承、封裝和多態(tài)充滿熱情。它們是范式的三大支柱。 我渴望實(shí)現(xiàn)重用之美,并在這個(gè)令人興奮的新天地中享受前輩們積累的智慧。 想到將現(xiàn)實(shí)世界的一切映射到類中,使得整個(gè)世界都可以得到整齊的規(guī)劃,我無法抑制自己的興奮。 然而我大錯(cuò)特錯(cuò)了。
01繼承,倒塌的第一根支柱 乍一看,繼承似乎是面向?qū)ο蠓妒降淖畲髢?yōu)勢(shì)。所有新手教程講解繼承時(shí)都會(huì)拿出最簡(jiǎn)單的繼承的例子,而這個(gè)例子似乎很符合邏輯。

然后就是滿篇的重用了。甚至以后的一切都是重用了。 我囫圇吞下這一切,然后帶著新發(fā)現(xiàn)興沖沖地奔向世界了。香蕉猴子叢林問題帶著滿腔的信仰和解決問題的熱情,我開始構(gòu)建類的層次結(jié)構(gòu)然后寫代碼。似乎一切皆在掌控中。 我永遠(yuǎn)不會(huì)忘記我準(zhǔn)備從已有的類繼承并實(shí)現(xiàn)重用的那一天。那是我期待已久的時(shí)刻。 后來有了新的項(xiàng)目,我想起了另一個(gè)項(xiàng)目里我很喜歡的那個(gè)類。 沒問題,重用拯救一切。我只需要把那個(gè)類拿過來用就好了。 嗯……其實(shí)……不僅是那一個(gè)類。還得把父類也拿過來。但……應(yīng)該就可以了吧。 額……不對(duì),似乎還需要父類的父類……還有……嗯,我們需要所有的祖先類。好吧好吧……搞定了。沒問題。 不錯(cuò)。但編譯不過,怎么回事?哦我知道了……這個(gè)對(duì)象還需要另一個(gè)對(duì)象。所以那個(gè)也得拿過來。沒問題…… 等等……我不僅需要那個(gè)對(duì)象,還需要那個(gè)對(duì)象的父類,和父類的父類,和……包含的所有對(duì)象的所有祖先…… 唉…… Erlang 的創(chuàng)建者 JoeArmstrong 有句名言:

面向?qū)ο笳Z言的問題在于,它們依賴于特定的環(huán)境。你想要個(gè)香蕉,但拿到的卻是拿著香蕉的猩猩,乃至最后你擁有了整片叢林。

香蕉猴子叢林的解決方法這個(gè)問題的解決方法是,不要把類層次建得那么深。但如果繼承是重用的關(guān)鍵,那么給繼承機(jī)制添加的任何限制都會(huì)限制重用。對(duì)吧? 沒錯(cuò)。 那我們可憐的面向?qū)ο蟪绦騿T該怎么辦?指望一杯三聚氰胺奶維系我們的健康嗎? 答案就是:包含和委托(Contain and Delegate)。一會(huì)兒會(huì)詳細(xì)解釋。菱形繼承問題早晚你會(huì)遇到下面這種惡心的問題,有些語言甚至根本解決不了。

大多數(shù)面向?qū)ο笳Z言都不支持這種情況,盡管看上去似乎很符合邏輯。為什么面向?qū)ο笳Z言支持這種情況如此困難? 來看看下面的偽代碼:

ClassPoweredDevice{ } ClassScannerinheritsfromPoweredDevice{ functionstart(){ } } ClassPrinterinheritsfromPoweredDevice{ functionstart(){ } } ClassCopierinheritsfromScanner,Printer{ } 注意 Scanner 和 Printer 類都實(shí)現(xiàn)了名為 start 方法。 那么問題來了,Copier繼承哪個(gè)start?是Scanner的還是Printer的?肯定不可能同時(shí)繼承啊。菱形繼承的解決解決方案很簡(jiǎn)單:不要這樣做。 沒錯(cuò)。大多數(shù)面向?qū)ο蠖疾蛔屇氵@么干。 但是,但是……要是必須這樣建模該怎么辦?我需要重用! 那就必須使用包含和委托。ClassPoweredDevice{ } ClassScannerinheritsfromPoweredDevice{ functionstart(){ } } ClassPrinterinheritsfromPoweredDevice{ functionstart(){ } } ClassCopier{ Scannerscanner Printerprinter functionstart(){ printer.start() } } 注意現(xiàn)在 Copier 類包含一個(gè) Printer 實(shí)例和一個(gè) Scanner 實(shí)例。然后將 start 函數(shù)委托給 Printer 類的實(shí)現(xiàn)。要委托給 Scanner 也很簡(jiǎn)單。 這個(gè)問題是繼承這根支柱上的另一條裂縫。脆弱的基類問題好吧,那我盡量使用較淺的類層次結(jié)構(gòu),并保證里面沒有環(huán),這樣就不會(huì)出現(xiàn)菱形繼承了。 似乎一切都解決了。直到我們發(fā)現(xiàn)…… 我前一天工作得好好的代碼今天出錯(cuò)了!關(guān)鍵是,我沒有改任何代碼! 嗯也許是個(gè) bug……但等等……的確有些改動(dòng)…… 但改動(dòng)的不是我的代碼。似乎改動(dòng)來自我繼承的那個(gè)類。 為什么基類的改動(dòng)會(huì)破壞我的代碼? 原來是這樣…… 看看下面這個(gè)基類(用Java寫的,但就算你不懂Java,應(yīng)該也很容易看懂):importjava.util.ArrayList; publicclassArray { privateArrayLista=newArrayList(); publicvoidadd(Objectelement) { a.add(element); } publicvoidaddAll(Objectelements[]) { for(inti=0;i
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 封裝
    +關(guān)注

    關(guān)注

    128

    文章

    9249

    瀏覽量

    148615
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3716

    瀏覽量

    97185
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2124

    瀏覽量

    77112

原文標(biāo)題:面向?qū)ο缶幊蹋僖姡?/p>

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入開發(fā)常用函數(shù)速查表

    在嵌入開發(fā)中,掌握常用函數(shù)的用法可以大大提高開發(fā)效率。無論是單片機(jī)初學(xué)者還是有一定經(jīng)驗(yàn)的工程師,熟悉函數(shù)庫和調(diào)用方式都是必備技能。今天,我
    的頭像 發(fā)表于 01-19 09:06 ?303次閱讀
    嵌入<b class='flag-5'>式</b>開發(fā)常用<b class='flag-5'>函數(shù)</b>速查表

    C語言嵌入系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作

    啟動(dòng)后第一條要執(zhí)行的指令的位置。 記住:函數(shù)無它,唯指令集合耳;可以調(diào)用一個(gè)沒有函數(shù)體的函數(shù),本質(zhì)上只是換一個(gè)地址開始執(zhí)行指令! 數(shù)組vs動(dòng)態(tài)申請(qǐng) 在嵌入
    發(fā)表于 01-04 07:31

    C語言與C++的區(qū)別及聯(lián)系

    class等面向對(duì)象的特性和機(jī)制。但是,后來經(jīng)過一步步修訂和很多次演變,最終才形成了現(xiàn)如今這個(gè)支持一系列重大特性的龐大編程語言。 一、C語言是面向過程語言,而C++是
    發(fā)表于 12-24 07:23

    C語言和C++之間的區(qū)別是什么

    區(qū)別 1、面向對(duì)象編程 (OOP): C語言是一種面向過程的語言,它強(qiáng)調(diào)的是通過函數(shù)將任務(wù)分解為一系列步驟進(jìn)行執(zhí)行。 C++在C語言的基礎(chǔ)
    發(fā)表于 12-11 06:23

    單片機(jī)C語言編程的心得

    寫這個(gè)8*8按鍵程序的過程中,不管是在自己寫還是參考別人程序的過程中,發(fā)現(xiàn)自己對(duì)C語言有些基本知識(shí)點(diǎn)和編程規(guī)范有很多不懂的地方,有些是自己以前的編程習(xí)慣不好,有些就是基礎(chǔ)知識(shí)不扎實(shí)的表現(xiàn),所以總結(jié)
    發(fā)表于 12-08 07:44

    一個(gè)面向單片機(jī)、事件驅(qū)動(dòng)的嵌入開發(fā)平臺(tái)介紹

    EventOS,是一個(gè)面向單片機(jī)、事件驅(qū)動(dòng)的嵌入開發(fā)平臺(tái)。它主要有兩大技術(shù)特色:一是事件驅(qū)動(dòng),二是超輕量。EventOS以及其母項(xiàng)目EventOS,目標(biāo)是開發(fā)一個(gè)企業(yè)級(jí)的嵌入開發(fā)平臺(tái),以事件總線
    發(fā)表于 12-05 06:26

    C語言的編程技巧

    、_Alignas關(guān)鍵字?:C11標(biāo)準(zhǔn)引入了_Alignas關(guān)鍵字,用于顯指定類型的對(duì)齊方式,優(yōu)化內(nèi)存訪問效率。 ?5、_Generic關(guān)鍵字?:C11引入的_Generic關(guān)鍵字用于條件編譯時(shí)的類型檢查,提高
    發(fā)表于 11-27 06:46

    2025年最佳的嵌入編程語言有哪些呢?

    嵌入系統(tǒng)是現(xiàn)代科技不可或缺的一部分。它們存在于家用電器、汽車、住宅、醫(yī)院、商店等各個(gè)領(lǐng)域。它們與我們的社會(huì)緊密相連。選擇合適的語言來構(gòu)建嵌入系統(tǒng)對(duì)于成功至關(guān)重要。那么,2025年最佳的嵌入
    的頭像 發(fā)表于 11-14 10:27 ?1415次閱讀
    2025年最佳的嵌入<b class='flag-5'>式</b><b class='flag-5'>編程</b>語言有哪些呢?

    C語言中的內(nèi)聯(lián)函數(shù)與宏

    在C編程中,內(nèi)聯(lián)函數(shù)和宏都用于避免函數(shù)調(diào)用的開銷并編寫可復(fù)用的邏輯部分,但它們?cè)诠ぷ?b class='flag-5'>方式和安全性方面存在顯著差異。
    的頭像 發(fā)表于 07-25 15:10 ?1909次閱讀
    C語言中的內(nèi)聯(lián)<b class='flag-5'>函數(shù)</b>與宏

    深入理解C語言:函數(shù)編程中的“積木塊”藝術(shù)

    編程的世界里,函數(shù)就像建筑中的“積木塊”——它們是構(gòu)建復(fù)雜程序的基石。通過靈活組合這些模塊,開發(fā)者能打造出功能強(qiáng)大且結(jié)構(gòu)清晰的代碼。函數(shù)之所以成為C語言的核心,正是因?yàn)樗鉀Q了編程
    的頭像 發(fā)表于 06-30 17:26 ?1860次閱讀
    深入理解C語言:<b class='flag-5'>函數(shù)</b>—<b class='flag-5'>編程</b>中的“積木塊”藝術(shù)

    求助,關(guān)于以編程方式配置DiplayPort MODES UFP_D引腳配置響應(yīng)的疑問求解

    我想這個(gè)問題以前可能有人問過,但現(xiàn)在還是要問: 在 Host SDK 3.5(或更高版本)中,有什么最佳方法可以以編程方式覆蓋 DP SINK / UFP 底座的 DisplayPort MODES
    發(fā)表于 05-21 07:28

    完整版—單片機(jī)編程思想(推薦下載!)

    出數(shù)據(jù)驅(qū)動(dòng)、并行多任務(wù)、面向對(duì)象等重要編程思想。這些思想既可獨(dú)立運(yùn)用,又可有機(jī)結(jié)合成一個(gè)體系,是我們實(shí)踐中解決問題的致勝法寶。本書以實(shí)例為基礎(chǔ),分6章對(duì)這一思想體系進(jìn)行了闡述。闡述通常以提出問題開始
    發(fā)表于 04-16 15:06

    嵌入編程設(shè)計(jì)模式

    嵌入編程設(shè)計(jì)模式,介紹如何使用設(shè)計(jì)模式為嵌入系統(tǒng)創(chuàng)建高效且優(yōu)化的C語言設(shè)計(jì)。 純分享貼,有需要可以直接下載附件獲取完整資料! (如果內(nèi)容有幫助可以關(guān)注、點(diǎn)贊、評(píng)論支持一下哦~)
    發(fā)表于 04-15 14:47

    學(xué)硬件好還是學(xué)軟件好?

    學(xué)硬件好還是學(xué)軟件好? 選擇學(xué)習(xí)硬件還是軟件取決于個(gè)人興趣、職業(yè)目標(biāo)以及對(duì)不同工作方式的偏好。以下是兩者的一些比較,幫助你做出更合適的選擇。 學(xué)習(xí)硬件可以讓深入了解計(jì)算機(jī)和電子設(shè)備的
    發(fā)表于 04-07 15:27

    STM32的幾種開發(fā)方式,都知道嗎?(可下載)

    經(jīng)常有人會(huì)問,你們 STM32 編程是用庫函數(shù) 還是用寄存器的...會(huì)說庫函數(shù)方便,容 易,都用庫函數(shù)...等等這樣的問題,今天我們就來 d
    發(fā)表于 04-03 11:24 ?0次下載