精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面向?qū)ο缶幊淌怯?jì)算機(jī)科學(xué)的最大錯(cuò)誤

開(kāi)發(fā) 前端
C ++和Java可能是計(jì)算機(jī)科學(xué)中最嚴(yán)重的錯(cuò)誤。OOP的創(chuàng)建者艾倫·凱(Alan Kay)和許多其他著名的計(jì)算機(jī)科學(xué)家都對(duì)兩者都提出了嚴(yán)厲的批評(píng)。然而,C ++和Java為最臭名昭著的編程范例-現(xiàn)代OOP鋪平了道路。

C ++和Java可能是計(jì)算機(jī)科學(xué)中最嚴(yán)重的錯(cuò)誤。OOP的創(chuàng)建者艾倫·凱(Alan Kay)和許多其他著名的計(jì)算機(jī)科學(xué)家都對(duì)兩者都提出了嚴(yán)厲的批評(píng)。然而,C ++和Java為最臭名昭著的編程范例-現(xiàn)代OOP鋪平了道路。

它的普及是非常不幸的,它對(duì)現(xiàn)代經(jīng)濟(jì)造成了巨大破壞,造成了數(shù)萬(wàn)億美元的間接損失。OOP導(dǎo)致數(shù)千人喪生。在過(guò)去的三十年中,沒(méi)有任何一個(gè)行業(yè)因潛在的OO危機(jī)而受到影響。

為什么OOP如此危險(xiǎn)?讓我們找出答案。

[[376179]]

想象一下,帶您的家人在一個(gè)美麗的星期天下午乘車(chē)兜風(fēng)。外面很好,陽(yáng)光明媚。所有人都進(jìn)入了汽車(chē),行駛了與上百萬(wàn)次完全相同的高速公路。

但是這次卻有所不同–即使您放開(kāi)油門(mén)踏板,汽車(chē)仍會(huì)繼續(xù)不受控制地加速行駛。剎車(chē)也不起作用,似乎它們失去了動(dòng)力。為了挽救局勢(shì),您緊急拉了緊急制動(dòng)器。在您的汽車(chē)撞到路邊的路堤之前,這會(huì)在道路上留下150英尺長(zhǎng)的防滑痕跡。

聽(tīng)起來(lái)像一場(chǎng)噩夢(mèng)?但這正是2007年9月讓·布克特(Jean Bookout)駕駛豐田凱美瑞(Camry)時(shí)發(fā)生的事情。這不是唯一的此類(lèi)事件。這是與所謂的"意外加速"有關(guān)的眾多事件之一,該事件困擾了豐田汽車(chē)十多年,造成近100人死亡。汽車(chē)制造商很快就將手指對(duì)準(zhǔn)了"粘性踏板",駕駛員失誤甚至地板墊。但是,一些專(zhuān)家長(zhǎng)期以來(lái)一直懷疑有問(wèn)題的軟件可能正在發(fā)揮作用。

為了解決這個(gè)問(wèn)題,美國(guó)宇航局的軟件專(zhuān)家已被征召入伍,一無(wú)所獲。僅僅幾年后,在對(duì)Bookout事件進(jìn)行調(diào)查的過(guò)程中,真正的罪魁禍?zhǔn)资怯闪硪粋€(gè)軟件專(zhuān)家團(tuán)隊(duì)發(fā)現(xiàn)的。他們花了將近18個(gè)月的時(shí)間來(lái)研究豐田代碼。他們將Toyota代碼庫(kù)描述為"意大利面條代碼",這是一種用于纏結(jié)代碼的程序員術(shù)語(yǔ)。

軟件專(zhuān)家已經(jīng)演示了超過(guò)1000萬(wàn)種豐田軟件導(dǎo)致意外加速的方法。最終,豐田被迫召回了超過(guò)900萬(wàn)輛汽車(chē),并支付了超過(guò)30億美元的和解費(fèi)和罰款。

[[376180]]

意大利面條代碼有問(wèn)題嗎?

某些軟件故障造成的100條生命是太多了。真正令人恐懼的是,豐田代碼的問(wèn)題不是唯一的。

兩架波音737 Max飛機(jī)墜毀,造成346人死亡,損失超過(guò)600億美元。都是由于軟件錯(cuò)誤,由意大利細(xì)面條代碼引起的100%的確定性。

在全球范圍內(nèi),意大利面條式代碼困擾著太多的代碼庫(kù)。機(jī)載計(jì)算機(jī),醫(yī)療設(shè)備,在核電站上運(yùn)行的代碼。

程序代碼不是為機(jī)器編寫(xiě)的,而是為人類(lèi)編寫(xiě)的。正如馬丁·福勒(Martin Fowler)所說(shuō):"任何傻瓜都可以編寫(xiě)計(jì)算機(jī)可以理解的代碼。好的程序員編寫(xiě)人類(lèi)可以理解的代碼。"

如果代碼沒(méi)有運(yùn)行,則說(shuō)明它已損壞。但是,如果人們不理解該代碼,那么它將被破壞。不久。

讓我們快速繞道,談?wù)撊说拇竽X。人腦是世界上最強(qiáng)大的機(jī)器。但是,它有其自身的局限性。我們的工作記憶是有限的,人腦一次只能思考5件事。這意味著,程序代碼的編寫(xiě)方式不應(yīng)使人的大腦不知所措。

意大利面條代碼使人腦無(wú)法理解代碼庫(kù)。這產(chǎn)生了深遠(yuǎn)的影響-無(wú)法看到某些變化是否會(huì)破壞其他東西。對(duì)缺陷進(jìn)行詳盡的測(cè)試變得不可能。沒(méi)有人甚至不能確定這樣的系統(tǒng)是否正常工作。如果確實(shí)有效,那為什么還要有效呢?

