項目注意規範

前幾天公司的大牛架構師,給我們這些新來的員工對代碼和項目的規範做了一個講座,之後總結一二,說說新的體會吧。

一、代碼要求
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){}

這種,不把內部數據顯示給用的方法,能有效避免用戶隨機性篡改數據造成錯誤。

發佈了23 篇原創文章 · 獲贊 15 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章