摘要:在面向對象編程中類是對象的集合體,實現(xiàn)封裝的關鍵。針對面向對象語言和C語言的優(yōu)缺點,通過對C語言支持模塊編程特性的討論,提出一種用C語言文件來實現(xiàn)面向對象中類的特性的方法,使面向對象技術應用在資源緊張的環(huán)境中。通過實例表明程序具有較高的執(zhí)行效率,并且保持良好的可維護性。
關鍵詞:面向對象;類;模塊;結構體;C
中圖分類號:TP312文獻標識碼:A文章編號:1009-3044(2008)34-1670-03
Implementation of Class Based on Module
XU Bao-lei, HE Xian-bo
(Computer College, China West Normal University, Nanchong 637002, China)
Abstract: In the Object-Oriented, the class is the aggregation of objects, the key of implementing the encapsulation. According an advantage of Object-Oriented technique and C language, through discuss the support of the C language to module programme, put forward a kind of method of characteristic which implementation the class in the Object-Oriented with the C language. Make the problem has heigher executive efficiency, and keeps the high maintainability. Giving some codes to explain how it implementation.
Key words: Object-Oriented; class; module; struct; C
1 引言
對于復雜的嵌入式軟件項目,C++所體現(xiàn)的面向對象的分析和設計方法和消息模型驅動的軟件開發(fā)過程能夠顯著提高開發(fā)效率以及項目的可管理性和可維護性;但是C++語言本身對系統(tǒng)資源的要求高,使得在許多情況下不能直接用來開發(fā)嵌入式系統(tǒng)軟件。而C++是從C語言發(fā)展而來,是C的擴展集,因此使用C語言進行程序設計實現(xiàn)C++面向對象的思想不失為一個很好的選擇。
2 對象式與過程式比較
對象式程序設計是一種以數(shù)據(jù)為中心,基于數(shù)據(jù)抽象的程序設計范型[1]。一個面向對象程序由一些對象構成,對象是由一些數(shù)據(jù)及可施于這些數(shù)據(jù)的操作所構成的封裝體。對象的特證由相應的類來描述,一個類可以從其他類繼承。面向對象的執(zhí)行過程體現(xiàn)為各個對象之間相互發(fā)送和處理消息。面向對象程序設計可描述為:程序=對象/類+…對象/類=數(shù)據(jù)+操作。面向對象程序設計有著眾多優(yōu)點:采用數(shù)據(jù)抽象,以數(shù)據(jù)為中心把數(shù)據(jù)及能對其實施的操作作為一個整體(對象)來描述,加強了對數(shù)據(jù)的保護;可靠性高,所開發(fā)的程序更健壯,有較高的安全性檢查;可重用性高,在應用程序中采用類庫,縮短了開發(fā)時間;繼承和數(shù)據(jù)封裝使得應用程序的修改帶來的影響更加局部化,應用程序更易于維護。而其固有的缺點就是CPU時間的開銷,在實際應用中,C++的實現(xiàn)可能比用FORTRAN寫的相同的應用程序慢25%以上[2]。
過程式程序設計是以功能為中心,基于功能分解的程序設計范型[1]。過程式程序的執(zhí)行過程體現(xiàn)為一系列的子程序調用。過程式程序設計可描述為:程序=算法+數(shù)據(jù)結構,算法是數(shù)據(jù)加工步驟的描述,而數(shù)據(jù)結構是對要加工的數(shù)據(jù)的描述。C語言是一種面向過程的結構化編程語言,既有高級語言易于開發(fā)的特點又具有低級語言效率高的優(yōu)點:C語言程序效率比較高,包括執(zhí)行速度快和占用空間少;又具有低級語言才具有的一些描述能力,如數(shù)據(jù)位操作和內存地址操作,容易與匯編語言結合直接操作硬件;因此廣泛使用于操作系統(tǒng)等系統(tǒng)軟件的實現(xiàn)。但是C語言與面向對象語言C++相比在開發(fā)階段有許多缺點:過程式語言采用的是過程抽象,它對數(shù)據(jù)和操作的描述是分離的,數(shù)據(jù)處于附屬地位,獨立于操作,在程序調用中作為參數(shù)傳遞給子程序,不利于程序的設計、理解何維護;采用過程式封裝,即僅對數(shù)據(jù)操作的封裝,缺乏對數(shù)據(jù)的保護;編程結構不優(yōu)越,子程序功能的變化會導致程序結構的變化,從而是程序難以復用。
3 模塊設計方法
面向對象的程序設計方法起源于信息隱藏和抽象數(shù)據(jù)類型概念,其設計靈魂就是使用類中的private成員變量隱藏類實現(xiàn),使用public成員變量暴露類接口,類實現(xiàn)了面向對象中封裝的特性,這使得類的設計成為實現(xiàn)面向對象方法的關鍵。
在C++中,類的定義包括聲明和實現(xiàn)兩個部分[3]。聲明部分包括class語句,它確定了類的屬性和行為。當在程序中使用類創(chuàng)建對象時,僅僅是類的公共成員對程序可見,同時隱藏私有成員,程序必須通過公共成員函數(shù)間接的訪問私有成員。
在軟件開發(fā)中,通常是利用C語言的結構體(struct)來模擬類實現(xiàn)封裝[4],在C語言的結構中定義一些函數(shù)指針成員,在結構體初始化時,使他們各自指向所代表的函數(shù),將數(shù)據(jù)與處理函數(shù)綁定在一起。但結構體和C++中的類并非嚴格意義上的同義詞,其區(qū)別在于,結構體的成員默認是公有的,而類的成員默認的是私有的[5]。而且結構體只能封裝數(shù)據(jù)(成員變量),操作(成員函數(shù))常常是定義成全局變量,但是無限制的全局變量通常會有害于程序的可讀性和可維護性。對此我們可以利用C語言支持模塊式的編程風格把單個面向對象的C++程序轉變?yōu)槎鄠€C語言文件來實現(xiàn)封裝。C語言提供typedef保留字用于定義新的數(shù)據(jù)類型,同樣可以用它來模仿類的概念,以結構類型實現(xiàn)數(shù)據(jù)和方法的封裝[6]。通常,模塊一經(jīng)別的程序單元引用,當中的數(shù)據(jù)和例程就可訪問了。從這個意義上說,模塊類似于C++中的類,是用來模擬面向對象程序設計主要特性的基礎框架[7]。
對程序的邏輯單元進行分組體現(xiàn)了程序設計中模塊的概念,一個模塊通常由一組功能相關(共同實現(xiàn)一個邏輯功能)的程序實體的定義組成,按照“高內聚、低耦合”原則劃分模塊。在C語言中一個模塊可以分為“實現(xiàn)”和“接口”兩部分[8],“接口”部分主要指.h頭文件,用于定義本模塊使用的數(shù)據(jù)結構或函數(shù)以及任何使用該模塊的程序之間的接口;“實現(xiàn)”部分主要指C程序的源文件,包含了所有函數(shù)的代碼,用于具體實現(xiàn)。
在C語言中關鍵字extern和static可以限定函數(shù)或變量的作用范圍,具體如表1所示。
static可以實現(xiàn)一定的信息隱藏,達到封裝的目的。用extern關鍵字可以引用外部變量,實現(xiàn)對外部數(shù)據(jù)的引用。基于這種特性我們在C語言中創(chuàng)建“基于模塊”的類來實現(xiàn)面向對象中類的特性,把一個大的面向對象的程序轉換成多個清晰定義的“類”文件和“實現(xiàn)”文件,如圖1所示。
模塊的頭文件等價于類的接口,包含導出到其它模塊的數(shù)據(jù)和子程序,并且加強類型安全檢查。
參考以下的原則進行設計頭文件和實現(xiàn)文件:
.h頭文件中不能有數(shù)據(jù)的定義和可執(zhí)行代碼,只能有宏、類型(typedef, struct, union, menu),數(shù)據(jù)和函數(shù)的聲明。使用C語言的關鍵字static來確保只有本模塊中的函數(shù)才能訪問這個數(shù)據(jù),此模塊變成了我們的“類”,且模塊中static類型的數(shù)據(jù)成為類的私有數(shù)據(jù)成員,該模塊中的函數(shù)就成為模塊類的成員函數(shù)(公用)。“公有”成員函數(shù)在.h文件中定義它們的原型[9]。
“私有”成員函數(shù)(該函數(shù)只能被在某個特殊模塊內定義的函數(shù)調用),只需通過在.c實現(xiàn)文件中包含某個類的函數(shù)原型即可。“私有”成員函數(shù)用關鍵字static在.c實現(xiàn)文件中有它的原型。
#include預處理指令來手工導入類的頭文件,使得文件中的函數(shù)可以訪問封裝在另一個文件中該數(shù)據(jù)對象,是繼承和重入的一種弱形式。#include指令由于具有傳遞的特性使得程序容易形成循環(huán)依賴,所以要使用#ifndef語句來判斷。
4 簡單實例代碼
以下面的模塊為例,介紹“基于模塊的類”的設計。模塊定義了一個date(時間)類,包括屬性以及對屬性的操作,在這里我們只關注代碼的結構。
.h頭文件,包括數(shù)據(jù)抽象類型date以及對其操作的定義。
/* date.h */
static int month;
static int day;
static int year;
/*下面是date的“成員”函數(shù)*/
void setdate(int,int,int,int,int,int);
int getdate(int,int,int);
.c實現(xiàn)文件,定義了函數(shù)的具體實現(xiàn);
/* plant.c */
#include<stdio.h>
#include \"date.h\"
extern void setdate(int m,int d,int y,int month,int day,int year)
{month=m;
day=d;
year=y;
}
extern int getdate(int month,int day,int year)
{return year;}
main.c函數(shù),主要是調用類模塊,并且測試時間時使用,模塊的調用者,
#include<stdio.h>
/*<time.h>、<math.h>庫是用來測試程序運行時間的;*/
#include <time.h>
#include <math.h>
#include\"date.h\" //定義的類;
int main()
{int i=0; // 循環(huán)測試次數(shù)i;
int m=5;
int d=8;
int y=2008;
//定義兩個long類型的變量,放置時間;
long start,end;
start = clock();// 開始時間;
for(i=0;i<10000;i++)
{void assigndate(m,d,y,month,day,year);
int result=getdate(month,day,year);
printf(\"Employee hire data %d\\",result);
}
end = clock();// 結束時間;
printf(\"%ld\\",end-start);//單位:毫秒
return 0;
}
模塊對應的c++實現(xiàn)文件為:
//類定義,定義一個date類,
class Date
{public:
Date();
void setDate(int,int,int);
int getDate();
private:
int month;
int day;
int year;
};
Date::Date()
{month=\"\";
day=\"\";
year=\"\";
}
void Date::setDate(int m,int d,int y)
{month=m;
day=d;
year=y;
}
int Date::getDate()
{return year; }
/* data.cpp */
#include<iostream>
#include<cstdio>
#include<iostream>
using namespace std;
#include \"date.h\"
#include <time.h>
#include <math.h>
int main()
{long start,end;
start = clock();
int i=0; // 循環(huán)測試次數(shù)i;
for(i=0;i<10000;i++)
{
Date dateobj;
int hiremonth=\"May\";
int hireday=\"Eight\";
int hireyear=\"2008\";
dateobj.setDate(hiremonth,hireday,hireyear);
cout<<\"Enployee hire data\"<<endl;
cout<<dateobj.getDate()<<endl;
}
end = clock();
printf(\"%ld\\",end-start);//單位:毫秒
return 0;
}
圖2是對上面程序的測試比較,其中i是循環(huán)的次數(shù),測試時間的單位是毫秒。
5 結束語
面向對象的思想已經(jīng)在C語言中得到了廣泛的利用,例如MiniGUI圖形支持系統(tǒng)99%以上的代碼是C代碼,為了保證具有良好的靈活性和可擴展性,MiniGUI的開發(fā)中使用了許多面向對象的技術。用模塊實現(xiàn)類的方法更適合于系統(tǒng)資源緊張且與硬件緊密相關的嵌入式系統(tǒng)底層軟件開發(fā)中,利用了過程式語言和面向對象語言的各自優(yōu)點,保證了程序的高效性簡潔性和可維護性,析取硬件相關性與系統(tǒng)特定代碼并把它們封裝到簡單的低層次模塊中,并創(chuàng)建訪問接口。而且使用模塊化和面向對象的設計方法比用常規(guī)的程序設計方法能夠使軟件開發(fā)的生產(chǎn)率提高10~100倍[10]。
參考文獻
[1] 陳家俊,鄭滔.C++語言及面向對象程序設計[M].北京:機械工業(yè)出版社,2005:10-12
[2] Stroustrup B.The Design of C++[M].Stanford CA,University Video Communications,1999.
[3] Diane Z.C++編程導論[M].2版.馬良荔,趙羽中,程遠國,譯.北京:電子工業(yè)出版社,2005:322-324.
[4] 覃章健,葛良全.C++語言教學中類的本質深入剖析[J].現(xiàn)代計算機,2008(275).
[5] Joyener L.對象揭密:Java、Eiffel和C++[M].鮑志云,譯.北京:人民郵電出版社,2003:60-78
[6] 錢亞冠.Linux內核中面向對象思想的研究與應用[J].浙江科技學院學報,2006,18(2).
[7] 畢蘇萍,周振紅.Fortran與C/C++共享模塊中的數(shù)據(jù)和例程[J].鄭州大學學報:工學版,2008,29(1):99.
[8] Oualline S.實用C語言編程[M].3版.郭大海,譯.北京:中國電力出版社,2000:350-363.
[9] Pont M J.C語言嵌入式系統(tǒng)開發(fā)[M].陳繼輝,譯.北京:中國電力出版社,2003:81-89.
[10] Deitel H M,Deitel P J.C++程序設計教程[M].薛萬鵬,譯.北京:機械工業(yè)出版社,2000:26-193.