是什么導(dǎo)致意大利面條代碼?

為什么隨著時(shí)間的流逝,代碼變成意大利面條式代碼?由于熵-宇宙中的一切最終變得混亂無(wú)序,混亂。就像電纜最終將變得混亂一樣,我們的代碼最終也將變得混亂不堪。除非有足夠的約束。

為什么我們?cè)诘缆飞嫌兴俣认拗?是的,有些人會(huì)永遠(yuǎn)恨他們,但它們可以防止我們墜毀甚至死亡。為什么在路上有標(biāo)記?為了防止人們走錯(cuò)路,防止事故發(fā)生。

在編程時(shí),類(lèi)似的方法將完全有意義。這樣的約束不應(yīng)留給程序員來(lái)擺放。它們應(yīng)該通過(guò)工具自動(dòng)實(shí)現(xiàn),或者理想情況下通過(guò)編程范例本身來(lái)實(shí)現(xiàn)。

為什么OOP是萬(wàn)惡之源?

[[376181]]

> Photo by NeONBRAND on Unsplash

我們?nèi)绾螆?zhí)行足夠的約束來(lái)防止代碼變成意大利面條?兩個(gè)選項(xiàng)-手動(dòng)或自動(dòng)。手動(dòng)方法容易出錯(cuò),人類(lèi)總是會(huì)犯錯(cuò)誤。因此,自動(dòng)執(zhí)行此類(lèi)約束是合乎邏輯的。

不幸的是,OOP并不是我們一直在尋找的解決方案。它沒(méi)有提供任何約束來(lái)幫助解決代碼糾纏問(wèn)題。一個(gè)人可以精通各種OOP最佳實(shí)踐,例如依賴(lài)注入,測(cè)試驅(qū)動(dòng)的開(kāi)發(fā),域驅(qū)動(dòng)的設(shè)計(jì)等(確實(shí)有幫助)。但是,這些都不是由編程范例本身來(lái)強(qiáng)制執(zhí)行的(并且不存在可以強(qiáng)制執(zhí)行最佳實(shí)踐的此類(lèi)工具)。

內(nèi)置的OOP功能都無(wú)法幫助防止意大利面條式代碼-封裝只是在程序中隱藏和分散狀態(tài),這只會(huì)使情況變得更糟。繼承增加了更多的混亂。OOP多態(tài)性再次使事情變得更加混亂-不知道程序在運(yùn)行時(shí)將采用哪種確切的執(zhí)行路徑?jīng)]有任何好處。特別是在涉及多個(gè)繼承級(jí)別時(shí)。

OOP進(jìn)一步加劇了意粉代碼問(wèn)題

缺乏適當(dāng)?shù)募s束(以防止代碼變得混亂)不是OOP的唯一缺點(diǎn)。

在大多數(shù)面向?qū)ο蟮恼Z(yǔ)言中,默認(rèn)情況下所有內(nèi)容都是通過(guò)引用共享的。有效地將一個(gè)程序變成一個(gè)龐大的全球狀態(tài)。這與OOP的原始思想直接沖突。OOP的創(chuàng)建者Alan Kay具有生物學(xué)背景。他想到了一種語(yǔ)言(Simula),可以用類(lèi)似于生物細(xì)胞的方式編寫(xiě)計(jì)算機(jī)程序。他希望有獨(dú)立的程序(單元)通過(guò)相互發(fā)送消息進(jìn)行通信。獨(dú)立程序的狀態(tài)永遠(yuǎn)不會(huì)與外界共享(封裝)。

艾倫·凱(Alan Kay)從未打算讓"細(xì)胞"直接進(jìn)入其他細(xì)胞的內(nèi)部進(jìn)行更改。但這正是現(xiàn)代OOP中發(fā)生的事情,因?yàn)樵诂F(xiàn)代OOP中,默認(rèn)情況下,所有內(nèi)容都是通過(guò)引用共享的。這也意味著回歸成為必然。更改程序的一部分通常會(huì)破壞其他地方的功能(這在其他編程范例(如功能編程)中很少見(jiàn))。

我們可以清楚地看到,現(xiàn)代OOP從根本上來(lái)說(shuō)是有缺陷的。每天都會(huì)在工作中折磨您的"怪物"。而且它也會(huì)在晚上困擾您。

讓我們談?wù)効深A(yù)測(cè)性

[[376182]]

> Photo by samsommer on Unsplash

意大利面條代碼是個(gè)大問(wèn)題。面向?qū)ο蟮拇a特別容易意大利化。

意大利面條代碼使軟件無(wú)法維護(hù)。但這只是問(wèn)題的一部分。我們還希望軟件可靠。但是,這還不夠,軟件(或與此相關(guān)的任何其他系統(tǒng))可以預(yù)見(jiàn)。

任何系統(tǒng)的用戶(hù)無(wú)論如何都應(yīng)具有相同的可預(yù)測(cè)的體驗(yàn)。踩下汽車(chē)油門(mén)踏板始終會(huì)導(dǎo)致汽車(chē)加速。踩剎車(chē)總是會(huì)導(dǎo)致汽車(chē)減速。用計(jì)算機(jī)科學(xué)術(shù)語(yǔ)來(lái)說(shuō),我們希望汽車(chē)具有確定性。

汽車(chē)表現(xiàn)出隨機(jī)行為是非常不希望的,例如加速器無(wú)法加速或制動(dòng)器未能制動(dòng)(豐田問(wèn)題)。即使此類(lèi)問(wèn)題僅在一萬(wàn)億次發(fā)生一次。

