成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何編寫(xiě)可讀的代碼

開(kāi)發(fā) 前端
在過(guò)去的五年里,我們收集了上百個(gè)“壞代碼”的例子(其中很大一部分是我們自己寫(xiě)的),并且分析是什么原因使它們變壞,使用什么樣的原則和技術(shù)可以讓它們變好。

代碼最重要的讀者不再是編譯器、解釋器或者電腦,而是人。寫(xiě)出的代碼能讓人易于理解、輕松維護(hù)、容易擴(kuò)展的程序員才是專(zhuān)業(yè)的程序員。

編寫(xiě)可讀的代碼

代碼應(yīng)當(dāng)易于理解

在過(guò)去的五年里,我們收集了上百個(gè)“壞代碼”的例子(其中很大一部分是我們自己寫(xiě)的),并且分析是什么原因使它們變壞,使用什么樣的原則和技術(shù)可以讓它們變好。我們發(fā)現(xiàn)所有的原則都源自同一個(gè)主題思想。

關(guān)鍵思想:代碼應(yīng)當(dāng)易于理解

我們相信這是當(dāng)你考慮要如何寫(xiě)代碼時(shí)可以使用的最重要的指導(dǎo)原則。我們會(huì)展示如何把這條原則應(yīng)用于你每天編碼工作的各個(gè)不同方面。但在開(kāi)始之前,我們會(huì)詳細(xì)地介紹這條原則并證明它為什么這么重要。

是什么讓代碼變得“更好”

大多數(shù)程序員(包括兩位作者)依靠直覺(jué)和靈感來(lái)決定如何編程。我們都知道這樣的代碼:

  1. for (Node* node = list->head; node != NULL; nodenode = node->next)     
  2. Print (node->data); 

比下面的代碼好:

  1. Node* node = list->head;     
  2. if (node == NULL) return;     
  3. while (node->next != NULL) {     
  4. Print (node->data);     
  5. node = node->next;     
  6. }     
  7. if (node != NULL) Print (node->data); 

(盡管兩個(gè)例子的行為完全相同。)但很多時(shí)候這個(gè)選擇會(huì)更艱難。例如,這段代碼:

  1. return exponent >= 0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);  

它比下面這段要好些還是差些?

  1. if (exponent >= 0) {  
  2. return mantissa * (1 << exponent);  
  3. else {     
  4. return mantissa / (1 << -exponent);     

第一個(gè)版本更緊湊,但第二個(gè)版本更直白。哪個(gè)標(biāo)準(zhǔn)更重要呢?一般情況下,在寫(xiě)代碼時(shí)你如何來(lái)選擇?

可讀性基本定理

在對(duì)很多這樣的例子進(jìn)行研究后,我們總結(jié)出,有一種對(duì)可讀性的度量比其他任何的度量都要重要。因?yàn)樗侨绱酥匾覀儼阉凶?ldquo;可讀性基本定理”。

關(guān)鍵思想:代碼的寫(xiě)法應(yīng)當(dāng)使別人理解它所需的時(shí)間最小化。

這是什么意思?其實(shí)很直接,如果你叫一個(gè)普通的同事過(guò)來(lái),測(cè)算一下他通讀你的代碼并理解它所需的時(shí)間,這個(gè)“理解代碼時(shí)間”就是你要最小化的理論度量。

并且當(dāng)我們說(shuō)“理解”時(shí),我們對(duì)這個(gè)詞有個(gè)很高的標(biāo)準(zhǔn)。如果有人真的完全理解了你的代碼,他就應(yīng)該能改動(dòng)它、找出缺陷并且明白它是如何與你代碼的其他部分交互的。

現(xiàn)在,你可能會(huì)想:“誰(shuí)會(huì)關(guān)心是不是有人能理解它?我是唯一使用這段代碼的人!”就算你從事只有一個(gè)人的項(xiàng)目,這個(gè)目標(biāo)也是值得的。那個(gè)“其他人”可能就是 6 個(gè)月的你自己,那時(shí)你自己的代碼看上去已經(jīng)很陌生了。而且你永遠(yuǎn)也不會(huì)知道——說(shuō)不定別人會(huì)加入你的項(xiàng)目,或者你“丟棄的代碼”會(huì)在其他項(xiàng)目里重用。

總是越小越好嗎

一般來(lái)講,你解決問(wèn)題所用的代碼越少就越好。很可能理解 2000 行代碼寫(xiě)成的類(lèi)所需的時(shí)間比 5000 行的類(lèi)要短。但少的代碼并不總是更好!很多時(shí)候,像下面這樣的一行表達(dá)式:

  1. assert ((!(bucket = FindBucket (key))) !bucket->IsOccupied ()); 

理解起來(lái)要比兩行代碼花更多時(shí)間:

  1. bucket = FindBucket (key);     
  2. if (bucket != NULL) assert (!bucket->IsOccupied ()); 

類(lèi)似地,一條注釋可以讓你更快地理解代碼,盡管它給代碼增加了長(zhǎng)度:

  1. // Fast version of “hash = (65599 * hash) + c”     
  2. hash = (hash << 6) + (hash << 16) – hash + c; 

因此盡管減少代碼行數(shù)是一個(gè)好目標(biāo),但把理解代碼所需的時(shí)間最小化是一個(gè)更好的目標(biāo)。

理解代碼所需的時(shí)間是否與其他目標(biāo)有沖突

你可能在想:“那么其他約束呢?像是使代碼更有效率,或者有好的架構(gòu),或者容易測(cè)試等?這些不會(huì)在有些時(shí)候與使代碼容易理解這個(gè)目標(biāo)沖突嗎?”我們發(fā)現(xiàn)這些其他目標(biāo)根本就不會(huì)互相影響。就算是在需要高度優(yōu)化代碼的領(lǐng)域,還是有辦法能讓代碼同時(shí)可讀性更高。并且讓你的代碼容易理解往往會(huì)把它引向好的架構(gòu)且容易測(cè)試。有些程序員對(duì)于任何沒(méi)有完美地分解的代碼都不自覺(jué)地想要修正它。這時(shí)很重要的是要停下來(lái)并且想一下:“這段代碼容易理解嗎?”如果容易,可能轉(zhuǎn)而關(guān)注其他代碼是沒(méi)有問(wèn)題的。

最難的部分

是的,要經(jīng)常地想一想其他人是不是會(huì)覺(jué)得你的代碼容易理解,這需要額外的時(shí)間。這樣做就需要你打開(kāi)大腦中從前在編碼時(shí)可能沒(méi)有打開(kāi)的那部分功能。但如果你接受了這個(gè)目標(biāo)(像我們一樣),我們可以肯定你會(huì)成為一個(gè)更好的程序員,會(huì)產(chǎn)生更少的缺陷,從工作中獲得更多的自豪,并且編寫(xiě)出你周?chē)硕紣?ài)用的代碼。

