華爲C語言編程規範(6)—變量、結構

5-1:去掉沒必要的公共變量。

說明:公共變量是增大模塊間耦合的原因之一,故應減少沒必要的公共變量以降低模塊間的耦合度。

5-2:仔細定義並明確公共變量的含義、作用、取值範圍及公共變量間的關係。

說明:在對變量聲明的同時,應對其含義、作用及取值範圍進行註釋說明,同時若有必要還應說明與其它變量的關係。

5-3:明確公共變量與操作此公共變量的函數或過程的關係,如訪問、修改及創建等。

說明:明確過程操作變量的關係後,將有利於程序的進一步優化、單元測試、系統聯調以及代碼維護等。這種關係的說明可在註釋或文檔中描述。

示例:在源文件中,可按如下注釋形式說明。
RELATION System_Init Input_Rec Print_Rec Stat_Score Student Create Modify Access Access Score Create Modify Access Access, Modify

注:RELATION 爲操作關係;System_Init、Input_Rec、Print_Rec、Stat_Score 爲四個不同的函數;Student、Score 爲兩個全局變量;Create 表示創建,Modify 表示修改,Access 表示訪
問。其中,函數Input_Rec、Stat_Score 都可修改變量Score,故此變量將引起函數間較大的耦合,並可能增加代碼測試、維護的難度。


5-4:當向公共變量傳遞數據時,要十分小心,防止賦與不合理的值或越界等現象發生。

說明:對公共變量賦值時,若有必要應進行合法性檢查,以提高代碼的可靠性、穩定性。

5-5:防止局部變量與公共變量同名。

說明:若使用了較好的命名規則,那麼此問題可自動消除。

5-6:嚴禁使用未經初始化的變量作爲右值。

說明:特別是在C/C++中引用未經賦值的指針,經常會引起系統崩潰。

5-7:結構的功能要單一,是針對一種事務的抽象。

說明:設計結構時應力爭使結構代表一種現實事務的抽象,而不是同時代表多種。結構中的各元素應代表同一事務的不同側面,而不應把描述沒有關係或關係很弱的不同事務的元素放到同一結構中。

示例:如下結構不太清晰、合理。
typedef struct STUDENT_STRU
{
unsigned char name[8]; /* student's name */
unsigned char age; /* student's age */
unsigned char sex; /* student's sex, as follows */
/* 0 - FEMALE; 1 - MALE */
unsigned char
teacher_name[8]; /* the student teacher's name */
unisgned char
teacher_sex; /* his teacher sex */
} STUDENT;

若改爲如下,可能更合理些。
typedef struct TEACHER_STRU
{
unsigned char name[8]; /* teacher name */
unisgned char sex; /* teacher sex, as follows */
/* 0 - FEMALE; 1 - MALE */
} TEACHER;
typedef struct STUDENT_STRU
{
unsigned char name[8]; /* student's name */
unsigned char age; /* student's age */
unsigned char sex; /* student's sex, as follows */
/* 0 - FEMALE; 1 - MALE */
unsigned int teacher_ind; /* his teacher index */
} STUDENT;

5-8:不要設計面面俱到、非常靈活的數據結構。

說明:面面俱到、靈活的數據結構反而容易引起誤解和操作困難。

5-9:不同結構間的關係不要過於複雜。

說明:若兩個結構間關係較複雜、密切,那麼應合爲一個結構。

示例:如下兩個結構的構造不合理。
typedef struct PERSON_ONE_STRU
{
unsigned char name[8];
unsigned char addr[40];
unsigned char sex;
unsigned char city[15];
} PERSON_ONE;
typedef struct PERSON_TWO_STRU
{
unsigned char name[8];
unsigned char age;
unsigned char tel;
} PERSON_TWO;

由於兩個結構都是描述同一事物的,那麼不如合成一個結構。
typedef struct PERSON_STRU
{
unsigned char name[8];
unsigned char age;
unsigned char sex;
unsigned char addr[40];
unsigned char city[15];
unsigned char tel;
} PERSON;

5-10:結構中元素的個數應適中。若結構中元素個數過多可考慮依據某種原則把元素組成不同的子結構,以減少原結構中元素的個數。

說明:增加結構的可理解性、可操作性和可維護性。

示例:假如認爲如上的_PERSON 結構元素過多,那麼可如下對之劃分。
typedef struct PERSON_BASE_INFO_STRU
{
unsigned char name[8];
unsigned char age;
unsigned char sex;
} PERSON_BASE_INFO;
typedef struct PERSON_ADDRESS_STRU
{
unsigned char addr[40];
unsigned char city[15];
unsigned char tel;
} PERSON_ADDRESS;
typedef struct PERSON_STRU
{
PERSON_BASE_INFO person_base;
PERSON_ADDRESS person_addr;
} PERSON;

5-11:仔細設計結構中元素的佈局與排列順序,使結構容易理解、節省佔用空間,並減少引起誤用現象。

說明:合理排列結構中元素順序,可節省空間並增加可理解性。

示例:如下結構中的位域排列,將佔較大空間,可讀性也稍差。
typedef struct EXAMPLE_STRU
{
unsigned int valid: 1;
PERSON person;
unsigned int set_flg: 1;
} EXAMPLE;
若改成如下形式,不僅可節省1 字節空間,可讀性也變好了。
typedef struct EXAMPLE_STRU
{
unsigned int valid: 1;
unsigned int set_flg: 1;
PERSON person ;
} EXAMPLE;

5-12:編程時,要注意數據類型的強制轉換。

說明:當進行數據類型強制轉換時,其數據的意義、轉換後的取值等都有可能發生變化,而這些細節若考慮不周,就很有可能留下隱患。

5-13:對編譯系統默認的數據類型轉換,也要有充分的認識。

示例:如下賦值,多數編譯器不產生告警,但值的含義還是稍有變化。
char chr;
unsigned short int exam;
chr = -1;
exam = chr; // 編譯器不產生告警,此時exam 爲0xFFFF。

5-14:儘量減少沒有必要的數據類型默認轉換與強制轉換。

5-15:合理地設計數據並使用自定義數據類型,避免數據間進行不必要的類型轉換。

5-16:對自定義數據類型進行恰當命名,使它成爲自描述性的,以提高代碼可讀性。注意其命名方式在同一產品中的統一。

說明:使用自定義類型,可以彌補編程語言提供類型少、信息量不足的缺點,並能使程序清晰、簡潔。

示例:可參考如下方式聲明自定義數據類型。下面的聲明可使數據類型的使用簡潔、明瞭。
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;

下面的聲明可使數據類型具有更豐富的含義。
typedef float DISTANCE;
typedef float SCORE;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章