然而,大多數(shù)軟件工程師的心態(tài)是"該軟件應(yīng)足以讓我們的客戶(hù)繼續(xù)使用它"。我們真的可以做得更好嗎?當(dāng)然可以,我們應(yīng)該做得更好!最好的起點(diǎn)是解決我們程序的不確定性。

非確定性101

在計(jì)算機(jī)科學(xué)中,與確定性算法相反,非確定性算法是一種即使對(duì)于相同的輸入也可以在不同的運(yùn)行中表現(xiàn)出不同行為的算法。

—有關(guān)非確定性算法的維基百科文章

如果上述Wikipedia上關(guān)于非確定性的說(shuō)法對(duì)您來(lái)說(shuō)聽(tīng)起來(lái)不太好,那是因?yàn)榉谴_定性沒(méi)有任何好處。讓我們看一下僅調(diào)用函數(shù)的代碼示例:

我們不知道該函數(shù)的功能,但是在給定相同輸入的情況下,該函數(shù)似乎總是返回相同的輸出。現(xiàn)在,讓我們看一下另一個(gè)示例,該示例調(diào)用另一個(gè)函數(shù)computeb:

這次,函數(shù)為同一輸入返回了不同的值。兩者有什么區(qū)別?給定相同的輸入,前一個(gè)函數(shù)總是產(chǎn)生相同的輸出,就像數(shù)學(xué)中的函數(shù)一樣。換句話說(shuō),功能是確定性的。后一種功能可能會(huì)產(chǎn)生期望值,但這不能保證。換句話說(shuō),函數(shù)是不確定的。

是什么使函數(shù)具有確定性或不確定性?

  • 不依賴(lài)外部狀態(tài)的功能是100%確定性的。
  • 僅調(diào)用其他確定性函數(shù)的函數(shù)是確定性的。

在上面的示例中,computea是確定性的,并且在給定相同輸入的情況下,將始終提供相同的輸出。因?yàn)槠漭敵鰞H取決于其參數(shù)x。

另一方面,computeb是不確定性的,因?yàn)樗{(diào)用了另一個(gè)不確定性函數(shù)Math.random()。我們?nèi)绾沃繫ath.random()是不確定的?在內(nèi)部,它取決于系統(tǒng)時(shí)間(外部狀態(tài))來(lái)計(jì)算隨機(jī)值。它還不帶任何參數(shù)-依賴(lài)于外部狀態(tài)的函數(shù)的無(wú)用贈(zèng)品。

確定性與可預(yù)測(cè)性有什么關(guān)系?確定性代碼是可預(yù)測(cè)的代碼。非確定性代碼是不可預(yù)測(cè)的代碼。

從確定論到非確定論

[[376183]]

> Photo by Annie Spratt on Unsplash

讓我們看一下附加功能:

我們始終可以確定,給定(2,2)的輸入,結(jié)果將始終等于4。我們?cè)趺茨苓@么確定?在大多數(shù)編程語(yǔ)言中,加法運(yùn)算是在硬件上實(shí)現(xiàn)的,換句話說(shuō),CPU負(fù)責(zé)計(jì)算結(jié)果始終保持不變。除非我們要處理浮點(diǎn)數(shù)的比較,否則(但這是另一回事,與不確定性問(wèn)題無(wú)關(guān))。現(xiàn)在,讓我們關(guān)注整數(shù)。硬件非常可靠,可以安全地假定加法結(jié)果始終正確。

現(xiàn)在,讓我們將值2裝箱:到目前為止,功能是確定的!

現(xiàn)在,我們對(duì)函數(shù)主體進(jìn)行一些小的更改:

  • 發(fā)生了什么?突然函數(shù)的結(jié)果不再可預(yù)測(cè)!第一次運(yùn)行良好,但是在隨后的每次運(yùn)行中,其結(jié)果開(kāi)始變得越來(lái)越不可預(yù)測(cè)。換句話說(shuō),該功能不再是確定性的。
  • 為什么突然變成不確定的?該函數(shù)通過(guò)修改超出其范圍的值而引起了副作用。

讓我們回顧一下

確定性程序可確保2 + 2 == 4。換句話說(shuō),給定輸入(2,2),函數(shù)add始終應(yīng)得到4的輸出。無(wú)論您調(diào)用該函數(shù)多少次,無(wú)論您是否并行調(diào)用該函數(shù),以及該函數(shù)外部的外觀如何。

非確定性程序正好相反。在大多數(shù)情況下,對(duì)add(2,2)的調(diào)用將返回4。但是有時(shí),該函數(shù)可能會(huì)返回3、5甚至1004。不確定性在程序中是非常不可取的,我希望您現(xiàn)在可以理解為什么。

非確定性代碼的后果是什么?軟件缺陷或通常被稱(chēng)為"錯(cuò)誤"的缺陷。錯(cuò)誤使開(kāi)發(fā)人員浪費(fèi)了寶貴的調(diào)試時(shí)間,并且如果將其投入生產(chǎn),則會(huì)大大降低客戶(hù)體驗(yàn)。

為了使我們的程序更可靠,我們應(yīng)該首先解決不確定性問(wèn)題。

副作用

[[376184]]

> Photo by Igor Yemelianov on Unsplash

這給我們帶來(lái)了副作用的問(wèn)題。

什么是副作用?如果您因頭痛而服用藥物,但這種藥物使您惡心,那么惡心是一種副作用。簡(jiǎn)而言之,這是不可取的。

