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

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

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

介紹了五個(gè)簡(jiǎn)單的總體概念 可輕松寫(xiě)出寫(xiě)出好代碼

機(jī)器學(xué)習(xí)算法與人工智能 ? 2018-01-10 14:00 ? 次閱讀

Bug 少,性能好,容易修改。好的代碼影響深遠(yuǎn),而且它可能是產(chǎn)生10 倍工作效率的開(kāi)發(fā)者的主要原因。盡管好代碼十分重要,但開(kāi)發(fā)新手卻不得要領(lǐng)。關(guān)于這一主題的技巧多而冗雜,讓新手們?nèi)绾斡浀米??“Code Complete(《代碼大全》)” 是這個(gè)主題的經(jīng)典,但內(nèi)容多達(dá) 960 頁(yè)!

我認(rèn)為應(yīng)該建立起良好的心態(tài),這樣,不管你用什么語(yǔ)言或者庫(kù),都會(huì)自然而然的寫(xiě)出高質(zhì)量的代碼。這里我主要談到 5 個(gè)相關(guān)的概念。記住它們,輕松寫(xiě)出寫(xiě)出好代碼。

請(qǐng)避免特立獨(dú)行

當(dāng)你讀到一些文章中的新技巧時(shí),如醍醐灌頂,一定會(huì)想要寫(xiě)點(diǎn)看起來(lái)很聰明的代碼,讓同行們眼前一亮。

問(wèn)題是人們只是想修完 BUG,然后繼續(xù)處理其它事情。那些聰明的技巧常常只會(huì)成為一種消遣。我曾經(jīng)在“將神經(jīng)科學(xué)應(yīng)用于軟件開(kāi)發(fā)”中談到,當(dāng)人們被迫花心思來(lái)理解你的某段代碼時(shí),它們的“精神堆棧”會(huì)迅速填滿,因而難以理解其中深意。

介紹了五個(gè)簡(jiǎn)單的總體概念 可輕松寫(xiě)出寫(xiě)出好代碼

[譯者注:圖片中的注釋內(nèi)容:這在 C 語(yǔ)言中用于避免誤寫(xiě)成 variable = null。最近它造成不少人困惑,但似乎并沒(méi)帶來(lái)多大好處]

不要在工作中使用太多可能需要額外解釋的個(gè)性化方式。

不要用“你的方式”來(lái)編寫(xiě)代碼,只需要按照標(biāo)準(zhǔn)(的代碼規(guī)范)來(lái)編寫(xiě)就好。再次強(qiáng)調(diào),要寫(xiě)讓人讀得明白,看得下去的代碼,讓人家能夠理解它。

分而治之

模塊化可以使復(fù)雜的代碼結(jié)構(gòu)變得清晰,除此之外還有很多方法可以達(dá)到同樣的目的,而無(wú)需創(chuàng)建更多函數(shù)。將長(zhǎng)長(zhǎng)的條件表達(dá)式保存為一到兩個(gè)變量就是個(gè)不錯(cuò)的方法,可以避免調(diào)用函數(shù)的開(kāi)銷(xiāo)。這些變量可以用在其它地方,甚至可用于組合更復(fù)雜的條件。

拆解問(wèn)題的方法在于盡可能的讓每個(gè)部分保持集中,只影響局部狀態(tài),不要混入不相關(guān)的問(wèn)題,要避免副作用。編程語(yǔ)言和庫(kù)通常會(huì)帶來(lái)各自相應(yīng)的問(wèn)題,避免這些問(wèn)題可以讓你的代碼更專(zhuān)注于其表達(dá)的業(yè)務(wù)。單一責(zé)任原則就是通過(guò)集中代碼和局部化代碼帶來(lái)良好設(shè)計(jì)的例子。

[譯者注:圖中注釋內(nèi)容:這是不需要額外函數(shù)開(kāi)銷(xiāo)的一種模塊化方法]

我喜歡利用變量來(lái)進(jìn)行邏輯劃分。

TDD(Test Driven Development,測(cè)試驅(qū)動(dòng)開(kāi)發(fā))的成功實(shí)施表現(xiàn)出了它所帶來(lái)的好處,它迫使人們運(yùn)用一些以前不受歡迎的準(zhǔn)則。無(wú)狀態(tài)的代碼曾經(jīng)被嫌棄又慢又沒(méi)必要(大部分老的 C/C++ 代碼中可以看到),然而現(xiàn)在每個(gè)人都在談?wù)摷兒瘮?shù)。就算你不采用 TDD,你也應(yīng)該學(xué)習(xí)它背后的原則。在新的模式下工作會(huì)讓你成為適應(yīng)性極強(qiáng)的開(kāi)發(fā)者。

分離代碼并使其可分別處理

