代碼命名,代碼里的命名規則:錯誤的和正確的對比 命名方法總結 “自我描述的源代碼”用代碼表達出你的思想,讓其他人通過代碼能明白你的意圖。...

http://www.aqee.net/express-names-in-code-bad-vs-clean/

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

讓我們先看看編程大師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 = 1
bool change = true
public interface Repository
private string NAME
public class personaddress
void getallorders()

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

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

清楚的代碼

const int MAXCOUNT = 1
bool isChanged = true
public interface IRepository
private string _name
public class PersonAddress
void GetAllOrders()

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

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

不好的代碼

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

首先:

代碼的作者試圖表達“get the data”的概念,他使用了多個詞“load”,“fetch”,“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;
}

命名方法總結

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

  • 命名是來表達概念的
  • 注意名稱長度,名稱里只該含有必要的詞語
  • 編碼規范有助于理解代碼,你應該使用它
  • 名稱不要混用
  • 名稱在業務領域里要有意義,在上下文里有意義

?

匈牙利命名法對程序員初學MFC比QT類庫更有阻礙的原因之一

轉載于:https://www.cnblogs.com/svennee/p/4759338.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273027.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux 動態執行cp,Linux常用命令之cp、mv、rm、cat、more、head、tail、ln命令講解

上一章節中,我們了解到了Linux系統的最基礎的幾個文件處理命令,核心的是ls命令,在今天這章中,我們來繼續學習Linux對于文件操作相關的一些命令,比如復制、移動、刪除、查看等命令。1、cp 命令解釋命令名稱:…

使用DBI(perl)實現文本文件的導入導出mysql

DBI 是perl腳本連接數據庫的一個模塊。perl腳本相對shell更靈活,功能更強大,跨平臺能力強。相對可執行jar包要簡單很多。 ?1、下載安裝包DBI-1.631.tar.gzperl腳本下載的網站http://www.cpan.org/ 很多perl的組件都可以在這個網站上下載 2、解壓tar -xz…

linux 車載視頻監控,基于Linux平臺車載視頻監控系統研發-計算機科學與技術專業論文.docx...

基于Linux平臺車載視頻監控系統研發-計算機科學與技術專業論文目錄HYPERLINK \l "_bookmark0" 第一章 緒論1 HYPERLINK \l "_bookmark1" 1.1 研究背景1 HYPERLINK \l "_bookmark2" 1.2 研究動態1 HYPERLINK \l "_bookmark3" 1.3 本文工…

Linux鼠標回報率修改,鼠標回報率怎么調? 設置鼠標回報率的三種方法

鼠標回報率如何設置呢?鼠標回報率又稱刷新率,是指鼠標MCU與電腦傳輸數據頻率。鼠標回報率對于游戲玩家而言至關重要,但同時鼠標回報率與電腦性能息息相關。只有電腦硬件性能良好,才能適當提升鼠標回報率,以實現更高的鼠…

linux下vi修改文件用法

進入vi的命令 vi filename :打開或新建文件,并將光標置于第一行首 vi n filename :打開文件,并將光標置于第n行首 vi filename :打開文件,并將光標置于最后一行首 vi /pattern filename:打開文件&#xff…

linux在芯片設計與實現,基于Linux的Atheros無線芯片網卡驅動的設計與實現

Design and Implementation of Linux based Atheros wireless network cards driverDU Qingbo1杜清波(1985-),男,碩士研究生,主要研究方向:嵌入式系統與網絡通信1、School of Computer Science,Beijing University of Posts and T…