想象一下,您已經(jīng)購(gòu)買(mǎi)了一個(gè)計(jì)算器。您將其帶回家,開(kāi)始使用它,然后突然意識(shí)到這不是一個(gè)簡(jiǎn)單的計(jì)算器。您自己有了一個(gè)扭曲的計(jì)算器!您輸入10 * 11,它將輸出110作為輸出,但同時(shí)還會(huì)向您大喊一百和十。這是一個(gè)副作用。接下來(lái),輸入41 + 1,它打印42,并注釋" 42,生命的意義"。副作用也一樣!您感到困惑,然后開(kāi)始與您想訂購(gòu)披薩的重要對(duì)象進(jìn)行交談。計(jì)算器會(huì)偷聽(tīng)對(duì)話,大聲說(shuō)"好",然后下達(dá)比薩訂單。副作用也一樣!

讓我們回到加法功能:

是的,該函數(shù)執(zhí)行了預(yù)期的操作,將a添加到b。但是,這也會(huì)帶來(lái)副作用。對(duì)a.value + = b.value的調(diào)用導(dǎo)致對(duì)象a發(fā)生更改。函數(shù)參數(shù)a引用對(duì)象2,因此two.value不再等于2。第一次調(diào)用后,其值變?yōu)?,第二次調(diào)用后,其值為6,依此類(lèi)推。

純度

[[376185]]

> Photo by yann bervas on Unsplash

在討論了確定性和副作用之后,我們準(zhǔn)備討論純度。純函數(shù)是既具有確定性又沒(méi)有副作用的函數(shù)。

再一次,確定性意味著可預(yù)測(cè)的—給定相同的輸入,該函數(shù)將始終返回相同的結(jié)果。而且沒(méi)有副作用意味著該函數(shù)除了返回值外什么也不做。這樣的功能是純粹的。

純函數(shù)有什么好處?正如我已經(jīng)說(shuō)過(guò)的,它們是可以預(yù)測(cè)的。這使得它們非常易于測(cè)試(無(wú)需模擬和存根)。關(guān)于純函數(shù)的推理很容易-與OOP不同,無(wú)需牢記整個(gè)應(yīng)用程序狀態(tài)。您只需要擔(dān)心當(dāng)前正在使用的功能。

純函數(shù)可以輕松組成(因?yàn)樗鼈儾粫?huì)在其范圍之外進(jìn)行任何更改)。純函數(shù)對(duì)于并發(fā)非常有用,因?yàn)楹瘮?shù)之間沒(méi)有共享狀態(tài)。重構(gòu)純函數(shù)是純粹的樂(lè)趣-只需復(fù)制和粘貼,無(wú)需復(fù)雜的IDE工具。

簡(jiǎn)而言之,純函數(shù)將歡樂(lè)帶回到編程中。

面向?qū)ο缶幊痰募兌热绾?

為了舉例說(shuō)明,我們來(lái)討論一下OOP的兩個(gè)功能:getter和setter。

吸氣劑的結(jié)果取決于外部狀態(tài)-對(duì)象狀態(tài)。多次調(diào)用getter可能會(huì)導(dǎo)致不同的輸出,具體取決于系統(tǒng)的狀態(tài)。這使得吸氣劑本質(zhì)上是不確定的。

現(xiàn)在,二傳手。設(shè)置器用于更改對(duì)象的狀態(tài),從而使它們固有地具有副作用。

這意味著OOP中的所有方法(除了靜態(tài)方法之外)都是不確定性的,或者會(huì)帶來(lái)副作用,但每種方法都不是好方法。因此,面向?qū)ο缶幊滩皇羌兇獾臇|西,它與pure完全相反。

有一個(gè)銀彈。

但是我們很少有人敢嘗試。

[[376186]]

> Photo by Mohamed Nohassi on Unsplash

無(wú)知并不過(guò)分,因?yàn)椴辉笇W(xué)習(xí)。

本杰明·富蘭克林

在令人沮喪的軟件故障世界中,存在著一線希望,這將解決大多數(shù)(如果不是全部)問(wèn)題。真正的銀彈。但是只有當(dāng)您愿意學(xué)習(xí)和應(yīng)用時(shí),大多數(shù)人才不會(huì)。

銀彈的定義是什么?可以用來(lái)解決我們所有問(wèn)題的東西。數(shù)學(xué)是靈丹妙藥嗎?如果有的話,它幾乎是銀彈。

我們要?dú)w功于成千上萬(wàn)的千百年來(lái)為我們提供數(shù)學(xué)知識(shí)的聰明才智的男女。歐幾里得,畢達(dá)哥拉斯,阿基米德,艾薩克·牛頓,萊昂哈德·歐拉,阿隆佐教堂等等。

如果不確定性(即不可預(yù)測(cè))的東西成為現(xiàn)代科學(xué)的支柱,您認(rèn)為我們的世界將會(huì)走多遠(yuǎn)?可能不會(huì)很遠(yuǎn),我們會(huì)留在中世紀(jì)。這實(shí)際上在醫(yī)學(xué)界已經(jīng)發(fā)生過(guò)-過(guò)去,沒(méi)有嚴(yán)格的試驗(yàn)來(lái)證實(shí)特定治療或藥物的功效。人們依靠醫(yī)生的意見(jiàn)來(lái)治療自己的健康問(wèn)題(不幸的是,這種問(wèn)題在俄羅斯等國(guó)家仍然存在)。過(guò)去,無(wú)效的技術(shù)(例如放血)已廣為流行。像砷一樣不安全的東西被廣泛使用。

不幸的是,當(dāng)今的軟件行業(yè)與過(guò)去的醫(yī)學(xué)太相似了。它不是基于堅(jiān)實(shí)的基礎(chǔ)。取而代之的是,現(xiàn)代軟件行業(yè)主要基于脆弱的搖擺不定的基礎(chǔ),即所謂的面向?qū)ο缶幊獭H绻祟?lèi)的生活直接取決于軟件,那么就像放血和其他不安全的做法一樣,面向?qū)ο蟮牟僮鲗⒃缫严Р⒈贿z忘。

