前幾天公司的大牛架構師,給我們這些新來的員工對代碼和項目的規範做了一個講座,之後總結一二,說說新的體會吧。
一、代碼要求
1、好代碼
好代碼的要求,清新,自然,易讀,易懂。
具體而言:
1)命名要規範,加註釋。
類的命名:
類名採用英語名詞,一般1到2個單詞,如果超過,則要採用繼承;
單詞首字母要大寫,如果2個單詞,則第二個單詞也大寫,如 class MyClass{};
類屬性命名:
開頭以 "m_"開始,下劃線之後跟上具體的變量類型屬性,即匈牙利命名法;
2個單詞以上的,第二個單詞起首字母大寫,如 int m_nobjCount;
靜態變量的命名,以"ms_"開頭;
類方法命名:
方法一般做一件事情,用動詞+名詞的形式表示;
方法命令採用類似駝鳥命名法,即doFile() ,首字母小寫,第二個字母大寫,和普通函數以作區分;
函數命名:
函數和方法一樣,俄式執行一件事,爲區分類的方法,採用小寫形式,並加下劃線,如do_data();
變量名命名:
變量名統一採用小寫;
多個單詞之間用下劃線連接,如 char* p_tmp_buf;
靜態變量 採用"s_"前置;
全局變量 採用"g_s"前置;
局部的置於for,while,switch-case 等的變量,可以適當簡單,表意清楚即可,如
` for(int i=0;i<10;i++)
{
DownFile* pTmp = new DownFile();
//...
}`
方法和函數的形參命名:
採用類型的表意縮寫,加上該變量名的大寫單詞;
多個單詞的,首字母都採用大寫,如
int get_down_count(int &nDownFileCount);
枚舉變量和宏定義命名:
都採用 大寫字母+下劃線形式,如#define MAX_LEN 1024 ;
2)函數函數不要超過100行。
函數代碼行數應該適當控制在100行左右,超過之後可以提煉出機制代碼,另作函數;
3)縮進符不超過3個。
縮進太多,一般是嵌套的for,if,while等邏輯太多,對代碼不宜理清思路,讀起來費力。
**2、高內聚和低耦合**
做到高內聚和低耦合要求,需要機制和策略思想。
機制:通用性的代碼。具體指
1)模塊代碼容易測試;
2)容易改變性:在不改變接口名的前提下,可以替換修改實現功能;
3)不容易改變性:在接口版本升級上,既要兼容老版本又要支持新版本的要求下,對接口的命名不能改變,因此只能重新實現一個新的增強版接口;
策略:是指如何在代碼中提取出機制代碼。
二、API設計
api設計不用c++的原因
1、c++語言本身就是數據耦合的,因爲類直接暴露了c++的數據結構,從而造成數據見的耦合。
避免數據耦合可以使用 void*代替。
在.h中
“
class SocketInterface
{
public:
char m_szIp[32];
unsigned short m_sPort;
int m_nListen;
};
int init_socket(SocketInterface* handle);
int destory_socket(SocketInterface* handle);
“`
如果直接 把class申明放在.h頭文件中暴露出來,用戶可以隨意的使用SocketInterface中的變量, 就會造成數據耦合,
在 程序中引用此庫
int main()
{
SocketInterface* hdl = new SocketInterface();
strcpy(hdl->m_szIp,”127.0.0.1”);
hdl->m_sPort = 8080;
init_socket(hdl);
.accpet(hdl->m_nListen);
destory_socket(hdl);
}
此時程序還是能正常運行的,但是當 SocketInterface接口版本升級或者 某個二逼 改動了SocketInterface結構體之後,程序就可能會奔潰了。
1、改動後,我在SocketInterface中添加一個標記變量
class SocketInterface
{
public:
char m_szIp[32];
unsigned short m_sPort;
//add
int m_nIsAvalid;
int m_nListen;
};
然後在運行之前的程序的時候,程序就會掛掉。
因爲,在之前程序中,加載的SocketInterface接口動態庫的m_nListen變量的偏移地址已經固定了,但是由於SocketInterface接口動態庫升級了,m_nListen的偏移地址已經改變了,但是改程序還是使用的之前的偏移地址,所以程序掛掉。
2、程序在SocketInterface* hdl = new SocketInterface();時爲其分配的空間是 40
但是當改變之後,程序分配的空間是44,同樣會造成內存泄漏。
所以這種數據耦合在項目中會很危險,應該避免。因此 使用c++不合適。
當然也是有改進方法的,
在.h文件中,
typedef void SocketHandle
int init_socket(SocketHandle** handle,char* szIp,unsigned short sPort);
int listen_socket(SocketHandle* handle,callback func);
int destory_socket(SocketHandle** handle);
在.c文件中,
class SocketInterface
{
public:
char m_szIp[32];
unsigned short m_sPort;
//add
int m_nIsAvalid;
int m_nListen;
};
int init_socket(void** handle,char* szIp,unsigned short sPort){}
int listen_socket(void* handle,callback func){}
int destory_socket(void** handle){}
這種,不把內部數據顯示給用的方法,能有效避免用戶隨機性篡改數據造成錯誤。