自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

編寫超級可讀代碼的15個最佳實踐

開發(fā) 后端
代碼可讀性是一個計算機編程世界的普遍主題。它是我們作為開發(fā)者第一件學(xué)習(xí)的事情。這篇文章將闡述編寫可讀性代碼十五個最重要的最佳實踐。

  代碼可讀性是一個計算機編程世界的普遍主題。它是我們作為開發(fā)者第一件學(xué)習(xí)的事情。這篇文章將闡述編寫可讀性代碼十五個最重要的最佳實踐。

 

  1. 注釋和文檔

  集成開發(fā)環(huán)境IDE在過去的短短幾年里走過了很長的路。它使得注釋代碼比以前更加有用。依照特定標準書寫的注釋允許IDE和其他工具通過不同的方式來使用它們。

  考慮如下示例:

 

  我在函數(shù)定義中添加的注釋可以在調(diào)用它的地方看到,即便是在其他文件中。

  這里是我另外一個從第三方庫中調(diào)用函數(shù)的例子:

 

  在這些特殊的例子中,使用的注釋(或者文檔)類型基于PHPDoc,IDE是Aptana。

  2 . 一致的排版

  我假定你已經(jīng)知道了你必須要縮進你的代碼。然而,保持排版樣式一致仍然是一個好主意。

  這里有不止一種方式來進行代碼排版。

  第一種:

  1. function foo() {  
  2.     if ($maybe) {  
  3.         do_it_now();  
  4.         again();  
  5.     } else {  
  6.         abort_mission();  
  7.     }  
  8.     finalize();  

  第二種:

  1. function foo()  
  2. {  
  3.     if ($maybe)  
  4.     {  
  5.         do_it_now();  
  6.         again();  
  7.     }  
  8.     else 
  9.     {  
  10.         abort_mission();  
  11.     }  
  12.     finalize();  

  第三種:

  1. function foo()  
  2. {   if ($maybe)  
  3.     {   do_it_now();  
  4.         again();  
  5.     }  
  6.     else 
  7.     {   abort_mission();  
  8.     }  
  9.     finalize();  

  我曾經(jīng)使用第二種樣式但是最近換為第一種。但是這僅僅只代表了一種偏愛。這里并沒有每個人必須要遵守的“最好的”樣式。事實上,最佳的樣式,就是一致的樣式。如果你是一個小組的一部分或者你在為一個項目貢獻代碼,你必須依照這個項目之前使用的樣式。

  排版的樣式總不是完全和另外一個不同。有時,它們混合了多種不同的規(guī)則。例如,按照PEAR編碼標準,前括弧“{”和控制結(jié)構(gòu)在同一行上,但是在功能定義后放在第二行上。

  PEAR樣式:

  1. function foo()  
  2. {                     // placed on the next line  
  3.     if ($maybe) {     // placed on the same line  
  4.         do_it_now();  
  5.         again();  
  6.     } else {  
  7.         abort_mission();  
  8.     }  
  9.     finalize();  

  同時注意它們使用4個空格而不是Tab來縮進。

  這里http://en.wikipedia.org/wiki/Indent_style有一個維基百科的文章,里面有許多不同排版樣式的例子。

  3. 避免顯而易見的注釋

  為代碼添加注釋是效果顯著的;但是,它可能太過或者只是多余的文本。像如下例子:

  1. // get the country code  
  2. $country_code = get_country_code($_SERVER['REMOTE_ADDR']);  
  3. // if country code is US  
  4. if ($country_code == 'US') {  
  5.     // display the form input for state  
  6.     echo form_input_state();  

  如果注釋內(nèi)容都是顯而易見的,它們并沒有提高工作效率。如果你必須要注釋這些代碼,你可以簡單的把它們合并在一行:

  1. // display state selection for US users  
  2. $country_code = get_country_code($_SERVER['REMOTE_ADDR']);  
  3. if ($country_code == 'US') {  
  4.     echo form_input_state();  

  4. 代碼分組

  確定的任務(wù)多半需要多行代碼。使用一些空白將這些任務(wù)的代碼分隔為幾段是一個好主意。

  這是一個簡單的示例:

  1. // get list of forums  
  2. $forums = array();  
  3. $r = mysql_query("SELECT id, name, description FROM forums");  
  4. while ($d = mysql_fetch_assoc($r)) {  
  5.     $forums []= $d;  
  6. }  
  7. // load the templates  
  8. load_template('header');  
  9. load_template('forum_list',$forums);  
  10. load_template('footer'); 

  在每一段之前添加注釋也增強了視覺上的分隔。

  5. 命名的一致性

  PHP有些時候在遵守命名一致性方面有很大問題:

  strops()和str_split()

  imagetypes()和image_type_to_extension()

  首先,這些命名必須有單詞的分界線。有兩種流行的選擇:

  駱駝命名法:除了第一個單詞外,每個單詞的第一個字符大寫。

  下劃線命名法: 單詞間采用下劃線,例如mysql_real_escape_string()。

  像我之前提到的一樣,采用不同的命名選擇會創(chuàng)建和排版樣式類似的情形。如果一個已有的項目遵照一個確定的習(xí)慣,你必須遵守它。同時,某些語言平臺傾向于使用特定的命名規(guī)則。例如Java里,大多數(shù)代碼使用駱駝命名法;在PHP里大多采用下劃線命名法。

  它們也可以混用。一些開發(fā)者喜歡在程序函數(shù)和類名上使用下劃線命名,但是在類方法名上使用駱駝命名。

  1. class Foo_Bar {  
  2.     public function someDummyMethod() {  
  3.     }  
  4. }  
  5. function procedural_function_name() {  

  所以,沒有明顯的“最好的”樣式,只需要保持一致。

#p#

  6. DRY原則

  DRY即不要重復(fù)你自己。也被稱為DIE:重復(fù)是惡魔。

  這個原則規(guī)定:

  “在一個系統(tǒng)里每一個知識的片段必須有一個單一、明確、權(quán)威的表現(xiàn)。”

  大多數(shù)應(yīng)用程序(或者通常的計算機)的目的是讓重復(fù)的任務(wù)自動化。這個原則在所有的代碼,即使Web程序中也應(yīng)該保持。代碼的相同片段不應(yīng)該多次重復(fù)。

  例如,大多數(shù)Web程序由許多頁面組成。這些頁面很可能包含相同的元素。頁頭和頁腳經(jīng)常符合這個條件。復(fù)制和粘貼這些頁頭和頁尾到每一個頁面中不是一個好主意。這是Jeffrey Way解釋如何在CodeIgniter里創(chuàng)建模版的鏈接。

  1. $this->load->view('includes/header');  
  2. $this->load->view($main_content);  
  3. $this->load->view('includes/footer'); 

  7. 避免過深的嵌套

  太多層的嵌套會造成代碼閱讀和跟蹤困難。

  1. function do_stuff() {  
  2. // ...  
  3.     if (is_writable($folder)) {  
  4.         if ($fp = fopen($file_path,'w')) {  
  5.             if ($stuff = get_some_stuff()) {  
  6.                 if (fwrite($fp,$stuff)) {  
  7.                     // ...  
  8.                 } else {  
  9.                     return false;  
  10.                 }  
  11.             } else {  
  12.                 return false;  
  13.             }  
  14.         } else {  
  15.             return false;  
  16.         }  
  17.     } else {  
  18.         return false;  
  19.     }  

  為了可讀性,通常需要修改代碼來減少嵌套的層數(shù)。

  1. function do_stuff() {  
  2. // ...  
  3.     if (!is_writable($folder)) {  
  4.         return false;  
  5.     }  
  6.     if (!$fp = fopen($file_path,'w')) {  
  7.         return false;  
  8.     }  
  9.     if (!$stuff = get_some_stuff()) {  
  10.         return false;  
  11.     }  
  12.     if (fwrite($fp,$stuff)) {  
  13.         // ...  
  14.     } else {  
  15.         return false;  
  16.     }  

  8. 減少行的長度

  我們的眼睛對于閱讀高和窄的文本列更感覺舒適。這就是為什么報紙文章看起來像如下樣子的原因:

 

  避免在一行上編寫過長的代碼是一個最佳實踐。

  1. // bad  
  2. $my_email->set_from('test@email.com')->add_to('programming@gmail.com')->set_subject('Methods Chained')->set_body('Some long message')->send();  
  3. // good  
  4. $my_email 
  5.     ->set_from('test@email.com')  
  6.     ->add_to('programming@gmail.com')  
  7.     ->set_subject('Methods Chained')  
  8.     ->set_body('Some long message')  
  9.     ->send();  
  10. // bad  
  11. $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'";  
  12. // good  
  13. $query = "SELECT id, username, first_name, last_name, status  
  14.     FROM users  
  15.     LEFT JOIN user_posts USING(users.id, user_posts.user_id)  
  16.     WHERE post_id = '123'"; 

  同時,如果任何人想要在例如Vim這樣的終端窗口中閱讀代碼,限制每一行的長度在80個字符以內(nèi)是一個好主意。

  9. 代碼結(jié)構(gòu)

  理論上,你可以將整個應(yīng)用代碼寫在一個文件里。但是對于閱讀和維護來說是一個噩夢。

  在我的第一個編程項目中,我知道創(chuàng)建“包含文件”的含義。但是,我并沒有好好進行組織。我創(chuàng)建了一個“inc”文件夾,放置了兩個文件:db.php、functions.php。當(dāng)程序變大時,functions文件也變得越來越大并難以維護。

  最好的方法之一是采用框架或者模仿它們的文件夾結(jié)構(gòu)。下面是CodeIgniter的文件結(jié)構(gòu):

 

  10. 統(tǒng)一的臨時變量名

  通常,變量名應(yīng)該是描述性的并且包含一個或者更多的單詞。但是,這對臨時變量來說并不是必須的。它們可以短到只有一個單獨字符。

  最佳實踐是:對于有同樣職責(zé)臨時變量采用統(tǒng)一的命名。這里有一些我傾向于在代碼里使用的例子:

  1. // $i for loop counters  
  2. for ($i = 0; $i < 100; $i++) {  
  3.     // $j for the nested loop counters  
  4.     for ($j = 0; $j < 100; $j++) {  
  5.     }  
  6. }  
  7. // $ret for return variables  
  8. function foo() {  
  9.     $ret['bar'] = get_bar();  
  10.     $ret['stuff'] = get_stuff();  
  11.     return $ret;  
  12. }  
  13. // $k and $v in foreach  
  14. foreach ($some_array as $k => $v) {  
  15. }  
  16. // $q, $r and $d for mysql  
  17. $q = "SELECT * FROM table";  
  18. $r = mysql_query($q);  
  19. while ($d = mysql_fetch_assocr($r)) {  
  20. }  
  21. // $fp for file pointers  
  22. $fp = fopen('file.txt','w'); 

#p#

  11. SQL關(guān)鍵詞大寫

  數(shù)據(jù)庫交互對于大多數(shù)Web應(yīng)用來說是很大一個組成部分。如果你正在編寫SQL查詢,盡量保持它們可讀。

  即使SQL關(guān)鍵詞和函數(shù)名是大小寫無關(guān)的,大寫來將它們從表名和列名中區(qū)分出來是一個通用的實踐。

  1. SELECT id, username FROM user;  
  2. UPDATE user SET last_login = NOW()  
  3. WHERE id = '123' 
  4. SELECT id, username FROM user u  
  5. LEFT JOIN user_address ua ON(u.id = ua.user_id)  
  6. WHERE ua.state = 'NY' 
  7. GROUP BY u.id  
  8. ORDER BY u.username  
  9. LIMIT 0,20 

  12. 代碼和數(shù)據(jù)分離

  這是另外一個對于所有環(huán)境下的絕大多數(shù)編程語言都適用的原則。在Web開發(fā)中,數(shù)據(jù)通常意味著HTML輸出。

  當(dāng)PHP許多年前第一次發(fā)布時,它最開始被看作是一個模版引擎。在巨大的HTML文件里插入一些PHP代碼行是非常普通的。但是,這些年來,事情發(fā)生了改變:網(wǎng)站變得越來越動態(tài)化和功能化。代碼已經(jīng)是Web程序的一個很大的部分,將它們和HTML合并在一起并不是一個好的實踐。

  你可以在你的程序中應(yīng)用這個原則,或者你可以使用一個第三方工具(模版引擎、框架或者CMS系統(tǒng))或者依照它們的習(xí)慣。

  流行的PHP框架:

  CodeIgniter

  Zend Framework

  Cake PHP

  Symfony

  流行的模版引擎:

  Smarty

  Dwoo

  Savant

  流行的CMS系統(tǒng):

  Joomla

  Drupal

  13. 模版內(nèi)的交替格式

  你可以選擇不使用一個奇特的模版引擎,取而代之的是在模版文件里使用純內(nèi)聯(lián)的PHP代碼。這不是必須要違反“數(shù)據(jù)和代碼分離“,只是內(nèi)聯(lián)代碼是直接和輸出相關(guān)的,并且可讀。在這種情況下你可以考慮使用交替格式來控制結(jié)構(gòu)。

  這是一個示例:

  1. <div class="user_controls">  
  2.     <?php if ($user = Current_User::user()): ?>  
  3.         Hello, <em><?php echo $user->username; ?></em> <br/>  
  4.         <?php echo anchor('logout''Logout'); ?>  
  5.     <?php else: ?>  
  6.         <?php echo anchor('login','Login'); ?> |  
  7.         <?php echo anchor('signup''Register'); ?>  
  8.     <?php endif; ?>  
  9. </div>  
  10. <h1>My Message Board</h1>  
  11. <?php foreach($categories as $category): ?>  
  12.     <div class="category">  
  13.         <h2><?php echo $category->title; ?></h2>  
  14.         <?php foreach($category->Forums as $forum): ?>  
  15.             <div class="forum">  
  16.                 <h3>  
  17.                     <?php echo anchor('forums/'.$forum->id, $forum->title) ?>  
  18.                     (<?php echo $forum->Threads->count(); ?> threads)  
  19.                 </h3>  
  20.                 <div class="description">  
  21.                     <?php echo $forum->description; ?>  
  22.                 </div>  
  23.             </div>  
  24.         <?php endforeach; ?>  
  25.     </div>  
  26. <?php endforeach; ?> 

  這讓你避免了許多大括號。同時代碼看起來和HTML的結(jié)構(gòu)和排版相似。

  14. 面向?qū)ο?vs 面向程序

  面向?qū)ο缶幊炭梢詭椭銊?chuàng)建結(jié)構(gòu)化代碼。但是這不代表你完全排除程序化編程。事實上創(chuàng)建兩者混合的風(fēng)格是非常棒的。

  描述數(shù)據(jù),通常是數(shù)據(jù)庫里的數(shù)據(jù),必須使用對象。

  1. class User {  
  2.     public $username;  
  3.     public $first_name;  
  4.     public $last_name;  
  5.     public $email;  
  6.     public function __construct() {  
  7.         // ...  
  8.     }  
  9.     public function create() {  
  10.         // ...  
  11.     }  
  12.     public function save() {  
  13.         // ...  
  14.     }  
  15.     public function delete() {  
  16.         // ...  
  17.     }  

  程序化方法常用于可以獨立執(zhí)行的特定任務(wù)。

  1. function capitalize($string) {  
  2.     $ret = strtoupper($string[0]);  
  3.     $ret .= strtolower(substr($string,1));  
  4.     return $ret;  

  15. 閱讀開源代碼

  開源項目是許多開發(fā)者一起構(gòu)建的。這些項目必須保持高度的代碼可讀性,以便他們可以盡可能高效的協(xié)同工作。

  因此,通讀這些項目的源代碼來觀察這些開發(fā)者是如何工作的是非常棒的方法。

 

  最后: 代碼重構(gòu)

  當(dāng)你“重構(gòu)“,你在不改變功能的情況下調(diào)整代碼。你可以把它看作是“清理”,為了改進代碼質(zhì)量和可讀性。

  這并不包括bug的修復(fù)或者添加新功能。你可以重構(gòu)你之前編寫的代碼,當(dāng)它們在你頭腦你還保持新鮮的時候,以便于你兩個月以后有可能回顧代碼時更加可讀和可重用。就像那句格言所說的一樣:“盡早重構(gòu),經(jīng)常重構(gòu)“。

  你可以在重構(gòu)期間應(yīng)用以上任何關(guān)于代碼可讀性的“最佳實踐“。我希望你喜歡這篇文章!

  譯文鏈接:http://blog.csdn.net/hfahe/archive/2011/04/05/6303585.aspx

  原文鏈接:http://net.tutsplus.com/tutorials/html-css-techniques/top-15-best-practices-for-writing-super-readable-code/

【編輯推薦】

  1. C++編程規(guī)范:101條規(guī)則、準則和最佳實踐
  2. 一個10年程序員職業(yè)發(fā)展、總結(jié)和困境
  3. 告別程序員生涯,一點感慨
  4. 程序員:永遠不要去請示是否應(yīng)該整理你的代碼
  5. 所謂的原則、最佳實踐和模式是什么
責(zé)任編輯:韓亞珊 來源: 博客園
相關(guān)推薦

2012-07-11 10:51:37

編程

2013-03-22 16:43:03

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

2010-10-28 09:05:42

SilverlightXAML

2011-11-18 09:42:29

Ajax

2018-01-12 14:37:34

Java代碼實踐

2014-06-24 10:41:46

2017-02-28 21:57:05

React組件

2020-06-03 16:50:24

TypeScriptReact前端

2024-10-11 06:00:00

Python代碼編程

2012-08-09 09:10:56

代碼審查代碼

2017-03-06 13:20:31

2014-02-26 11:01:28

日志優(yōu)化系統(tǒng)日志

2015-08-27 13:11:18

JavaScript代碼

2023-03-16 08:01:56

TypeScript開源編程語言

2021-12-04 23:10:02

Java代碼開發(fā)

2024-04-23 08:01:20

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

2012-03-22 09:15:29

開發(fā)代碼

2023-04-14 08:10:59

asyncawait

2020-02-25 20:55:20

JavaScript開發(fā) 技巧

2013-12-03 09:34:26

iOS應(yīng)用開發(fā)實踐高質(zhì)量Objectiv
點贊
收藏

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