你寫(xiě)代碼的時(shí)候面臨著什么樣的困難,你的計(jì)算機(jī)和工具也面臨著同樣的困難。代碼的復(fù)雜性,與需要進(jìn)行的預(yù)處理和需要處理的突發(fā)情況存在著或多或少的聯(lián)系。

現(xiàn)在暫時(shí)拋開(kāi)那些額外的構(gòu)建工具所帶來(lái)的好處。它們需要你使用特定領(lǐng)域的語(yǔ)言,比如自定義模板,或者復(fù)雜的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),比如哈稀表。IDE 通常不善于處理這些東西,要找到相關(guān)的代碼段則更加困難。

盡量避免使用不能很好支持 IDE 的語(yǔ)言擴(kuò)展和庫(kù)。它們給你的生產(chǎn)力帶來(lái)的好處,遠(yuǎn)大于簡(jiǎn)易配置和用簡(jiǎn)潔語(yǔ)法保存擊鍵帶來(lái)的小便利。

[譯者注:圖中注釋內(nèi)容:使用神奇的字體串可能造成 IDE 不能正確識(shí)別你的代碼]

ServiceLocator 是與 IDE 整合不佳的一個(gè)設(shè)計(jì)樣例。

另一個(gè)保持 IDE“整合度”的相關(guān)方法是避免編寫(xiě)特殊的代碼。多數(shù)語(yǔ)言都提供了編寫(xiě)動(dòng)態(tài)代碼的能力。如果濫用這些特性,比如特殊的字符串、特殊的數(shù)組索引和自定義模板語(yǔ)言特性等,會(huì)產(chǎn)生難以連接的代碼庫(kù)[譯者注:這里的連接應(yīng)該是指相互關(guān)聯(lián)的關(guān)系,連接最直接的影響是在使用 IDE 等工具進(jìn)行重構(gòu)的時(shí)候可以自動(dòng)根據(jù)連接關(guān)系修改相關(guān)引用]。一般說(shuō)來(lái),那些只有你一個(gè)人才能看懂的特性會(huì)讓你摔跟頭的,因?yàn)槿绻?IDE 不能理解這些代碼,在你想進(jìn)行結(jié)構(gòu)調(diào)整的時(shí)候,IDE 就沒(méi)法幫你進(jìn)行重構(gòu)。

讓程序可讀

致力于可預(yù)測(cè)的架構(gòu)。這種架構(gòu)下你的隊(duì)友要進(jìn)行某項(xiàng)查找就會(huì)很容易,可以節(jié)約不少時(shí)間。一旦你為項(xiàng)目確定了一個(gè)整體的架構(gòu),就一定要把主要元素放在顯眼的位置。使用 MVC?把模型、視圖和控制器放在他們自己的目錄下,不要放在三個(gè)深層次的目錄中,也不要放在幾個(gè)不同的地方。

我在前面談到了模塊化。也存在過(guò)度的模塊化,讓定位代碼這種事情變得艱難無(wú)比。IDE 可能會(huì)帶來(lái)一些幫助,但通常你往往會(huì)讓 IDE 忽略庫(kù)目錄,因?yàn)槠渲杏泻芏嗖幌嚓P(guān)的代碼,或者它的索引需要人工處理一些問(wèn)題,就會(huì)造成兩敗俱傷的局面。盡量使用較少的庫(kù),選用那些盡可能多覆蓋你需求的庫(kù)。

庫(kù)和工具也可能成為新人的障礙。我最近使用 EcmaScript 7 (babel) 構(gòu)建了一個(gè)項(xiàng)目,后來(lái)我才意識(shí)到我們的初級(jí)開(kāi)發(fā)人員一直因?yàn)橄敫忝靼姿ㄔ谀抢铮@對(duì)團(tuán)隊(duì)的生產(chǎn)力造成了巨大損失。我低估了這對(duì)一個(gè)新手所帶來(lái)的壓力。不要使用對(duì)當(dāng)前來(lái)說(shuō)太難掌握的工具,等時(shí)機(jī)成熟再使用。

介紹了五個(gè)簡(jiǎn)單的總體概念 可輕松寫(xiě)出寫(xiě)出好代碼

這是我寫(xiě)的一個(gè) makefile 中的真實(shí)代碼。新手不需掌握過(guò)多的新技術(shù)。

讓代碼易于理解

如果你已經(jīng)做到了這一點(diǎn),那我們來(lái)解決更重要的問(wèn)題——選擇好名字,這是軟件開(kāi)發(fā)中的重要部分。構(gòu)建工具在這方面不能提供幫助,原因很簡(jiǎn)單,計(jì)算機(jī)不會(huì)真正知道解決方案背后的邏輯。你得通過(guò)文檔來(lái)解釋代碼,而與主題相關(guān),且符合上下文,體現(xiàn)變量和功能的名稱(chēng)就能很好做到這一點(diǎn)。語(yǔ)義化的名稱(chēng)甚至可以減少對(duì)文檔的需求。

