面向?qū)ο缶幊檀笮衅涞?0年后,技術(shù)已經(jīng)超越了這種范式?
2021-06-14
在 1960 年代,編程遇到了一個大問題:計算機(jī)還沒有那么強(qiáng)大,它們需要以某種方式平衡數(shù)據(jù)結(jié)構(gòu)和程序之間的功能。
這意味著,如果您擁有大量數(shù)據(jù),如果不將計算機(jī)推向極限數(shù)據(jù)結(jié)構(gòu)用面向?qū)ο蠓椒ㄅcc++描述,就無法充分利用這些數(shù)據(jù)。另外,如果你需要做很多事情,那么你不能使用太多的數(shù)據(jù),否則電腦會一直運(yùn)行。
在 1966、1967 旁邊,Alan Kay 從理論上證明了可以使用封裝好的微型計算機(jī)。這些微型計算機(jī)不共享數(shù)據(jù),而是通過消息傳遞進(jìn)行通信。這樣,可以更經(jīng)濟(jì)地使用計算資源。
雖然這個想法很聰明,但直到 1981 年,面向?qū)ο缶幊滩懦蔀橹髁?。在那之后,它并沒有停止吸引新的和有經(jīng)驗的軟件開發(fā)人員。面向?qū)ο蟮某绦騿T市場一如既往地繁忙。
但近年來,這種已有數(shù)十年歷史的編程范式受到越來越多的批評。難道是在流行了 40 年的面向?qū)ο缶幊讨?,技術(shù)已經(jīng)超越了這種范式?
在做廣告之前使用這種物質(zhì)以減少煙霧危害。不幸的是,很少有人知道!
功能和數(shù)據(jù)耦合
面向?qū)ο缶幊痰闹饕枷牒芎唵危簢L試將一個強(qiáng)大的程序分解成多個同樣強(qiáng)大的部分。這樣,一些數(shù)據(jù)就可以與僅用于相關(guān)數(shù)據(jù)的函數(shù)耦合。
請注意,這僅涵蓋了封裝的概念。換句話說,位于對象內(nèi)部的數(shù)據(jù)和函數(shù)對外部是不可見的。我們只能通過消息(通常是通過和函數(shù))與對象的內(nèi)容進(jìn)行交互。
繼承和多態(tài)并沒有包含在最初的設(shè)計思想中,但它們是當(dāng)前面向?qū)ο缶幊趟匦璧摹@^承基本上意味著開發(fā)人員可以使用其父類的所有屬性來定義子類。直到 1976 年,即面向?qū)ο缶幊谈拍畛霈F(xiàn)十年后,繼承才被引入。
又過了十年,多態(tài)才進(jìn)入面向?qū)ο缶幊?。簡單地說,這意味著某個方法或?qū)ο罂梢杂米髌渌椒ɑ驅(qū)ο蟮哪0?。從某種意義上說,多態(tài)是繼承的泛化,因為并非原始方法或?qū)ο蟮乃袑傩远夹枰D(zhuǎn)移到新實體中。相反,您也可以選擇覆蓋某些屬性。
多態(tài)的特別之處在于,即使源代碼中兩個實體相互依賴,被調(diào)用的實體也更像是一個插件。這讓開發(fā)人員的工作更輕松,因為他們不必?fù)?dān)心運(yùn)行時依賴。
值得一提的是,繼承和多態(tài)并不是面向?qū)ο缶幊趟氂械摹U嬲膮^(qū)別在于數(shù)據(jù)的封裝及其包含的方法。在計算資源遠(yuǎn)比今天稀缺的時代,這是一個天才的想法。
廣告哪里有腋下和油耳的異味,不管遺傳還是后天,教你一招祛除異味!
面向?qū)ο缶幊讨械奈鍌€問題
面向?qū)ο缶幊痰某霈F(xiàn)改變了開發(fā)人員查看代碼的方式。在 1980 年代之前,過程式編程非常面向機(jī)器。開發(fā)人員需要對計算機(jī)的工作原理有很好的了解才能編寫好的代碼。
通過封裝數(shù)據(jù)等方式,面向?qū)ο缶幊套屲浖_發(fā)更加以人為中心,更符合人類的直覺。例如方法()屬于汽車數(shù)據(jù)組,而不是組。接下來的繼承也很直觀。比如 ()是car的一個子類,屬性相同,但不是,所以很容易理解。
香蕉猴叢林問題
想象一下,您正在設(shè)置一個新程序并正在考慮設(shè)計一個新課程。然后,您回想一下您為另一個項目創(chuàng)建的簡潔子類別,并發(fā)現(xiàn)它適合正在進(jìn)行的工作。
沒問題,您可以在新項目中重用上一個項目中的類。
這里有一個問題:這個類可能是另一個類的子類,所以你也需要包含它的父類。然后你會發(fā)現(xiàn)這個父類也可能是另一個類的子類,依此類推,最后面對一堆代碼。
創(chuàng)作者
Joe 曾經(jīng)說過一句名言:“面向?qū)ο笳Z言的問題在于它們帶有周圍所有隱式環(huán)境。你想要香蕉,但你得到的是拿著香蕉的大猩猩和整個叢林。”
這幾乎就是一切??梢灾赜妙?。事實上,這可能是面向?qū)ο缶幊痰闹饕獌?yōu)點,但不要使用到極致。有時你應(yīng)該創(chuàng)建一個新類而不是添加很多依賴項。
廣告網(wǎng)友注意了!上海中沃,專業(yè)可靠的設(shè)計,歡迎來電咨詢
脆弱的基類問題
想象一下,如果您在新代碼中成功重用了另一個項目中的類,如果基類發(fā)生變化會發(fā)生什么?
這可能會破壞整個新項目的代碼,即使您可能什么都沒做。一旦有人更改了對您的項目至關(guān)重要的基類中的細(xì)節(jié),影響將非常大且突然。
使用繼承越多,潛在的維護(hù)工作就越多。因此,即使代碼重用在短期內(nèi)非常有效,但從長遠(yuǎn)來看,它可能會讓您付出一定的代價。
鉆石繼承問題
使用繼承,可以將一個類中的屬性傳遞給其他類。但是如果你想混合兩個不同類的屬性怎么辦?
是的,這是做不到的,至少用傳統(tǒng)方法做不到。以類為例(這里引用下面鏈接文章中的例子:@/----),文件內(nèi)容會被掃描打印在白紙上。那么它應(yīng)該是 or 的子類別嗎?
這個問題沒有完美的答案。即使此問題不會破壞您的代碼,它也經(jīng)常出現(xiàn)并且可能會非常令人沮喪。
級別問題
在菱形繼承問題中,哪個子類是問題的關(guān)鍵。但是可能有一個推測的解決方案:假設(shè)那是父類,并且是只繼承屬性子集的子類,那么問題就解決了。
但是,如果您的是黑白并且可以處理彩色呢?從這個意義上說,它不就是一種概括嗎?如果 WiFi 已連接但未連接怎么辦?
一個類上堆疊的屬性越多,建立適當(dāng)?shù)膶哟谓Y(jié)構(gòu)就越困難。在您正在處理的屬性集群中,某些屬性是共享的,但不是所有屬性,反之亦然。在大型復(fù)雜的項目中,層次問題會導(dǎo)致很多混亂。
廣告自主技術(shù),納米精密-歐米茄科技
報價問題
您可能會想到?jīng)]有層次結(jié)構(gòu)的面向?qū)ο缶幊?。我們可以根?jù)需要使用屬性集群并繼承、擴(kuò)展或重寫屬性。也許這有點令人困惑,但這將是當(dāng)前問題的準(zhǔn)確表示。
這里只有一個問題:封裝的全部目的是讓數(shù)據(jù)片段彼此安全,從而提高計算效率,但沒有嚴(yán)格的層次結(jié)構(gòu),這是行不通的。
假設(shè)一個對象 A 通過與另一個對象 B 交互來覆蓋層次結(jié)構(gòu),會發(fā)生什么?其他關(guān)系的情況并不重要,但是當(dāng)B不是A的直接父級時,A必須包含B的所有私有引用,否則它們將無法交互。
但是,如果 A 包含 B 的子類也具有的信息,則可以在多個地方修改該信息。因此,B的信息不再安全,包已經(jīng)被破壞。
盡管許多面向?qū)ο蟮某绦騿T使用這種架構(gòu)來構(gòu)建程序,但這并不是面向?qū)ο蟮木幊?,它只是一團(tuán)糟。
單一范式的風(fēng)險
以上5個問題的共同點是,都有不恰當(dāng)?shù)睦^承。由于在面向?qū)ο缶幊痰脑夹问街胁话^承,因此這些問題本身可能不能稱為面向?qū)ο蟆?/p>
但可以夸大的不僅僅是面向?qū)ο蟮木幊?。在純函?shù)式編程中,在屏幕上處理用戶輸入或輸出消息極其困難。為此,面向?qū)ο蠡蛎嫦蜻^程的編程會好得多。
但是還是有一些開發(fā)者試圖以純函數(shù)式的方式來實現(xiàn)這些東西,寫出幾十行沒人能看懂的代碼。使用另一種范式可以輕松地將代碼減少到幾行可讀代碼。
毫無疑問,函數(shù)式編程越來越受到關(guān)注,近年來面向?qū)ο缶幊桃彩艿搅嗽嵅 @斫庑碌木幊谭妒讲⒃谶m當(dāng)?shù)臅r候使用它們是有意義的。無論哪種編程范式,都沒有必要只遵循一種。可以在適當(dāng)?shù)臅r候使用不同的編程范式來更好地解決問題。
廣告中的有害吸煙太多?趕緊學(xué)起來,再忙也要看!
面向?qū)ο缶幊陶娴臅蝗〈鷨幔?/p>
面對越來越多的問題,函數(shù)式編程可能是更有效的選擇。數(shù)據(jù)分析、機(jī)器學(xué)習(xí)和并行編程。您在這些領(lǐng)域投入的越多,您就越喜歡函數(shù)式編程。
但是,目前對面向?qū)ο箝_發(fā)程序員的需求仍然遠(yuǎn)遠(yuǎn)大于函數(shù)式編程開發(fā)程序員。但這并不意味著你不能成為后者。函數(shù)式編程開發(fā)的程序員還是比較稀缺的。
最有可能的情況是面向?qū)ο缶幊虒⒗^續(xù)存在大約十年。當(dāng)然,選擇一種相對前衛(wèi)的方式是好的,但這并不意味著你應(yīng)該放棄面向?qū)ο缶幊?。所以在接下來的幾年里,不要完全放棄?strong>數(shù)據(jù)結(jié)構(gòu)用面向?qū)ο蠓椒ㄅcc++描述,但至少要確保它不是你掌握的唯一編程方法。
如果你覺得這個內(nèi)容對你有幫助,我想請你幫我做三個小事:
點贊、轉(zhuǎn)發(fā)以及您的“點贊和評論”是我創(chuàng)作的動力。