1:去掉沒必要的全局變量和局部變量。
說明:全局變量是增大模塊間耦合的原因之一,故應減少沒必要的全局變量以降低模塊間的耦合度。
2:仔細定義并明確全局變量的含義、作用、取值范圍及全局變量間的關系。
說明:在對變量聲明的同時,應對其含義、作用及取值范圍進行注釋說明,同時若有必要還應說明與其它變量的關系。
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,故此變量將引起函數間較大的耦合,并可能增加代碼測試、維護的難度。
4:當向全局變量傳遞數據時,要十分小心,防止賦與不合理的值或越界等現象發生。
說明:對全局變量賦值時,若有必要應進行合法性檢查,以提高代碼的可靠性、穩定性。
5:防止局部變量與全局變量同名。
說明:若使用了較好的命名規則,那么此問題可自動消除。
6:嚴禁使用未經初始化的變量作為右值。
說明:特別是在C/C++中引用未經賦值的指針,經常會引起系統崩潰。
7:構造僅有一個模塊或函數可以修改、創建,而其余有關模塊或函數只訪問的全局變量,防止多個不同模塊或函數都可以修改、創建同一全局變量的現象。
說明:降低全局變量耦合度。
8:結構的功能要單一,是針對一種事務的抽象。
說明:設計結構時應力爭使結構代表一種現實事務的抽象,而不是同時代表多種。結構中的各元素應代表同一事務的不同側面,而不應把描述沒有關系或關系很弱的不同事務的元素放到同一結構中。
示例:如下結構不太清晰、合理。
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;
9:不要設計面面俱到、非常靈活的數據結構。
說明:面面俱到、靈活的數據結構反而容易引起誤解和操作困難。
10:不同結構間的關系不要過于復雜。
說明:若兩個結構間關系較復雜、密切,那么應合為一個結構。
示例:如下兩個結構的構造不合理。
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;
11:結構中元素的個數應適中。若結構中元素個數過多可考慮依據某種原則把元素組成不同的子結構,以減少原結構中元素的個數。
說明:增加結構的可理解性、可操作性和可維護性。
示例:假如認為如上的_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;
12:仔細設計結構中元素的布局與排列順序,使結構容易理解、節省占用空間,并減少引起誤用現象。
說明:合理排列結構中元素順序,可節省空間并增加可理解性。
示例:如下結構中的位域排列,將占較大空間,可讀性也稍差。
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;
13:留心具體語言及編譯器處理不同數據類型的原則及有關細節。
說明:如在C語言中,static局部變量將在內存“數據區”中生成,而非static局部變量將在“堆棧”中生成。這些細節對程序質量的保證非常重要。
14:編程時,要注意數據類型的強制轉換。
說明:當進行數據類型強制轉換時,其數據的意義、轉換后的取值等都有可能發生變化,而這些細節若考慮不周,就很有可能留下隱患。
15:對編譯系統默認的數據類型轉換,也要有充分的認識。
示例:如下賦值,多數編譯器不產生告警,但值的含義還是稍有變化。
char chr;
unsigned short int exam;
chr = -1;
exam = chr; // 編譯器不產生告警,此時exam為0xFFFF。
16:盡量減少沒有必要的數據類型默認轉換與強制轉換。
17:合理地設計數據并使用自定義數據類型,避免數據間進行不必要的類型轉換。
18:對自定義數據類型進行恰當命名,使它成為自描述性的,以提高代碼可讀性。注意其命名方式在同一產品中的統一。
說明:使用自定義類型,可以彌補編程語言提供類型少、信息量不足的缺點,并能使程序清晰、簡潔。
示例:可參考如下方式聲明自定義數據類型。
下面的聲明可使數據類型的使用簡潔、明了。
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
下面的聲明可使數據類型具有更豐富的含義。
typedef float DISTANCE;
typedef float SCORE;
編程中變量結構要點
更新時間: 2007-02-02 21:21:46來源: 粵嵌教育瀏覽量:1076