堅(jiān)實(shí)的基礎(chǔ)

[[376187]]

> Photo by Zoltan Tasi on Unsplash

有其他選擇嗎?在編程世界中,我們可以擁有像數(shù)學(xué)一樣可靠的東西嗎?是!許多數(shù)學(xué)概念直接轉(zhuǎn)化為編程,并奠定了稱(chēng)為函數(shù)式編程的基礎(chǔ)。

函數(shù)式編程是編程的數(shù)學(xué)-一個(gè)極其牢固和健壯的基礎(chǔ),可用于構(gòu)建可靠和健壯的程序。是什么使它如此強(qiáng)大?它基于數(shù)學(xué),尤其是Lambda微積分。

為了進(jìn)行比較,現(xiàn)代OOP是基于什么?是的,正確的Alan Kay OOP是基于生物細(xì)胞的。但是,現(xiàn)代的Java / C#OOP是基于一組荒謬的思想(例如類(lèi),繼承和封裝)的,它沒(méi)有Alan Kay的天才發(fā)明的原始思想。其余的只是一組創(chuàng)可貼,以解決其劣等思想的缺點(diǎn)。

函數(shù)編程呢?它的核心組成部分是一個(gè)函數(shù),在大多數(shù)情況下是一個(gè)純函數(shù)。純函數(shù)是確定性的,這使它們可預(yù)測(cè)。這意味著由純函數(shù)組成的程序?qū)⑹强深A(yù)測(cè)的。他們會(huì)永遠(yuǎn)沒(méi)有錯(cuò)誤嗎?不會(huì),但是如果程序中存在錯(cuò)誤,也將是確定性的-對(duì)于相同的輸入始終會(huì)發(fā)生相同的錯(cuò)誤,因此更易于修復(fù)。

我怎么到這里了?

過(guò)去,在過(guò)程/功能出現(xiàn)之前,goto語(yǔ)句已廣泛用于編程語(yǔ)言中。goto語(yǔ)句僅允許程序在執(zhí)行過(guò)程中跳至代碼的任何部分。這使得開(kāi)發(fā)人員很難回答"我如何到達(dá)執(zhí)行點(diǎn)?"這一問(wèn)題。是的,這已導(dǎo)致大量錯(cuò)誤。

如今,一個(gè)非常相似的問(wèn)題正在發(fā)生。僅在這一次,困難的問(wèn)題是"我如何到達(dá)此狀態(tài)"而不是"我如何到達(dá)此執(zhí)行點(diǎn)"。

OOP(通常是命令式編程)回答"我如何達(dá)到這種狀態(tài)?"的問(wèn)題。硬。在OOP中,所有內(nèi)容均通過(guò)引用傳遞。從技術(shù)上講,這意味著任何對(duì)象都可以被任何其他對(duì)象所突變(OOP對(duì)此沒(méi)有任何約束)。封裝根本沒(méi)有幫助-調(diào)用一種方法來(lái)更改某些對(duì)象字段并不比直接對(duì)其進(jìn)行更改更好。這意味著程序很快就會(huì)變成一堆依賴(lài)關(guān)系,從而使整個(gè)程序成為全局狀態(tài)的一大塊。

有什么解決方案可以使我們停止問(wèn)"我如何到達(dá)此狀態(tài)"?您可能已經(jīng)猜到了函數(shù)式編程。

過(guò)去,許多人都拒絕了停止使用goto的建議,就像今天的許多人都反對(duì)函數(shù)式編程和不可變狀態(tài)的想法一樣。

但是等等,意大利面條代碼呢?

[[376188]]

> Photo by Andrea Piacquadio from Pexels

在OOP中,"優(yōu)先于繼承而不是繼承"被認(rèn)為是最佳實(shí)踐。從理論上講,此類(lèi)最佳做法應(yīng)有助于意大利面條式代碼。不幸的是,這僅僅是"最佳實(shí)踐"。面向?qū)ο蟮木幊谭独旧韺?duì)執(zhí)行此類(lèi)最佳實(shí)踐沒(méi)有任何限制。您的團(tuán)隊(duì)中的初級(jí)開(kāi)發(fā)人員必須遵循此類(lèi)最佳做法,并在代碼審查中強(qiáng)制實(shí)施(并非總是如此)。

函數(shù)編程呢?在函數(shù)式編程中,函數(shù)組合(和分解)是構(gòu)建程序的唯一方法。這意味著編程范例本身會(huì)強(qiáng)制執(zhí)行組合。正是我們一直在尋找的東西!

函數(shù)調(diào)用其他函數(shù),較大的函數(shù)始終由較小的函數(shù)組成。就是這樣。與OOP不同,函數(shù)式編程中的組合是自然的。此外,這使得重構(gòu)等過(guò)程非常容易-只需剪切代碼,然后將其粘貼到新函數(shù)中即可。無(wú)需管理復(fù)雜的對(duì)象依賴(lài)項(xiàng),也不需要復(fù)雜的工具(例如Resharper)。

可以清楚地看到,OOP是代碼組織的次等選擇。函數(shù)式編程的明顯勝利。

但是OOP和FP是互補(bǔ)的!

抱歉讓您失望。它們不是互補(bǔ)的。

面向?qū)ο缶幊膛c功能編程完全相反。說(shuō)OOP和FP是互補(bǔ)的,就等于說(shuō)放血和抗生素是互補(bǔ)的……是嗎?

