什么是好代碼

1. 好代碼必須是看起來(lái)很舒服典蝌,很干凈

象一篇好文章曙砂,不羅嗦,容易懂骏掀,有頭有尾

各個(gè)層次鸠澈,模塊及函數(shù)分工明確,各司其職, 望文知義

接口即契約截驮,要足夠簡(jiǎn)單笑陈,易懂易用, 窄接口好過(guò)寬接口

其實(shí)只要符合代碼規(guī)范侧纯,命名簡(jiǎn)單易懂新锈,代碼就沒(méi)那么丑

參見(jiàn) Google 的代碼風(fēng)格指南

看看重構(gòu)那本書中的臭味介紹, 可以提高品味

2. 好代碼要符合基本的編碼原則

首先我們先談?wù)剮讉€(gè)軟件開(kāi)發(fā)的普適原則

KISS

KISS: Keep It Simple and Straight 保持簡(jiǎn)單和直接, 適當(dāng)隱藏復(fù)雜性

或者

KISS: Keep It Simple and Stupid 保持簡(jiǎn)單, 象傻瓜一樣, 不要讓別人多加思考

軟件接口或 API 的設(shè)計(jì)要讓人一看就明白, 一看就知道作者的意圖和想法, 如何使用它, 有什么結(jié)果和可能的異常及副作用. 看過(guò)很多代碼, 踩過(guò)許多坑眶熬, 大多是作者或者我自己使用了出乎意料的實(shí)現(xiàn)妹笆, 不做好必要的抽象和封裝块请, 復(fù)雜的判斷和算法到處都是

DRY – Don't Repeat Yourself

別重復(fù)你自己, 如有重復(fù)代碼, 請(qǐng)抽象或重用

SRP - Single Responsibility Principle

單一職責(zé)原則: 就一類而言, 應(yīng)該僅有一個(gè)引起它變化的原因

也有一個(gè)別稱 DOTADIW - Do One Thing and Do It Well 就做一件事并做好它

OCP - Open Close Principle

開(kāi)放封閉原則: 軟件實(shí)體(類,模塊,函數(shù)等)應(yīng)該是可以擴(kuò)展的, 但是不可修改

LSP

LSP替換基類原則: 子類型應(yīng)該可以替換掉它們的基類型

DIP

DIP依賴倒置原則: 抽象不應(yīng)該依賴于細(xì)節(jié), 細(xì)節(jié)應(yīng)該依賴于抽象

ISP

ISP接口隔離原則: 不應(yīng)該強(qiáng)迫客戶依賴于它們不用的方法, 接口屬于客戶, 不屬于它所在的類層次結(jié)構(gòu)

REP

REP重用發(fā)布等價(jià)原則: 重用的粒度就是發(fā)布的粒度

CCP

CCP共同封閉原則: 包中的所有類對(duì)于同一類性質(zhì)的變化應(yīng)該是共同封閉的. 一個(gè)變化若對(duì)一個(gè)包產(chǎn)生影響, 則將對(duì)包中所有的類產(chǎn)生影響, 而對(duì)于其他的包不造成任何影響

CRP

CRP共同重用原則: 一個(gè)包中的所有類應(yīng)該是共同重用的. 如果重用了包中的一個(gè)類, 那么就要重用包中的所有類

ADP

ADP無(wú)環(huán)依賴原則: 在包的依賴關(guān)系圖不允許存在環(huán)

SDP

SDP穩(wěn)定依賴原則: 朝著穩(wěn)定的方向進(jìn)行依賴.

SAP

SAP穩(wěn)定抽象原則: 包的抽象程度應(yīng)該和其穩(wěn)定程度一致

設(shè)計(jì)模式和面向?qū)ο笤O(shè)計(jì)中講了很多,不再贅述

3. 好代碼要易于理解拳缠,測(cè)試和修改

封裝好復(fù)雜性墩新,區(qū)分開(kāi)經(jīng)常變化與基本不變的代碼, 適當(dāng)抽取易變參數(shù)作為配置

還是書里那句話,高內(nèi)聚窟坐,低耦合海渊,依賴倒置

例如最常用的 MVC 模式,為什么我們要分成模型哲鸳,視圖和控制器三塊臣疑,原因之一就在于分開(kāi)易變的與不易變的,分開(kāi)不會(huì)在一起變化的部分徙菠,減小每次修改的范圍讯沈。

如果某個(gè)方面的功能需要修改,最好是改個(gè)配置婿奔, 其次是加幾行代碼或傳個(gè)不同參數(shù)缺狠,最差的就是改多個(gè)地方,加多個(gè)判斷萍摊, 作霰彈式修改

4. 好代碼要考慮周到

各種邏輯流程和意外情況的處理要面面俱到, 單元和模塊測(cè)試要覆蓋異常邏輯和邊界

對(duì)于服務(wù)質(zhì)量 SLA 要考慮周全, 簡(jiǎn)單說(shuō)起來(lái)就是滿足用戶的以下基本需求

  1. 功能性
  2. 穩(wěn)定性
  3. 可靠性
  4. 性能
  5. 可維護(hù)性
  6. 可移植性
  7. 靈活性

5. 好代碼要與時(shí)俱進(jìn)挤茄,自我蛻變

人會(huì)變老,代碼也會(huì)冰木,新業(yè)務(wù)穷劈,新技術(shù),新架構(gòu)片酝,新框架層出不窮囚衔,要大膽試驗(yàn),小心引入雕沿,逐步演進(jìn)练湿,不必抱殘守缺,也不要盲目沖動(dòng)

