數(shù)據(jù)與算法之美——如何提高代碼的可讀性

轉(zhuǎn)載:http://mp.weixin.qq.com/s/3Tj2Ku9LEb9o4xYhXTqIUA? ? 有刪改

[嵌牛導(dǎo)讀]


? ? ? 代碼可讀性是計算機(jī)編程領(lǐng)域中普遍存在的問題悟狱,也是我們成為開發(fā)者首先要學(xué)習(xí)的事情之一炸枣。本篇文章給大家推薦在編寫程序過程中提高代碼可讀性的十種方法获三!

[嵌牛鼻子]


? ? ? ? 注釋和文檔,保持一致的縮進(jìn)侈咕,避免顯而易見的注釋,代碼分組器紧,保持一致的命名規(guī)范耀销,DRY原則,避免深嵌套铲汪,限制行長度熊尉,文件和文件夾的組織,一致的臨時變量命名

[嵌牛提問]


? ? ? 如何高效的提高代碼的可讀性桥状?如何運(yùn)用提高代碼可讀性的方法迅速的讀懂代碼帽揪?

[嵌牛正文]


1 - 注釋和文檔

? ? ? ? IDE(集成開發(fā)環(huán)境)已經(jīng)存在了很長一段時間,使用 IDE 注釋代碼比以往容易得多辅斟,某些確切的注釋標(biāo)準(zhǔn)可以讓 IDE 和其它工具以不同的方式來完成注釋转晰。

例如:

圖片發(fā)自簡書App

? ? ? 在這里添加到函數(shù)定義前的注釋可以在使用函數(shù)的時候顯示出來,甚至在其它文件中使用這個函數(shù)也沒問題士飒。

? ? ? 下面是另一個示例查邢,關(guān)于調(diào)用一個第三方庫的函數(shù):

圖片發(fā)自簡書App

圖片發(fā)自簡書App

? ? ? ? 在這些示例中,注釋(或文檔)的類型是基于 PHPDoc 的酵幕,使的 IDE 是 Aptana扰藕。

2 - 保持一致的縮進(jìn)

? ? ? 假設(shè)你已經(jīng)知道代碼需要縮進(jìn)。不過值得注意的是芳撒,最好保持縮進(jìn)樣式一致邓深∥辞牛縮進(jìn)代碼的方式很多,這里最最常見的兩種:

風(fēng)格 1:

function foo() {?

? ? if($maybe){?

? ? ? ? do_it_now();?

? ? ? ? again();?

? ? } else{?

? ? ? ? abort_mission();?

? ? }?

? ? finalize();?

}

風(fēng)格 2:

function foo(){? ?

if($maybe) {? ?

do_it_now();?

? ? ? ? again();?

? ? }else{? ?

abort_mission();?

? ? }?

? ? finalize();?

}