OOP違反了許多基本的FP原則:

 

  • FP提倡純凈,而OOP提倡雜質(zhì)。
  • FP代碼從根本上講是確定性的,因此是可預(yù)測(cè)的。OOP代碼本質(zhì)上是不確定的,因此是不可預(yù)測(cè)的。
  • 組合在FP中是自然的,在OOP中不是自然的。
  • OOP通常導(dǎo)致錯(cuò)誤的軟件和意大利面條代碼。FP生成可靠,可預(yù)測(cè)和可維護(hù)的軟件。
  • FP很少需要調(diào)試,而不是簡(jiǎn)單的單元測(cè)試會(huì)更多。另一方面,OOP程序員住在調(diào)試器中。
  • OOP程序員花費(fèi)大部分時(shí)間來(lái)修復(fù)錯(cuò)誤。FP程序員花費(fèi)大部分時(shí)間來(lái)交付結(jié)果。

最終,函數(shù)式編程是軟件界的數(shù)學(xué)。如果數(shù)學(xué)為現(xiàn)代科學(xué)奠定了非常堅(jiān)實(shí)的基礎(chǔ),那么它也可以以函數(shù)式編程的形式為我們的軟件奠定堅(jiān)實(shí)的基礎(chǔ)。

采取行動(dòng),為時(shí)已晚

[[376189]]

> Image source: https://www.pexels.com/photo/blue-sky-161148/

OOP是一個(gè)非常大且代價(jià)非常高的錯(cuò)誤。讓我們最終都承認(rèn)這一點(diǎn)。

知道我乘坐的汽車(chē)運(yùn)行的是用OOP編寫(xiě)的軟件,這使我感到害怕。知道帶我和家人休假的飛機(jī)使用面向?qū)ο蟮拇a并不能使我感到更安全。

現(xiàn)在我們?cè)摬扇∽罱K行動(dòng)的時(shí)候了。我們所有人都應(yīng)該開(kāi)始采取一些小步驟,以認(rèn)識(shí)到面向?qū)ο缶幊痰奈kU(xiǎn),并開(kāi)始努力學(xué)習(xí)函數(shù)式編程。這不是一個(gè)快速的過(guò)程,至少我們需要十年才能做出轉(zhuǎn)變。我相信,在不久的將來(lái),那些繼續(xù)使用OOP的人將被視為"恐龍",類(lèi)似于今天的COBOL程序員已過(guò)時(shí)。C ++和Java將會(huì)消亡。C#將死亡。TypeScript也將很快成為歷史。

我希望您立即采取行動(dòng)-如果您還沒(méi)有這樣做,請(qǐng)開(kāi)始學(xué)習(xí)函數(shù)式編程。變得真正擅長(zhǎng),并廣為傳播。F#,ReasonML和Elixir都是入門(mén)的絕佳選擇。

大型軟件革命已經(jīng)開(kāi)始。您會(huì)加入還是落伍?

原文鏈接:https://suzdalnitski.medium.com/oop-will-make-you-suffer-846d072b4dce

 

責(zé)任編輯:趙寧寧 來(lái)源: 今日頭條
相關(guān)推薦

2021-03-07 00:47:37

開(kāi)發(fā)編程科學(xué)

2013-01-09 09:27:09

面向?qū)ο?/a>計(jì)算機(jī)編程

2011-10-17 09:50:38

編程

2012-09-10 09:43:21

編程編程學(xué)習(xí)編程錯(cuò)誤

2021-01-26 09:19:50

計(jì)算機(jī)數(shù)據(jù)中心故障IT服務(wù)

2019-04-30 15:14:11

數(shù)據(jù)科學(xué)家計(jì)算機(jī)書(shū)

2019-09-10 12:58:03

電腦編程語(yǔ)言硬件

2010-07-21 16:10:25

計(jì)算機(jī)

2021-05-28 05:34:06

Golang語(yǔ)言編程

2023-01-10 09:38:09

面向對(duì)象系統(tǒng)

2013-01-10 10:05:29

編程面向?qū)ο缶幊?/a>

2023-07-07 10:53:08

2017-05-15 12:58:00

編程javaapl

2017-04-21 09:07:39

JavaScript對(duì)象編程

2012-01-17 09:34:52

JavaScript

2020-11-11 11:00:58

計(jì)算機(jī)程序員編程

2009-05-22 10:43:44

2018-07-06 14:12:50

計(jì)算機(jī)薪酬錢(qián)景

2010-11-17 11:31:22

Scala基礎(chǔ)面向?qū)ο?/a>Scala

2019-04-30 09:45:12