[轉載]孫婧妍:高考語文148分是這樣煉成的(附:孫婧妍

原文地址:孫婧妍:高考語文148分是這樣煉成的(附:孫婧妍2013高考作文《手機論》)作者: 語文新高考高考語文148分是這樣煉成的 (附:孫婧妍2013高考作文《手機論》) 來源:網絡 作者:孫婧妍…

linux ps 命令安裝,Linux上安裝pstree命令(-bash: pstree: command not found)

一、pstree命令的安裝1、在Mac OS上brew install pstree2、在Fedora/Red Hat/CentOSyum -y install psmisc3、在 Ubuntu/Debianapt-get install psmisc二、pstree命令詳解pstree指令用ASCII字符顯示樹狀結構,清楚地表達程序間的相互關系。如果不指定程序識別碼或用戶…

c語言字符串逆置,字符串逆置

滿意答案9n7j5j3m4o2013.12.03采納率:49% 等級:11已幫助:15198人47911 zxl0714 1358 Accepted 164K 15MS G 0.46K 2007-04-08 10:32:38#include using namespace std;void reverse(char* ch){int i, len;char tmp;len strlen( ch );for (…

哈夫曼編碼c語言論文,哈夫曼編碼的實現及應用論文.doc

哈夫曼編碼的實現及應用論文畢 業 設 計(論文)題目 哈夫曼編碼的實現及應用二級學院 數學與統計學院專 業 信息與計算科學班 級學生姓名 張澤欣 學號指導教師 職稱時 間目錄摘要IAbstractII第一章 緒論11.1 研究目的及意義11.2 圖像壓縮編碼技術概述21.2.1 圖像壓縮編碼技術分類…

css筆記3

CSS 多類選擇器,通過把兩個類選擇器鏈接在一起&#xff0c;僅可以選擇同時包含這些類名的元素&#xff08;類名的順序不限&#xff09;。 <p class"important warning"> This paragraph is a very important warning. </p>.important {font-weight:bold;…

java保留有效數字

1 在處理數值運算的時候&#xff0c;有時候會遇到保留幾位小數的需求&#xff0c;下面是一個保留兩位小數的簡單方法。2 /**3 * 將數據保留兩位小數4 */5 privatedoublegetTwoDecimal(doublenum) {6 DecimalFormatdFormatnewDecimalFormat("#.00"…

C語言algorithm主函數,C語言中主函數中相關有關問題?

C語言中主函數中相關問題&#xff1f;&#xff1f;&#xff1f;#include #include #include #include #include #include #include #include #include using namespace std;int mp[20][20], b[20], max1, n;struct node{int a[15], top, ans, x;};void bfs(){int i, j, x;queue…

【Android基礎】Fragment 詳解之Fragment介紹

Fragment在Android 3.0&#xff08; API 11&#xff09;引入&#xff0c;是為了支持在大屏上顯示更加動態、靈活的UI&#xff0c;比如在平板和電視上。Fragment可以看作是嵌套的Activity&#xff0c;類似ActivityGroup&#xff0c;但是開銷肯定沒有ActivityGroup那么大&#xf…

c語言統計數據,數據統計

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include void input(float score[10][5]);void average(float aver[]);void course(float cour[]);float score[10][5],aver[10],cour[5];int i,j;void main(){printf("please input the scores of all the students\n"…

傳遞閉包c語言算法解析,找關系的傳遞閉包 用c語言編 一個關系的傳遞閉包

為什么叫傳遞閉包&#xff1f;&#xff1f;有什么特殊含義&#xff1f;&#xff1f;設R是X上的二元關系&#xff0c;如果另一個關系R1滿足&#xff1a;R1是傳遞的&#xff0c;R是R1的子集&#xff0c;對于任何可傳遞關系R11如果有R是R11的子集&#xff0c;就有R1是R11的子集。則…

linux之cp/scp命令+scp命令詳解

命令&#xff1a;cp 使用權限&#xff1a;所有使用者 使用方式&#xff1a; cp [options] source dest cp [options] source... directory 說明&#xff1a;將一個檔案拷貝至另一檔案&#xff0c;或將數個檔案拷貝至另一目錄。 把計 -a 盡可能將檔案狀態、權限等資料都照原狀予…

linux安裝mq報5724,linux下MQ簡單配置手冊.doc

精品消息發送涉及到的隊列及通道示意圖&#xff1a;定義發送方為A&#xff0c;接收方為B&#xff0c;下面是建立A向B發送消息的單向配置。發送方A的配置1. 在發送方A創建隊列管理器QM_A&#xff1a;[[email protected] ~]$ crtmqm -q QM_A成功后會有如下提示&#xff1a;There …

asp.net MVC控制器中返回JSON格式的數據時提示下載

Asp.net mvc在接收的是JSON格式的數據&#xff0c;但是奇怪的是在IE中提示下載文件&#xff0c;其他瀏覽器中一切正常&#xff0c;下載后&#xff0c;里面的內容就是在控制器中返回的數據。代碼如下&#xff1a; 視圖中js代碼&#xff1a; $("#form").ajaxSubmit({ …

linux postfix 搭建,linux 下搭建postfix服務器

linux 下postfix郵箱的安裝linux一、首先關閉sendmail服務service sendmail stop二、chkconfig sendmail off(關閉開機自啟動)三、修改DNS正解文件&#xff0c;使DNS可以解析郵箱服務添加下面兩行mail.zhubf.com. IN A 172.17.17.2zhubf.com. IN MX 10 …