? ? ? ? 沒有“最好”的風(fēng)格來讓每一個人都去遵循芥备,實際上冬耿,最好的風(fēng)格就是一致的風(fēng)格。如果你是團(tuán)隊的一員萌壳,或者你在向某個項目貢獻(xiàn)代碼亦镶,你就應(yīng)該遵循項目中正在使用的風(fēng)格「の停縮進(jìn)風(fēng)格間并不總是會有明顯的區(qū)別缤骨。有時候,不同的規(guī)則會產(chǎn)生混淆尺借。比如绊起,在 PEAR 編碼標(biāo)準(zhǔn)中,前大括號“{”與控制結(jié)構(gòu)在同一行褐望,但在函數(shù)定義中卻需要換行勒庄。

PEAR 風(fēng)格:

function foo(){? ? ? ? ? ? ? ? ? ? ?

// 放在下一行

? ? if($maybe){? ? ? ?

? ? ? // 放在同一行?

? ? ? ? do_it_now();?

? ? ? ? again();?

? ? }else{?

? ? ? abort_mission();?

? ? }?

? ? finalize();?

}

? ? ? ? 另外,請注意瘫里,縮進(jìn)是用的 4 個空格而不是制表符实蔽。

3 - 避免顯而易見的注釋

? ? ? ? 注釋代碼非常棒,但是谨读,如果注釋只是簡單的重復(fù)就顯得多余了局装。

例如:

// 獲取國家/地區(qū)代碼?

$country_code = get_country_code($_SERVER['REMOTE_ADDR']);?

// 如果國家/地區(qū)代碼是 US?

if ($country_code == 'US'){?

// 在表單中顯示“州”輸入框?

echo form_input_state();?

}

? ? ? 如果文本是顯而易見的,真的沒必要在注釋里再寫一次劳殖。如果你一定要在代碼里寫點注釋铐尚,可以把它們合并在一行:

// 對美國用戶顯示“州”輸入框?

$country_code = get_country_code($_SERVER['REMOTE_ADDR']);?

if ($country_code == 'US'){?

echo form_input_state();?

}

4 - 代碼分組

? ? ? ? 某些任務(wù)往往不是幾句代碼就能解決的,那最好把這些任務(wù)代碼分為不同的代碼段哆姻,在它們之間添加一些空行宣增。

示例

// get list of forums? $forums = array();?

$r = mysql_query("SELECT id, name, description FROM forums");?

while ($d = mysql_fetch_assoc($r)){?

$forums[] = $d;?

}?

// load the templates?

load_template('header');?

load_template('forum_list', $forums);?

load_template('footer');

? ? ? 在每段代碼前添加注釋可以加強(qiáng)視覺分離效果。

5 - 保持一致的命名規(guī)范

? ? ? ? PHP 本身有時候并不遵循一致的命名規(guī)范:

strpos() vs. str_split()

imagetypes() vs. image_type_to_extension()

? ? ? 首先矛缨,名字應(yīng)該有單詞的邊界爹脾。下面是兩種流行的選擇:

駝峰風(fēng)格(camelCase):除第一個單詞外每個單詞的第一個字母都大寫。

下劃線(underscores): 在單詞間使用下劃線分隔箕昭,如:mysql_real_escape_string()灵妨。

? ? ? ? 這一點與我前面提到使用不同縮進(jìn)風(fēng)格的情況相似。如果項目中已經(jīng)在使用某個約定落竹,你應(yīng)該遵循它泌霍。另外,某些語言平臺往往會有一個特定的命名規(guī)范述召。比如在 Java 中朱转,多數(shù)代碼使用駝峰命名風(fēng)格蟹地,而多數(shù) PHP 程序員使用下劃線命名風(fēng)格。

? ? ? ? 這些網(wǎng)絡(luò)也可以混合使得藤为。有些開發(fā)者喜歡對過程函數(shù)和類使用下劃線風(fēng)格锈津,但對類方法使用駝峰風(fēng)格:

class Foo_Bar {?

? ? publicfunctionsomeDummyMethod(){?

}

6 - DRY 原則

? ? ? ? DRY 代表不要重復(fù)你勞動(Don't Repeat Yourself)。也被稱為 DIE:復(fù)制是不可接受的(Duplication is Evil)凉蜂。

規(guī)定:

? ? ? ? “每個知識必須在一個系統(tǒng)內(nèi)具有一個唯一的、明確的性誉、權(quán)威的表示窿吩。”大多數(shù)應(yīng)用程序(或通用的計算機(jī))的目標(biāo)是使重復(fù)的任務(wù)變得自動化错览。這個原則應(yīng)該在所有的代碼中保留纫雁,包括 Web 應(yīng)用程序中。同一段代碼不應(yīng)該一再地被重復(fù)倾哺。例如轧邪,大多數(shù) Web 應(yīng)用程序由許多頁面組成。這些頁面很可能包含通用的元素羞海。標(biāo)題和頁腳通常是最佳證明忌愚。將這些頁眉和頁腳在每個頁面中復(fù)制一份并不是一個好主意。 Jeffrey Way 在此解釋了如何在 CodeIgniter 中創(chuàng)建模板却邓。

$this->load->view('includes/header');? ? ?

$this->load->view($main_content);? ? ?

$this->load->view('includes/footer');

7 - 避免深嵌套

? ? ? ? 過多的嵌套層次會使代碼變得難以閱讀和跟蹤:

functiondo_stuff(){?

// ...? if (is_writable($folder)){?

? ? if ($fp = fopen($file_path, 'w')){?

? ? ? ? if ($stuff = get_some_stuff()){?

? ? ? ? ? ? if (fwrite($fp, $stuff)){?

// ...?

? }?

? ? ? else?

? {?

? ? returnfalse;?

? }?

? }?

? ? ? ? 為了提高可讀性硕糊,通常會通過修改代碼來減少嵌套的層級:

functiondo_stuff(){?

// ...? if (!is_writable($folder)){?

returnfalse;?

}?

if (!$fp = fopen($file_path, 'w')){?

returnfalse;?

}?

if (!$stuff = get_some_stuff()){?

returnfalse;?

}?

if (fwrite($fp, $stuff)){?

// ...? }?

? else? {?

returnfalse;?

}?

}

8 - 限制行長度

? ? ? 人眼在閱讀窄長的列式文本時感覺更舒適,這也是為什么報紙的文章都是這個樣子腊徙,避免代碼行水平過長是一種良好的變成習(xí)慣:

//bad?

$my_email->set_from('test@email.com')->add_to('programming@gmail.com')->set_subject('Methods Chained')->set_body('Some long message')->send();?

// good?

$my_email? ? ?

->set_from('test@email.com')? ? ?

? ->add_to('programming@gmail.com')? ? ?

? ->set_subject('Methods Chained')? ? ?

? ->set_body('Some long message')? ? ?

? ->send();? ? ?

// bad?

$query= "SELECT id, username, first_name, last_name, status FROM users LEFT JOIN user_posts USING(users.id, user_posts.user_id) WHERE post_id = '123'";? ? ?

// good?

$query= "SELECT id, username, first_name, last_name, status? ? ?

? FROM users? ? ?

? LEFT JOIN user_posts? ?

? USING(users.id, user_posts.user_id)? ? ?

? WHERE post_id = '123'";

? ? ? ? 當(dāng)然简十,如果有人,比如 Vim 用戶撬腾,想要在終端窗口中閱讀你的代碼螟蝙,最好將代碼行的長度限制在 80 個字符左右。

9 - 文件和文件夾的組織

? ? ? 從技術(shù)上講民傻,你可以在單個文件中編寫整個應(yīng)用程序的代碼胰默。但是,這對閱讀和維護(hù)來說將是一個噩夢饰潜。最好的方法之一就是使用框架或者模擬其文件夾結(jié)構(gòu)初坠。下面是 CodeIgniter 的代碼布局:

圖片發(fā)自簡書App

10 - 一致的臨時變量命名

? ? ? 通常,變量應(yīng)該是描述性的彭雾,并且包含一個或多個單詞碟刺。但是,這并不一定適用于臨時變量薯酝。它們可以短到單個字符的長度半沽。

? ? ? ? 對于具有相同作用的臨時變量爽柒,使用一致的命名是一個很好的做法。

// $i for loop countersfor?

($i= 0; $i< 100; $i++) {? ? ? ? ?

? // $j for the nested loop counters? ? ?

? for($j= 0; $j< 100; $j++) {? ? ? ? ?

? }?

}? ? ?

// $ret for return variables?

functionfoo() {? ? ?

$ret['bar'] = get_bar();? ? ?

$ret['stuff'] = get_stuff();? ? ? ? ?

return$ret;?

}? ? ?

// $k and $v in foreachforeach?

($some_arrayas$k=> $v) {? ? ?

}? ? ?

// $q, $r and $d for mysql?

$q= "SELECT * FROM table";?

$r= mysql_query($q);?

while($d= mysql_fetch_assocr($r)) {? ?

}? ? ?

// $fp for file pointers\?

$fp= fopen('file.txt','w');

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末者填,一起剝皮案震驚了整個濱河市浩村,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌占哟,老刑警劉巖心墅,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異榨乎,居然都是意外死亡怎燥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門蜜暑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铐姚,“玉大人,你說我怎么就攤上這事肛捍∫啵” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵拙毫,是天一觀的道長依许。 經(jīng)常有香客問我,道長恬偷,這世上最難降的妖魔是什么悍手? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮袍患,結(jié)果婚禮上坦康,老公的妹妹穿的比我還像新娘。我一直安慰自己诡延,他們只是感情好滞欠,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肆良,像睡著了一般筛璧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惹恃,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天夭谤,我揣著相機(jī)與錄音,去河邊找鬼巫糙。 笑死朗儒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播醉锄,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乏悄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恳不?” 一聲冷哼從身側(cè)響起檩小,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烟勋,沒想到半個月后规求,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡卵惦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年颓哮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸵荠。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖伤极,靈堂內(nèi)的尸體忽然破棺而出蛹找,到底是詐尸還是另有隱情,我是刑警寧澤哨坪,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布庸疾,位于F島的核電站,受9級特大地震影響当编,放射性物質(zhì)發(fā)生泄漏届慈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一忿偷、第九天 我趴在偏房一處隱蔽的房頂上張望金顿。 院中可真熱鬧,春花似錦鲤桥、人聲如沸揍拆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫂拴。三九已至,卻和暖如春贮喧,著一層夾襖步出監(jiān)牢的瞬間筒狠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工箱沦, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留辩恼,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像运挫,于是被迫代替她去往敵國和親状共。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理谁帕,服務(wù)發(fā)現(xiàn)峡继,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 推薦文章:禪與 Objective-C 編程藝 前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開發(fā)人員編寫出簡潔匈挖、可維護(hù)碾牌、...
    WolfTin閱讀 2,759評論 0 1
  • iOS編程規(guī)范0規(guī)范 0.1前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開發(fā)人員編寫出簡潔、可維護(hù)儡循、可靠舶吗、可 測試、高效...
    iOS行者閱讀 4,459評論 21 35
  • 每天要做這幾件事! 第一件:每天早晨的第一件事就是打開飲水機(jī)沖一杯溫的淡鹽水(夏天喝涼的)窃页,鹽水可以清腸跺株。 比例是...
    薔兒老師閱讀 1,856評論 10 38