計(jì)算機(jī)互聯(lián)網(wǎng) 技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩欧美亚洲综合| 韩国v欧美v日本v亚洲v| 亚洲精品之草原avav久久| 日韩欧美xxxx| 国产精品免费福利| 亚洲一区二区三区综合| 日韩电影网站| 亚洲精品午夜久久久| 精品国产免费人成电影在线观...| 黄色片中文字幕| 久久久五月天| 精品视频在线播放| 午夜精品免费看| 超碰91在线观看| 国产精品女人毛片| 黄色91av| ,一级淫片a看免费| 国产日韩欧美| 久久人体大胆视频| 久久精品老司机| 国产成人免费av一区二区午夜 | 国产在线成人| 国产午夜精品美女视频明星a级| 九色91porny| 素人啪啪色综合| 亚洲成人综合视频| 宅男噜噜99国产精品观看免费| 亚洲aⅴ在线观看| 国产精品一区三区| 国产美女主播一区| 欧美一级特黄视频| 欧美日韩国产在线一区| 中文字幕av一区| 国产精品300页| 午夜日韩影院| 欧美精品v日韩精品v韩国精品v| 欧美牲交a欧美牲交aⅴ免费真 | 午夜先锋成人动漫在线| 日韩无一区二区| 自拍偷拍21p| 亚洲精品88| 亚洲444eee在线观看| 日本特级黄色大片| 在线观看福利片| 91精东传媒理伦片在线观看| 国产精品夜夜夜| 欧美激情一区二区三区高清视频| 日本黄色免费片| 红桃成人av在线播放| 亚洲成人网在线观看| 亚洲精品国产久| 欧洲精品久久久久毛片完整版| 色婷婷精品久久二区二区蜜臀av| 日韩美女爱爱视频| 51xtv成人影院| 中文字幕在线不卡国产视频| 亚洲高清视频在线观看| 黄色毛片在线观看| 国产亚洲成年网址在线观看| 亚洲国产乱码最新视频| 91aaaa| 国产内射老熟女aaaa∵| 国产精品一卡二卡在线观看| 亚洲一区制服诱惑| 午夜精品一区二区三| 国产麻豆视频精品| 国产精品sss| 亚洲av毛片成人精品| 久久久久久久久久久久久女国产乱 | 欧美日韩色视频| 天天综合亚洲| 日韩一区二区精品视频| 国产在线免费看| 91精品国产自产在线观看永久∴| 久久精品国产一区二区电影| 国产精品理论在线| 91亚洲自偷观看高清| 久久久国产视频91| 久久婷婷综合国产| 亚洲一区二区伦理| 国产精品第2页| 91精品国自产| 成人免费视频一区二区| 久久99热只有频精品91密拍| 青青草在线播放| 国产精品美女久久久久高潮| 日本一本草久p| av最新在线| 欧洲精品中文字幕| 在线a免费观看| 成人av地址| 亚洲人精选亚洲人成在线| 亚洲一级理论片| 午夜视频一区| 日本中文字幕久久看| 中文字幕一区2区3区| 国产乱色国产精品免费视频| 超碰在线观看97| 亚洲人成色777777精品音频| 国产欧美日韩亚州综合| 熟女视频一区二区三区| 久草在线新免费首页资源站| 91久久一区二区| 久久久久久国产精品日本| 中文字幕精品影院| 久久在线精品视频| 岛国av中文字幕| 韩国毛片一区二区三区| 欧美大香线蕉线伊人久久国产精品 | 希岛爱理中文字幕| 亚洲美女视频在线免费观看| 国产精品99导航| 人妻中文字幕一区| 中文字幕一区日韩精品欧美| 欧美精品久久久久久久久久久| 欧洲成人一区| 精品国精品国产尤物美女| 我不卡一区二区| 精品999网站| 国产主播喷水一区二区| 男操女在线观看| 亚洲午夜免费视频| 欧美视频亚洲图片| 精品一二三区| 国内精品小视频| 国产又粗又长又黄| 国产欧美日韩另类一区| 国产最新免费视频| 无人区乱码一区二区三区| 在线播放日韩精品| 熟妇人妻va精品中文字幕| 日韩成年人视频| 首页国产欧美久久| 精品无人区一区二区三区| 国产日产一区二区| 欧美性猛片aaaaaaa做受| 中国av免费看| 亚洲香蕉网站| 亚洲一区二区三区在线免费观看| 懂色一区二区三区| 欧美日韩亚洲一区二区| 7788色淫网站小说| 亚洲国产高清一区| 国产尤物99| 波多野结衣精品| 精品国产一区二区在线观看| 久草网站在线观看| 国产福利精品一区二区| 久久久成人精品一区二区三区| 久久久久毛片| 中文字幕一区二区三区电影| 成人黄色三级视频| 国产精品传媒入口麻豆| 九九热99视频| 久久久久久久久久久久久久| 91精品中文在线| 成人免费网站在线观看视频| 欧美一级高清大全免费观看| 欧美精品色哟哟| 不卡的av网站| aⅴ在线免费观看| 国产精品手机在线播放| 国产精品流白浆视频| 在线激情小视频| 欧美一区二区三区视频在线| 国产亚洲自拍av| 91在线小视频| 色婷婷综合久久久久中文字幕 | 九色porny自拍视频在线播放| 亚洲国产精品久久久久秋霞蜜臀| 亚洲一区欧美在线| 久久久久久久久久看片| www午夜视频| 国模一区二区三区| 欧美凹凸一区二区三区视频| 九色成人搞黄网站| 久色乳综合思思在线视频| 亚洲精品综合网| 狠狠色噜噜狠狠狠狠97| 69xxx免费| 国产精品一区二区三区99| www.亚洲成人网| 国产精品亚洲人成在99www| 国产精品美女久久| 在线中文字幕电影| 亚洲剧情一区二区| ,一级淫片a看免费| 性做久久久久久免费观看欧美| mm131美女视频| 国产综合色产在线精品| 缅甸午夜性猛交xxxx| 成人羞羞网站| 成人黄动漫网站免费| 亚洲第一影院| 欧美精品在线免费| 欧美另类自拍| 欧美一级专区免费大片| 天堂网中文字幕| 亚洲精品成人a在线观看| 丝袜美腿中文字幕| 粉嫩在线一区二区三区视频| 精品久久久久久久无码| 欧美日韩精品免费观看视频完整| 日韩激情视频| 涩爱av色老久久精品偷偷鲁| 日本高清久久天堂| 欧美aaaxxxx做受视频| 一本色道久久88综合日韩精品| www.国产黄色| 欧美日韩精品一区二区| 毛片在线免费视频| 一区二区三区四区不卡视频| 亚洲一区视频在线播放| proumb性欧美在线观看| 杨幂一区二区国产精品| 日本sm残虐另类| 人妻有码中文字幕| 1024成人| 2022中文字幕| 91九色精品国产一区二区| 欧美激情第六页| 国产厕拍一区| 91手机在线观看| 日韩福利影视| 国产精品欧美一区二区| 日韩理论视频| 97视频免费观看| 免费在线国产视频| 欧美精品在线观看| 国产色在线观看| 日日骚久久av| 福利小视频在线观看| 亚洲欧美日韩视频一区| 色屁屁草草影院ccyycom| 精品动漫一区二区三区在线观看| 国产裸体永久免费无遮挡| 欧美日韩亚洲综合在线| 中文字幕免费观看| 91久久精品一区二区三| 久久久久久久久久久久久av| 亚洲aaa精品| 国产无码精品久久久| 亚洲一二三四久久| 国产精品99精品| 亚洲高清在线视频| 在线观看 中文字幕| 精品成人乱色一区二区| 日本道在线观看| 欧美视频不卡中文| 国产成人一级片| 色婷婷av一区| 久久久蜜桃一区二区| 欧美三级电影一区| 国产精品老熟女视频一区二区| 制服丝袜亚洲色图| www.香蕉视频| 亚洲国产精品va在看黑人| 天天综合在线视频| 亚洲开心激情网| 国产区视频在线| 三级精品视频久久久久| 黄网站在线免费看| 久久久久久综合网天天| av资源在线播放| 日韩av片免费在线观看| 国产极品一区| 91久久偷偷做嫩草影院| 精品欠久久久中文字幕加勒比| 免费看成人片| 成人a'v在线播放| 最新黄色av网站| 在线成人h网| 亚洲精品高清无码视频| 美女视频一区二区| 中文字幕一二三区| 91视频91自| 国产美女网站视频| 夜夜亚洲天天久久| 激情五月婷婷网| 欧美一二三区在线| 日本啊v在线| xxx欧美精品| cao在线视频| 国产精品69av| 欧美精品三级在线| 蜜桃91精品入口| 午夜精品毛片| 男人日女人视频网站| 日本色综合中文字幕| 26uuu国产| 国产亚洲综合av| 欧美人禽zoz0强交| 欧美午夜美女看片| a天堂视频在线| 亚洲最新av网址| 欧美xxx黑人xxx水蜜桃| 国产极品jizzhd欧美| 日韩中文一区二区| 亚洲不卡1区| 欧美激情1区2区3区| 成人一级片网站| 粉嫩蜜臀av国产精品网站| a天堂中文字幕| 一二三四区精品视频| 一级黄在线观看| 亚洲国产成人久久| 精产国品自在线www| 国产成人综合久久| 狠狠一区二区三区| japanese在线视频| 日韩国产高清影视| 久久久久亚洲AV成人无码国产| 日韩一区在线播放| 天天干天天操天天爱| 精品国产一区二区三区久久久蜜月| h视频网站在线观看| 欧美一区二粉嫩精品国产一线天| 国产一区二区三区免费观看在线| 日本一区二区三区四区高清视频 | 久久精品一区二区| 日本网站免费观看| 日韩一区二区三区视频在线观看| 国产小视频福利在线| 97人人爽人人喊人人模波多| 欧美黄色一级| 亚洲国产精品女人| 麻豆成人免费电影| 亚洲人成人无码网www国产| 午夜精品福利一区二区三区av| www.热久久| 久久伊人精品视频| 国产一区二区三区| 韩国黄色一级大片| 国产麻豆精品theporn| 成年人免费视频播放| 欧美日韩一区视频| jizzjizz在线观看| 国产精品免费久久久久影院| 极品美女一区二区三区| 37pao成人国产永久免费视频| k8久久久一区二区三区 | 亚洲精品tv久久久久久久久久| 色七七在线观看| 国产午夜精品一区二区| 久草手机在线视频| 日韩电影网在线| 日韩电影毛片| 日本一区精品| 日本不卡一区二区三区高清视频| 天天干天天操天天拍| 欧美在线播放高清精品| av福利在线播放| 国产日韩欧美影视| 在线一区电影| 亚洲精品鲁一鲁一区二区三区 | 69视频免费在线观看| 亚洲女人天堂网| 成人涩涩视频| 人人妻人人澡人人爽精品欧美一区| 狠狠色2019综合网| 久久久久免费看| 日韩精品在线观| gogo亚洲高清大胆美女人体| 视频在线一区二区三区| 老司机午夜精品| 男女做暖暖视频| 日韩av网站电影| 91精品国产66| 中文字幕色呦呦| 99精品在线免费| 国产成人精品一区二区色戒| 久久九九亚洲综合| 国产精品自在| 色婷婷综合久久久久中文字幕| 国产精品二三区| 亚洲第一色网站| 热99精品里视频精品| 97人人精品| 亚洲一级av无码毛片精品| 欧美吻胸吃奶大尺度电影 | 亚洲婷婷综合久久一本伊一区| 亚洲成人一级片| 国产精品91在线| 欧美日韩福利| 尤物视频最新网址| 欧美一区午夜视频在线观看| jizz一区二区三区| 亚洲一区二区三区免费看| 大美女一区二区三区| 成人h动漫精品一区二区下载| 欧美成年人视频网站| 鲁大师精品99久久久| 中文字幕国产免费| 精品国产乱码久久久久久虫虫漫画| 成人午夜电影在线观看| 粉嫩高清一区二区三区精品视频| 日本亚洲最大的色成网站www| 久久综合成人网| 日韩在线观看高清| 最新精品国偷自产在线|