開發規範PHP程式碼命名規則

來源:互聯網
上載者:User
代碼裡的命名規則:錯誤的和正確的對比

編程初學者總是把大量的時間用在學習程式設計語言,文法,技巧和編程工具的使用上。他們認為,如果掌握了這些技術技巧,他們就能成為不錯的程式員。然而,電腦編程的目的並不是關於精通這些技術、工具的,它是關於針對特定領域裡的特定問題創造出相應的解決方案,程式員通過相互合作來實現這些。所以,很重要的一點,你需要能精確的用代碼錶達出你的思想,讓其他人通過代碼能明白你的意圖。

讓我們先看看編程大師Robert C. Martin的傑作《Clean Code》裡的一句話:

“注釋的目的是為了彌補代碼自身在表達上的不足。”

這句話可以簡單的理解為如果你的代碼需要注釋,最有可能是你的代碼寫的很爛。同樣,如果在沒有注釋的情況下你無法用代碼完整的表達你對一個問題或一個演算法的思路,那這就是一個失敗的訊號。最終,這意味著你需要用注釋來闡明一部分的思想,而這部分在代碼裡是看不出來的。好的代碼能夠讓任何人在不需要任何注釋的情況下看懂。好的編碼風格能將所有有助於理解這個問題的所有資訊都蘊含在代碼裡。

在編程理論中,有一個概念叫做“自我描述的原始碼”。對於一段代碼,一種常見的自我描述機制是遵循某種非嚴格定義的變數、方法、對象命名規則。這樣做的主要作用就是使原始碼更易讀易懂。所以,也就更容易維護和擴充。

這篇文章裡,我將舉出一些例子,說明什麼是“不好的代碼”,什麼是“清楚的代碼”

命名要能揭

如何命名,在編程中這永遠都是個老大難問題。有些程式員喜歡簡化、縮短或加密名稱,使得只有他們自己能懂。下面讓我們看一些例子:

不好的代碼:

int d;// 天數int ds;int dsm;int faid;

“d”可以表示任何東西。作者使用注釋來表明他的意圖,卻沒有選擇用代碼來表示。而“faid”很容易導致誤解為ID。

清楚的代碼:

int elapsedTimeInDays;int daysSinceCreation;int daysSinceModification;int fileAgeInDays;

命名時避免含義引起誤解的資訊

錯誤的資訊比沒有資訊更糟糕。有些程式員喜歡“隱藏”一些重要訊息,有時候他們也會寫出一些讓人誤解的代碼。

不好的代碼:

Customer[] customerList;Table theTable;

變數“customerList”其實不是個list。它是一個普通的array(或客戶集合)。除此之外,“theTable”是一個Table類型的對象(你可以用IDE容易的發現它的類型),“the”這個詞是個不必要的幹擾。

清楚的代碼:

Customer[] customers;Table customers;

命名要有合適的長度

在進階程式設計語言中,變數名的長度通常不太限制。變數名幾乎可以任何長度。雖然如此,這也可能使代碼變得鬧心。

不好的代碼:

var theCustomersListWithAllCustomersIncludedWithoutFilter;var list;

好的名稱應該只含有必要的詞彙來表達一個概念。任何不必要的字詞都會使名稱變長、難於理解。名稱越短越好,前提是能在上下文中表達完整的意思(下訂單這個情境中,“customersInOrder” 要比 “list” 好)。

清楚的代碼:

var allCustomers;var customersInOrder;

命名時編碼規範保持一致,讓規範協助理解代碼

所有的編程技術(語言)都有自己的“風格”,叫做編碼規範。程式員應該在寫代碼時遵循這些習慣,因為其他的程式員也知道這些,並按這種風格編寫。下面我們看一個沒有明顯規範的不好的代碼例子。下面的這段代碼沒有遵循很好的已知的“編碼規範”(比如PascalCase, camelCase, Hungarian規範)。更糟糕的是,這有一個毫無意義的bool變數“change”。這是個動詞(用來描述動作),但這裡的bool值是來描述一個狀態,所以,這裡應該用一個形容詞更合適。

不好的代碼:

const int maxcount = 1bool change = truepublic interface Repositoryprivate string NAMEpublic class personaddressvoid getallorders()

一段代碼,只看它的一部分,你就應該直接明白它是什麼類型,只需要看它的命名方法。

例如:你看到了“_name”,你就能知道它是個私人變數。你應該在任何地方都利用這種表示方法,沒有例外情況。

清楚的代碼:

const int MAXCOUNT = 1bool isChanged = truepublic interface IRepositoryprivate string _namepublic class PersonAddressvoid GetAllOrders()

命名時相同的概念用相同的詞表達

定義概念很難。在軟體開發過程中,很多時間都花在分析業務情境、思考正確的定義裡面所有的元素。這些概念永遠都是讓程式員頭痛的事。

不好的代碼:

//1.void LoadSingleData()void FetchDataFiltered()Void GetAllData()//2.void SetDataToView();void SetObjectValue(int value)

首先:

代碼的作者試圖表達“get the data”的概念,他使用了多個詞“load”,“getch”,“get”。一個概念只用一個詞表達就行了(在同一個情境中)。

第二:

“set”這個詞用在了2個概念裡:第一是“data loading to view”,第二個是“setting a value of object”。這是兩個不同的概念,你應該使用不同的詞。

清楚的代碼:

//1.void GetSingleData()void GetDataFiltered()Void GetAllData()//2.void LoadDataToView();void SetObjectValue(int value)

命名時使用跟業務領域相關的詞

程式員寫的所有代碼都是跟業務領域情境邏輯相連的。為了讓所有關係到這個問題的人都能更好的理解,程式中應該使用在領域環境中有意義的名稱。

不好的代碼:

public class EntitiesRelation{Entity o1;Entity o2;}

當在編寫針對某個領域的代碼時,你應該始終考慮使用領域有聯絡的名稱。在將來,當另外一個人(不僅是程式員,也許是測試人員)接觸你的代碼時,他能輕鬆的理解這個業務領域裡你的代碼是什麼意思(不需要商務邏輯知識)。你首先考慮的應該是業務問題,之後才是如何解決。

清楚的代碼:

public class ProductWithCategory{Entity product;Entity category;}

命名時使用在特定環境裡有意義的詞

代碼裡名稱都有自己的上下文。上下文對於理解一個名稱非常重要,因為它能提供額外的資訊。讓我們來看看一個典型的“地址”上下文:

不好的代碼:

string addressCity;string addressHomeNumber;string addressPostCode;

在大多數情況中,“Post Code”通常是地址的一部分,很顯然,郵遞區號不能單獨使用(除非你是在開發一個專門處理郵編的應用)。所以,沒有必要在“PostCode”的前面加上“address”。更重要的,所以的這些資訊都有一個上下文容環境,一個命名空間,一個類。

在物件導向編程中,這裡應該用一個“Address”類來表達這個地址資訊。

清楚的代碼:

class Address{string city;string homeNumber;string postCode;}

命名方法總結

概述起來,做為一個程式員,你應該:

命名是來表達概念的

注意名稱長度,名稱裡只該含有必要的詞語

編碼規範有助於理解代碼,你應該使用它

名稱不要混用

名稱在業務領域裡要有意義,在上下文裡有意義

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.