本文節(jié)選自《編寫(xiě)可讀代碼的藝術(shù)》一書(shū),Dustin Boswell、Trevor Foucher 著,尹哲、鄭秀雯譯,由機(jī)械工業(yè)出版社出版。

原文鏈接:http://blog.jobbole.com/23599/

【編輯推薦】

  1. 再議頁(yè)面前端的水有多深
  2. Web前端:11個(gè)讓你代碼整潔的原則
  3. 寫(xiě)更少的代碼
  4. 復(fù)制粘貼代碼真的有問(wèn)題嗎?
  5. 前端工程師的價(jià)值體現(xiàn)在哪里?
責(zé)任編輯:張偉 來(lái)源: 伯樂(lè)在線
相關(guān)推薦

2013-03-22 16:43:03

可讀代碼代碼的藝術(shù)代碼編寫(xiě)

2024-04-23 08:01:20

面向?qū)ο?/a>C 語(yǔ)言代碼

2011-04-15 15:16:18

代碼編程

2015-08-27 13:11:18

JavaScript代碼

2021-10-09 10:24:53

Java 代碼可讀性

2022-06-07 09:30:35

JavaScript變量名參數(shù)

2024-06-24 14:19:48

2021-03-17 08:00:59

JS語(yǔ)言Javascript

2024-03-20 08:00:00

軟件開(kāi)發(fā)Java編程語(yǔ)言

2023-10-10 08:00:00

2014-04-25 09:02:17

LuaLua優(yōu)化Lua代碼

2013-04-15 09:02:43

JavaScriptJS

2015-01-28 14:30:31

android代碼

2022-06-27 06:23:23

代碼編程

2021-06-08 09:35:11

Cleaner ReaReact開(kāi)發(fā)React代碼

2022-12-15 10:52:26

代碼開(kāi)發(fā)

2010-02-05 16:49:05

編寫(xiě)Android 代

2012-03-15 13:36:51

云計(jì)算JavaSpring框架

2015-12-17 13:19:29

編寫(xiě)高性能Swift

2009-02-01 14:34:26

PythonUnix管道風(fēng)格
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 成人国产精品 | 狠狠的操 | 另类二区| 国产亚洲精品久久午夜玫瑰园 | 国产成人99久久亚洲综合精品 | 你懂的免费在线 | 成年人在线视频 | 欧美日韩国产一区二区三区 | 欧美a v在线 | 欧美一级特黄aaa大片在线观看 | 一区视频| 日皮视频免费 | 在线视频a | 欧美色欧美亚洲另类七区 | 国际精品久久 | 伊人手机在线视频 | 欧美成人免费电影 | 精品96久久久久久中文字幕无 | 日韩在线观看一区 | 日本中文在线视频 | 国产精品国产a级 | 成人一区精品 | 亚洲综合视频 | 精品视频一区二区三区在线观看 | av天天干 | 成人免费视频在线观看 | 精品视频在线免费观看 | 久久久久久精 | 国产精品久久久久婷婷二区次 | 日本国产高清 | 欧美人成在线视频 | 国产精品 亚洲一区 | 久久精品视频免费看 | 国产资源在线视频 | 男女性毛片 | 欧美11一13sex性hd | 欧美精品日韩精品国产精品 | 九九亚洲精品 | 国产精品欧美精品 | 日中文字幕在线 | 亚洲国产自产 |