一般來(lái)說(shuō)审轮,要封裝好業(yè)務(wù)邏輯肥哎,核心業(yè)務(wù)不會(huì)大變,即使推到重寫也要理解和參照老系統(tǒng)的業(yè)務(wù)流程

最后疾渣,引述一下,Python 之禪

Python 之禪

雖然說(shuō)的是Python, 其實(shí)適用于多數(shù)編程語(yǔ)言

英文 中文
Beautiful is better than ugly. 美比丑好
Explicit is better than implicit. 明顯比隱晦好
Simple is better than complex. 簡(jiǎn)單比復(fù)雜好
Complex is better than complicated. 復(fù)雜比難懂好
Flat is better than nested. 扁平比嵌套好
Sparse is better than dense. 稀疏比稠密好
Readability counts. 可讀性很重要
Special cases aren't special enough to break the rules. 特例也不要打破這個(gè)原則
Although practicality beats purity. 盡管實(shí)踐會(huì)破壞純潔性
Errors should never pass silently. 錯(cuò)誤還是不能讓其悄然滑過(guò)
Unless explicitly silenced. 除非你明確聲明不用理會(huì)它
In the face of ambiguity, refuse the temptation to guess. 別讓人來(lái)猜測(cè)不確定的可能性
There should be one-- and preferably only one --obvious way to do it. 應(yīng)該有一個(gè)且只有一個(gè)比較好的明顯的方法來(lái)做事
Although that way may not be obvious at first unless you're Dutch. 盡管那個(gè)方法可能并非一開(kāi)始就顯而易見(jiàn)
Now is better than never. 現(xiàn)在就做比永遠(yuǎn)不做好
Although never is often better than right now. 盡管永遠(yuǎn)不做經(jīng)常比馬上就動(dòng)手做好
If the implementation is hard to explain, it's a bad idea. 如果實(shí)現(xiàn)很難解釋清楚, 那它不是一個(gè)好主意
If the implementation is easy to explain, it may be a good idea. 如果實(shí)現(xiàn)很容易說(shuō)清楚, 那它是個(gè)好主意
Namespaces are one honking great idea – let's do more of those! 命名空間是個(gè)絕妙點(diǎn)子, 讓我們那樣做得更多

簡(jiǎn)單總結(jié)一下

  • 文學(xué)化編程杈女,想清楚,整明白达椰,胸有成竹翰蠢,下手千行
  • 測(cè)試驅(qū)動(dòng),不做額外的無(wú)用功啰劲,不追求覆蓋率,為的是增強(qiáng)自信心
  • 度量驅(qū)動(dòng)蝇裤,代碼上線怎么辦,如何易于度量和調(diào)優(yōu)
  • 為未來(lái)設(shè)計(jì)有限的靈活性栓辜,高聚低耦恋拍,無(wú)需多改容易擴(kuò)展
  • 考慮周全,足夠的健壯藕甩,不易出錯(cuò)城须,不怕出錯(cuò)

參考

  • Agile Software Development, Principles, Patterns, and Practices by Robert C. Martin
  • Clean code by Robert C. Martin
  • Refactoring: Improving the Design of Existing Code Martin Fowler
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扯饶,一起剝皮案震驚了整個(gè)濱河市羡藐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仆嗦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆甜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡集绰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門罕袋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)碍岔,“玉大人,你說(shuō)我怎么就攤上這事蔼啦。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵饥侵,是天一觀的道長(zhǎng)唠摹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)勾拉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任成肘,我火速辦了婚禮,結(jié)果婚禮上斧蜕,老公的妹妹穿的比我還像新娘双霍。我一直安慰自己批销,他們只是感情好洒闸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布丘逸。 她就那樣靜靜地躺著,像睡著了一般深纲。 火紅的嫁衣襯著肌膚如雪劲妙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天镣奋,我揣著相機(jī)與錄音,去河邊找鬼富雅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛没佑,可吹牛的內(nèi)容都是我干的温赔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼待秃!你這毒婦竟也來(lái)了痹屹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤志衍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后培廓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體春叫,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年价匠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霞怀。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莉给,死狀恐怖廉沮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情滞时,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布曼玩,位于F島的核電站,受9級(jí)特大地震影響黍判,放射性物質(zhì)發(fā)生泄漏篙梢。R本人自食惡果不足惜顷帖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一贬墩、第九天 我趴在偏房一處隱蔽的房頂上張望榴嗅。 院中可真熱鬧陶舞,春花似錦、人聲如沸肿孵。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雅宾。三九已至,卻和暖如春眉抬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜀变。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工库北, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爬舰,地道東北人寒瓦。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像垃你,于是被迫代替她去往敵國(guó)和親喂很。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惜颇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 前言 最近在團(tuán)隊(duì)推行Code Review凌摄,遇到一個(gè)頭痛的問(wèn)題。當(dāng)向伙伴的代碼提一個(gè)comment時(shí)望伦,他們不解為什...
    CatchZeng閱讀 5,170評(píng)論 1 19
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)屯伞,斷路器,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法珠移,類相關(guān)的語(yǔ)法末融,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法勾习,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,623評(píng)論 18 399
  • ① 我分手了艺栈,我記得第一次見(jiàn)到他的時(shí)候,就一個(gè)字湿右,帥。那張清秀的臉蛋吭狡,炯炯有神的眼睛,鼻如懸膽划煮,白嫩的皮膚,完美的...
    只懂女人心閱讀 640評(píng)論 3 7
  • 文JIE胭脂雪 【一念天堂地獄】目錄 歡迎點(diǎn)擊 【上一章】一念天堂地獄28——自卑虛榮是種病,得治瞎疼! 既然有了新歡...
    JIE胭脂雪閱讀 412評(píng)論 0 1