在名稱(chēng)中使用前綴對(duì)理解它們很有幫助。這在過(guò)去是一種流行的做法,我認(rèn)為對(duì)這種作法的誤用導(dǎo)致了它的消亡。像匈牙利命名法這樣的前綴系統(tǒng)最初只是為了增加意義,但最后用于其中的上下文越來(lái)越少,終于少得只剩類(lèi)型信息。

介紹了五個(gè)簡(jiǎn)單的總體概念 可輕松寫(xiě)出寫(xiě)出好代碼

[譯者注:圖中的注釋內(nèi)容:使用名稱(chēng)來(lái)表達(dá)意圖,不要利用語(yǔ)言來(lái)耍小聰明]

近來(lái),F(xiàn)luent 接口經(jīng)常被濫用。

最后要說(shuō)說(shuō)老生常談的回溯復(fù)雜度。簡(jiǎn)單地說(shuō)就是要盡可能減少條件分支的數(shù)目。每多一個(gè)分支都會(huì)增加縮進(jìn),同時(shí)降低可讀性。不過(guò)更重要的是,增加的東西越多,你需要跟蹤的東西就越多。

結(jié)論

本文介紹了五個(gè)簡(jiǎn)單的總體概念,我希望你能從中輕松的學(xué)習(xí)到組織代碼的方法。

實(shí)踐是最好的老師,用編程來(lái)鞏固理論。如果你還沒(méi)有這樣做,我誠(chéng)摯向你推薦代碼大全。它帶來(lái)了大量的示例,幾乎剖析了你可能遇到的每一種問(wèn)題。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68625

原文標(biāo)題:編寫(xiě)良好的代碼:如何減少代碼的認(rèn)知負(fù)荷

