值得探索以改善編碼風(fēng)格的5種編程語(yǔ)言
"為什么這段代碼如此混亂? 為什么這個(gè)問(wèn)題很難表達(dá)? 這段代碼到底是怎么回事?"
諸如此類的問(wèn)題使我多次尋求編程語(yǔ)言的圣杯。 我還沒有找到圣杯,但是就像每一次旅行一樣,我變得更聰明,更有經(jīng)驗(yàn)。
長(zhǎng)期以來(lái),程序員一直在尋找向計(jì)算機(jī)表達(dá)自己的最佳方式。 在曾經(jīng)創(chuàng)造的所有語(yǔ)言中,只有少數(shù)發(fā)展成為廣泛的行業(yè)標(biāo)準(zhǔn)。
像我一樣,您可能正在使用經(jīng)過(guò)考驗(yàn)的流行技術(shù),并嘗試使其以最佳方式工作。 但是我們都知道事情不是完美的-它們的缺點(diǎn)會(huì)影響我們的神經(jīng)和耐心。
這是我嘗試過(guò)的語(yǔ)言的簡(jiǎn)短列表,這為我的日常工作帶來(lái)了一些好處。 雖然不是大多數(shù)語(yǔ)言的專家,甚至不是常規(guī)用戶,但我對(duì)這些語(yǔ)言進(jìn)行了很多有趣的嘗試,而且我想認(rèn)為它們只是使我總體上成為一個(gè)更好的程序員。
ML語(yǔ)言(F#/ OCaml)
對(duì)于第一個(gè)條目,我想向您介紹ML系列的語(yǔ)言。 這不是我第一次進(jìn)入函數(shù)式編程(FP)世界。 然而,正是這一點(diǎn)使我對(duì)它的實(shí)際工作方式有了真正的實(shí)際了解。
盡管兩種語(yǔ)言都支持多種范例,但它們最適合于函數(shù)式編程。 它們不像Haskell那樣嚴(yán)格和純凈,因此您可以將您的腳趾浸入函數(shù)式編程風(fēng)格中,而無(wú)需太多的初期掙扎和挫折。
我真的很喜歡通過(guò)匹配和破壞來(lái)控制流程是多么容易。 F#能夠一目了然地可視化函數(shù)的流程。 無(wú)論語(yǔ)言如何,我都會(huì)努力將其納入代碼中。
多虧了ML語(yǔ)言,我在類型的組成和設(shè)計(jì)方面變得更好。 即使F#會(huì)嘗試從您編寫的核心代碼中猜測(cè)您的類型,它也是一種強(qiáng)類型化的語(yǔ)言。
F#非常適合學(xué)習(xí)序列上的功能樣式操作。 這是任何FP第一語(yǔ)言的共同特征。 折痕,地圖壓縮等與FP編程器工具箱中的錘子等效。 易于使用的語(yǔ)法支持著重于此元素,將幫助您訓(xùn)練大腦以了解可以抽象為序列操作的問(wèn)題。
如果您具有OOP(面向?qū)ο缶幊?的經(jīng)驗(yàn),那么學(xué)習(xí)F#是進(jìn)入函數(shù)式編程世界的絕佳的第一步。 如果遇到困難,您總是可以回到日常的對(duì)象和課程。 F#將它們與其他代碼混合在一起,而不必大驚小怪。
如果您具有C#的經(jīng)驗(yàn),則F#與.NET的互操作性也將為您帶來(lái)很大的幫助。 您仍然可以使用可信賴的.NET工具和nuget包。
我只能建議您嘗試一下。 沒有非常陡峭的學(xué)習(xí)曲線,這很有趣。
但是,如果您不害怕陡峭的學(xué)習(xí)曲線,則可以直接跳至:
Haskell
現(xiàn)在,Haskell一直是(現(xiàn)在仍然是)我要時(shí)不時(shí)地挑戰(zhàn)。 即使我從未完成過(guò)任何大型項(xiàng)目,但我始終喜歡與之合作的精神挑戰(zhàn)。
Haskell編程從一開始就是一種殘酷的經(jīng)歷……老實(shí)說(shuō),它仍然是。 Haskell不是一種蓬松的用戶友好型ML語(yǔ)言。 這種語(yǔ)言將迫使您對(duì)FP進(jìn)行編程并正確編程。
您必須正確設(shè)計(jì)類型。 您必須精確地計(jì)劃功能。 而且對(duì)實(shí)現(xiàn)沒有任何欺騙,如果您說(shuō)此功能會(huì)做某事,則必須兌現(xiàn)您的承諾。 沒有一半的實(shí)現(xiàn),沒有漏掉的案例或"其他"。
但最重要的是,沒有隱藏的副作用。 如果您說(shuō)您的函數(shù)將獲得一個(gè)字符串并取回該字符串,則編譯器將強(qiáng)制您兌現(xiàn)您的承諾。 沒有打印調(diào)試信息,沒有讀取用戶輸入。 您說(shuō)過(guò)您會(huì)得到一個(gè)琴弦并只將琴弦還給您,不是嗎?
使用這種語(yǔ)言確實(shí)可以使您的大腦注意所承諾的聲明功能(或方法)的內(nèi)容。
即使這種嚴(yán)格性不能總是很好地翻譯成C#之類的語(yǔ)言,但它會(huì)使您更加了解,并會(huì)促使您謹(jǐn)慎地聲明函數(shù),以便其他用戶不會(huì)感到不愉快。 一兩年后再回到自己的代碼時(shí),這將為您節(jié)省一些咒罵。
我知道當(dāng)我修改傳遞給該方法的任何參數(shù)時(shí),我的大腦會(huì)立即發(fā)出警報(bào)。 我需要那個(gè)嗎? 我是否警告過(guò)潛在用戶該功能會(huì)干擾他/她的數(shù)據(jù)?
當(dāng)我開始學(xué)習(xí)Haskell時(shí),它是一種奇怪的語(yǔ)言。 我已經(jīng)知道Haskell程序員坐在編程象牙塔的頂層。 我還發(fā)現(xiàn),顯然奇怪的生物正在懸停在塔頂頂部上方(笑話歸于ScottW)。
這些人在編程:
LISP系列:通用LISP,Clojure,Scheme
對(duì)于像我這樣來(lái)自C家族的任何人來(lái)說(shuō),這都是一個(gè)真正的陌生人。 第一次困惑地看一下代碼,第一次斜視是由一群大括號(hào)擁抱這些陳述引起的。 啊,回憶!
我進(jìn)入LISP世界的第一步是通過(guò)Clojure。 我只是在書店里瀏覽,當(dāng)時(shí)一本關(guān)于Clojure的書引起了我的注意(出于對(duì)我的愛,我不記得那本書是哪本書)。 我把它帶回家,冒險(xiǎn)開始了。 或者,確切地說(shuō),是一個(gè)天又一個(gè)難題地解決,并試圖了解如何使用該工具的日子。 幾周后我放棄了,一年后又回來(lái)了。 并再次放棄。 然后,我找到了Common LISP,然后再次使用它,但是這次有了發(fā)現(xiàn)我的文本編輯器(也許是操作系統(tǒng))想要的EMACS的附加價(jià)值。
我不記得在這個(gè)周期中什么時(shí)候點(diǎn)擊了。 大括號(hào)融合到背景中,剩下的只是一個(gè)清晰的提示。 如果您在LISP中發(fā)現(xiàn)一件事,那就太優(yōu)雅了。 我絕對(duì)不會(huì)說(shuō)我可以用LISP編寫優(yōu)秀代碼,但是閱讀經(jīng)驗(yàn)豐富的程序員的代碼是一種敬畏和嫉妒的經(jīng)歷。 我希望有一天,我將有技能來(lái)編寫能很好地說(shuō)明自己的程序。
如果我可以證明這些語(yǔ)言的出色表現(xiàn),那么即使我沒有足夠的知識(shí)親自編寫該程序,我仍然可以理解該程序的意圖。
所有這些都?xì)w功于簡(jiǎn)單而靈活的設(shè)計(jì)。 最重要的是,有一個(gè)我所不知道的宏系統(tǒng)。 通過(guò)支持語(yǔ)法構(gòu)造,這使您可以圍繞已解決的問(wèn)題編寫程序。
另一個(gè)重要功能是使用REPL進(jìn)行交互式實(shí)驗(yàn)性編程。 編寫活動(dòng)代碼鼓勵(lì)進(jìn)行試驗(yàn),并允許您在提交給代碼的一種設(shè)計(jì)之前檢查許多想法。
即使我在工作中不使用LISP,它仍然是一個(gè)很好的工具,而且我在經(jīng)常被引用的句子"發(fā)現(xiàn)學(xué)習(xí)LISP將使您成為更好的程序員"中發(fā)現(xiàn)了事實(shí)。 我不知道我是否可以通過(guò)LISP成為一個(gè)更好的程序員,但這無(wú)疑擴(kuò)大了我的視野。
Rust
當(dāng)我處理C ++ pet項(xiàng)目時(shí),我首先發(fā)現(xiàn)了Rust。 我不討厭或鄙視C ++,但是使用它的任何人都知道,有時(shí)C ++可能會(huì)令人討厭。
C ++所提供的復(fù)雜性和自由度令人驚嘆,但也可能使人不堪重負(fù),甚至失去希望……
如果您從未在其中編寫過(guò)中型或大型項(xiàng)目,那么讓我告訴您,它很快就會(huì)變得混亂。
這種語(yǔ)言龐然大物背后的驅(qū)動(dòng)思想是,無(wú)緣無(wú)故應(yīng)該阻止開發(fā)人員用自己的腳射擊……或者恰好是現(xiàn)在出現(xiàn)的20英尺,而您不確定他們是如何到達(dá)這里的。 同樣,您的原始腳在某處,但您不確定該在哪里。
無(wú)論如何。 Rust用RAII范式的嚴(yán)格性和自以為是的AF解決了這個(gè)問(wèn)題。 類似于Haskell的方式,編譯器始終處于工作狀態(tài),并確保您正確構(gòu)建程序。
主要目標(biāo)是:如果編譯,它將正常工作。
用Rust寫作就像與一個(gè)憤怒的教練合作,他會(huì)在一點(diǎn)點(diǎn)滑倒的情況下糾正您。
這是一個(gè)好習(xí)慣,尤其是在您無(wú)法正確設(shè)置內(nèi)存管理的情況下。
每次查看Rust時(shí),Rust似乎都會(huì)得到重大改進(jìn)。 即使它不能代替C ++代替中級(jí)通用語(yǔ)言,還是有一個(gè)好的競(jìng)爭(zhēng)者仍然很不錯(cuò)。
SmallTalk
我的朋友在有關(guān)面向?qū)ο蠛凸δ芊妒降木瓢赊q論中向我推薦了這個(gè)。 在啤酒的充分刺激下,我站在一位功能編程的新手的立場(chǎng)上,他認(rèn)為這種新的范例將解決我所有的問(wèn)題,即使不是世界上的問(wèn)題。
我被一個(gè)簡(jiǎn)單的論點(diǎn)反駁:
試試Smalltalk,看看面向?qū)ο蟮木幊淌欠裾娴臎]有用。
所以我嘗試了并且感到謙虛。 原來(lái),我不知道如何執(zhí)行OO。 Smalltalk是特定的。 大多數(shù)實(shí)現(xiàn):Pharo,Squeak等將為您提供完整的IDE,這幾乎就像是為開發(fā)而構(gòu)建的小型操作系統(tǒng)。
它為您提供了完成任務(wù)的所有工具,但最重要的是,它強(qiáng)烈建議工作流向您展示如何以我所說(shuō)的Smalltalk方式進(jìn)行開發(fā)。
因此,您要發(fā)表評(píng)論,也要編寫測(cè)試。 您需要將對(duì)象和函數(shù)命名和分類為適當(dāng)?shù)膶?duì)象,協(xié)議和包。
叫我瘋了,但是當(dāng)我以正確的方式做事時(shí),我覺得法羅幾乎為我感到驕傲。
事實(shí)證明,正確的方法可以花很多時(shí)間。
語(yǔ)言本身非常簡(jiǎn)單,您可以在不到15分鐘的時(shí)間內(nèi)輕松學(xué)習(xí)語(yǔ)法。 沒有技巧,沒有語(yǔ)法糖。 它為您提供了足夠的工具來(lái)完成工作,因此您可以做到。 您不必費(fèi)心去尋找應(yīng)該使用的語(yǔ)言工具-別無(wú)選擇。 我覺得它可以讓我的大腦將所有精力集中在手頭的工作上。 它對(duì)我有用,也許對(duì)您有用。
后記
我在本文中跳過(guò)了一些語(yǔ)言。 其中一些是如此廣泛,以至于您可能以其他形式(例如Python / Java / C ++ / C#等)看到了它們。
有些人我沒有遵守規(guī)則,即如果您無(wú)話可說(shuō),那就什么也不要說(shuō)(我看著您JavaScript,ekhm)。
有些,例如Ruby,Scala,Perl,我還沒有嘗試過(guò)。 希望以后能對(duì)這些有所了解。