编写好代码的10条戒律
1.DRY:不要重復(fù)你自己(Don’t repeat yourself)
DRY是一條最容易理解但又是相對(duì)比較難以應(yīng)用的原則。它是指當(dāng)你在兩處或者更多的地方發(fā)現(xiàn)相似代碼時(shí),我們應(yīng)當(dāng)把它們抽象成一個(gè)新的函數(shù),在之前重復(fù)的地方調(diào)用新的函數(shù)并帶上適當(dāng)?shù)膮?shù)。
DRY也許是最普遍的一條編程原則,我從未發(fā)現(xiàn)一個(gè)開(kāi)發(fā)人員認(rèn)為編寫(xiě)重復(fù)的代碼是件好事。但是我發(fā)現(xiàn)一些開(kāi)發(fā)人員在編寫(xiě)單元測(cè)試時(shí)忘記了這條原則,例如:設(shè)想一下你改變了一個(gè)類的接口,之前已經(jīng)為這個(gè)類編寫(xiě)了很多的單元測(cè)試,如果你沒(méi)有應(yīng)用DRY原則,這時(shí)你需要手動(dòng)去修改所有使用這個(gè)類接口的調(diào)用,來(lái)與每一個(gè)測(cè)試實(shí)例的新簽名匹配。
2.編寫(xiě)短小的函數(shù)/方法
有三個(gè)非常好的理由,選擇編寫(xiě)短小的函數(shù)。
1.代碼會(huì)更容易閱讀。
2.代碼會(huì)更容易重用(短小的函數(shù)更容易產(chǎn)生松耦合)。
3.代碼會(huì)更易于測(cè)試。
編者注:松耦合:在軟件領(lǐng)域中,“耦合”一般指軟件組件之間的依賴程度。耦合度松的軟件會(huì)有較好的擴(kuò)展性。
3.給類、函數(shù)和變量使用好的命名
直接使用其他開(kāi)發(fā)者的代碼而不需要閱讀說(shuō)明文檔,沒(méi)有什么比這更好的事情了,因?yàn)榇a中的類名、函數(shù)名已經(jīng)能夠告訴我們所有需要的信息。所以,采用這種方法,每次在為你的代碼中任何元素進(jìn)行命名的之前請(qǐng)花上幾秒鐘(思考),這會(huì)讓大家的生活變得更輕松。
4.為每個(gè)類分配正確的職責(zé)
一個(gè)類只承擔(dān)一個(gè)職責(zé)(單一權(quán)責(zé)),聽(tīng)起來(lái)和有些人知道的SOLID原則很相似,但是這里不是指任意的職責(zé),而是正確的職責(zé)。所以,如果我們要設(shè)計(jì)一個(gè)顧客類,我們不會(huì)給它創(chuàng)建一個(gè)銷售的行為,我們只會(huì)讓它處理所有與一個(gè)客戶相關(guān)的數(shù)據(jù)。
編者注:SOLID:面向?qū)ο笤O(shè)計(jì)的五項(xiàng)原則(是SRP單一職責(zé)原則、OCP開(kāi)閉原則、LSP李式代換原則、ISP依賴反轉(zhuǎn)原則和 DIP接口分離原則,首字符的縮寫(xiě))。
5.保持代碼的條理性
代碼條理性分兩個(gè)層次
物理上的條理性:無(wú)論你采用了哪種結(jié)構(gòu),包、命名空間、文件夾等等,用一種更容易并且憑直覺(jué)就能找到代碼存放在哪里的方式來(lái)組織你編寫(xiě)的類。
邏輯上的條理性:不論邏輯上從屬關(guān)系如何,(只要有邏輯從屬關(guān)系)類都應(yīng)該能夠互相訪問(wèn)彼此的成員變量,但是如果從屬于不同的邏輯結(jié)構(gòu)就應(yīng)當(dāng)只能通過(guò)接口來(lái)訪問(wèn)。這種邏輯分組通常會(huì)被實(shí)現(xiàn)成(邏輯)層、服務(wù)等。
6.編寫(xiě)很多的單元測(cè)試
測(cè)試越多越好,它們是所有代碼變動(dòng)的安全保證,我們會(huì)在將來(lái)的某一天需要運(yùn)行這些測(cè)試代碼。
7.盡早且經(jīng)常地重構(gòu)代碼(Refactor often and sooner)
軟件開(kāi)發(fā)是一個(gè)持續(xù)發(fā)現(xiàn)的過(guò)程,為了編寫(xiě)保持與新增/改變的需求匹配的高質(zhì)量代碼,隨著開(kāi)發(fā)的進(jìn)行,重構(gòu)代碼是必不可少的。由于重構(gòu)是一項(xiàng)帶有風(fēng)險(xiǎn)的任務(wù),需要有兩個(gè)主要的前提條件,來(lái)避免由于重構(gòu)給系統(tǒng)引入新的錯(cuò)誤。
1.編寫(xiě)很多的單元測(cè)試
2.每一次重構(gòu)的幅度要比較小。在開(kāi)發(fā)軟件過(guò)程中,開(kāi)始重構(gòu)2000行代碼,3個(gè)小時(shí)以后發(fā)現(xiàn)所有的代碼都不能工作,并且導(dǎo)致問(wèn)題的原因無(wú)從查找,因此需要恢復(fù)到最初版本,幾乎沒(méi)什么事能比這更讓人抓狂了。
8.注釋是惡魔
這條特殊戒律有一點(diǎn)爭(zhēng)議,我們大多數(shù)人學(xué)到的是“注釋是一個(gè)好的習(xí)慣”,并且在一段晦澀的代碼中有一段注釋會(huì)比僅僅只有代碼好的多,這里我的觀點(diǎn)是:給晦澀的代碼加注釋還不如僅僅留下代碼,只需要重構(gòu)這段代碼直到它變得可讀為止。(編注:當(dāng)然了,除了作者說(shuō)的這種類型的代碼,在其他情況下,還是得添加必要的注釋,這不僅方便自己日后查看,更有利于后來(lái)者維護(hù),請(qǐng)參閱《提高代碼可讀性的10個(gè)注釋技巧?》一文。
9.要面向接口編程,不要面向?qū)崿F(xiàn)編程(Code to an interface, not to an implementation)
這是一條經(jīng)典的原則,面向接口編程會(huì)讓我們從實(shí)現(xiàn)的細(xì)節(jié)中解放出來(lái),我們只要定義一個(gè)協(xié)議,并且依據(jù)協(xié)議調(diào)用定義的操作,期望(對(duì)方,即被調(diào)用的代碼)能把實(shí)際的實(shí)現(xiàn)或者運(yùn)行時(shí)態(tài)的實(shí)現(xiàn)傳遞給我們的代碼。
10.對(duì)代碼進(jìn)行復(fù)查
我們都會(huì)犯錯(cuò)誤,沒(méi)有什么能比請(qǐng)別人對(duì)我們代碼做一個(gè)非正式快速?gòu)?fù)查更好的辦法來(lái)查找錯(cuò)誤了。最好不要等到代碼都完成以后再?gòu)?fù)查,當(dāng)某些重要部分的代碼完成后,或者離上一次復(fù)查相隔幾天之后,就進(jìn)行復(fù)查。
總結(jié)
以上是生活随笔為你收集整理的编写好代码的10条戒律的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在活动完成之后的格式工厂下载
- 下一篇: 飞鸽传书官方网站方式hook一些常见的枚