文章出處:【微信號(hào):machinelearningai,微信公眾號(hào):機(jī)器學(xué)習(xí)算法與人工智能】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    何為高質(zhì)量的代碼?如何寫(xiě)出高質(zhì)量代碼?

    懂得“數(shù)據(jù)結(jié)構(gòu)與算法” 寫(xiě)出高效的代碼,懂得“設(shè)計(jì)模式”寫(xiě)出高質(zhì)量的代碼。
    發(fā)表于 08-02 09:44 ?843次閱讀
    何為高質(zhì)量的<b class='flag-5'>代碼</b>?如何<b class='flag-5'>寫(xiě)出</b>高質(zhì)量<b class='flag-5'>代碼</b>?

    如何寫(xiě)出好代碼?高質(zhì)量代碼的三要素

    膾炙人口的詩(shī)"春有百花秋有月,夏有涼風(fēng)冬有雪",意境唯美,簡(jiǎn)明易懂。好的代碼也是讓人陶醉的,那么如何寫(xiě)出好代碼
    的頭像 發(fā)表于 01-05 11:29 ?1265次閱讀
    如何<b class='flag-5'>寫(xiě)出好</b>的<b class='flag-5'>代碼</b>?高質(zhì)量<b class='flag-5'>代碼</b>的三要素

    如何寫(xiě)出時(shí)序最優(yōu)的HDL代碼?如何寫(xiě)出時(shí)序裕量足夠的代碼?

    你想寫(xiě)出可以跑出700M以上的代碼嗎,直逼FPGA內(nèi)部PLL的極限。
    的頭像 發(fā)表于 03-12 09:59 ?914次閱讀
    如何<b class='flag-5'>寫(xiě)出</b>時(shí)序最優(yōu)的HDL<b class='flag-5'>代碼</b>?如何<b class='flag-5'>寫(xiě)出</b>時(shí)序裕量足夠的<b class='flag-5'>代碼</b>?

    【明天會(huì)更好】程序員如何在面試時(shí)寫(xiě)出高水平代碼

    面試時(shí)寫(xiě)出代碼能夠把將來(lái)需求可能的變化都考慮進(jìn)去,在需求發(fā)生變化時(shí)能夠盡量減少代碼改動(dòng)的風(fēng)險(xiǎn),那他就向面試官展示自己對(duì)程序擴(kuò)展性和可維
    發(fā)表于 04-18 16:47

    了解c的缺陷才能寫(xiě)出好的程序

    了解c的缺陷才能寫(xiě)出好的程序PCB打樣找華強(qiáng) http://www.hqpcb.com 樣板2天出貨
    發(fā)表于 12-06 14:52

    寫(xiě)出利用Labview自動(dòng)生成ARM Cortex代碼的過(guò)程?

    寫(xiě)出利用Labview自動(dòng)生成ARM Cortex代碼的過(guò)程?
    發(fā)表于 11-14 15:13

    FPGA寫(xiě)出來(lái)的代碼質(zhì)量差

    前幾天草草看了點(diǎn)Verilog語(yǔ)法書(shū),今天自己試著建了一個(gè)工程 (數(shù)碼管顯示 每秒加1)一個(gè) 很簡(jiǎn)答的程序 在FPGA中卻寫(xiě)了一堆(相對(duì)應(yīng)單片機(jī)程序) 而且出現(xiàn)一大堆a(bǔ)lways可讀性非常差這是由于我是一
    發(fā)表于 04-01 04:41

    用verilog寫(xiě)出代碼

    題目描述:設(shè)計(jì)一個(gè)電路,使用時(shí)序邏輯對(duì)一個(gè)單bit信號(hào)進(jìn)行毛刺濾除操作。高電平或者低電平寬度小于4個(gè)時(shí)鐘周期的為毛刺。用verilog寫(xiě)出代碼
    發(fā)表于 07-22 09:18

    使用C語(yǔ)言寫(xiě)出的九九乘法表

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用C語(yǔ)言寫(xiě)出的九九乘法表資料合集免費(fèi)下載。
    發(fā)表于 07-10 08:00 ?1次下載

    這么秀的代碼,你能寫(xiě)出來(lái)嗎?

    這么秀的代碼,你能寫(xiě)出來(lái)嗎? 技術(shù)主管來(lái)了都不好使,main函數(shù)里第一個(gè)函數(shù)必須是這個(gè)。 佛祖保佑版: void godBless(void) { // _ooOoo_ // o8888888o
    的頭像 發(fā)表于 04-04 18:06 ?1672次閱讀

    為什么有時(shí)候會(huì)寫(xiě)出代碼

    寫(xiě)出來(lái)了呢?其實(shí)還是因?yàn)橛行┲R(shí)沒(méi)那么扎實(shí)~就容易被忽略,于是我在團(tuán)隊(duì)群里面強(qiáng)調(diào)了一下這個(gè)問(wèn)題: 所以,本文主要是關(guān)于BeanUtils工具的屬性拷貝以及深拷貝、淺拷貝等問(wèn)題的。好了開(kāi)始正文,
    的頭像 發(fā)表于 08-27 10:23 ?1363次閱讀
    為什么有時(shí)候會(huì)<b class='flag-5'>寫(xiě)出</b>爛<b class='flag-5'>代碼</b>

    一本教你怎么寫(xiě)出讓同事無(wú)法維護(hù)的代碼

    ?對(duì),你沒(méi)看錯(cuò),本文就是教你怎么寫(xiě)出讓同事無(wú)法維護(hù)的代碼。一、程序命名 容易輸入的變量名 。比如:Fred,asdf 單字母的變量名 。比如:a,b,c, x,y,z(如果不夠用,可以考慮a1,a2
    的頭像 發(fā)表于 10-11 15:45 ?1178次閱讀

    教你如何寫(xiě)出性能更高的SystemVerilog代碼

    本文旨在幫助大家降低在編碼過(guò)程中寫(xiě)出低性能和耗內(nèi)存的概率,只要大家在寫(xiě)代碼時(shí)稍注意下,積少成多。
    的頭像 發(fā)表于 07-26 17:31 ?943次閱讀
    教你如何<b class='flag-5'>寫(xiě)出</b>性能更高的SystemVerilog<b class='flag-5'>代碼</b>

    如何寫(xiě)出高效優(yōu)美的C語(yǔ)言代碼

    電子發(fā)燒友網(wǎng)站提供《如何寫(xiě)出高效優(yōu)美的C語(yǔ)言代碼.pdf》資料免費(fèi)下載
    發(fā)表于 11-18 10:55 ?0次下載
    如何<b class='flag-5'>寫(xiě)出</b>高效優(yōu)美的C語(yǔ)言<b class='flag-5'>代碼</b>

    如何寫(xiě)出穩(wěn)定的單片機(jī)代碼

    這篇文章分享怎么寫(xiě)出穩(wěn)定的單片機(jī)代碼。? ?? 我對(duì)優(yōu)秀代碼的理解,大體分為兩個(gè)部分:高效和穩(wěn)定。 ? 兩者都能做到很好的,如果靠自己摸索,沒(méi)有刻意去練習(xí),可能需要花10年,甚至更久
    的頭像 發(fā)表于 11-15 16:40 ?410次閱讀
    如何<b class='flag-5'>寫(xiě)出</b>穩(wěn)定的單片機(jī)<b class='flag-5'>代碼</b>