代碼封裝是為了什么 怎么封裝
時間:2018-03-08作者:華清遠見
很多程序員小白在剛剛踏入職場,做程序開發(fā)工作的時候,經(jīng)常會被項目經(jīng)理叫去喝茶。 小白,你寫的這代碼耦合太嚴重啦,簡直沒有設計可言,更不要說擴展性和靈活性,所有的功能都定義在一個類里,這樣隨著功能的增多,代碼就越來越復雜。你趕緊把代碼拆分一下,各功能進行一下代碼封裝。 1那什么是封裝呢? 封裝,在C語言編程中,大部分時候用一個函數(shù)調用(API)將一個復雜過程的細節(jié)屏蔽起來,用戶不需要了解細節(jié),只需要調用該函數(shù)就能實現(xiàn)相應的行為。例如吃飯函數(shù),將盛飯,動筷子,夾菜,張嘴,咀嚼,下咽等細節(jié)屏蔽起來,我們只需要調用吃飯函數(shù),默認就實現(xiàn)了一遍這樣的流程。 面向對象思想中的封裝使用更廣泛,即一個對象類(C語言中用結構體代替),需要隱藏用戶不需要也不應該知道的行為和屬性。用戶在訪問對象時,不需要了解被封裝的對象和屬性,就能使用該對象類,同時對象類也應該通過權限設置,禁止用戶過多地了解被封裝的對象屬性與行為。 封裝的思想都是為了讓用戶不需要了解對象過多的細節(jié),就能直接通過API來使用對象,從而達到模塊化編程,程序員分工合作,各自負責維護自己負責模塊對象細節(jié)的作用。這個原則普遍存在于現(xiàn)實生活中,在軟件開發(fā)領域也始終提倡著。 2為什么要進行代碼封裝? 我們寫程序是用來解決問題的,而且要解決的是現(xiàn)實中的問題,所以我們需要將現(xiàn)實問題轉化為符號化的問題,而現(xiàn)實中的問題是由個體所組成的,所以我們將數(shù)據(jù)和處理數(shù)據(jù)的方法封裝起來形成一個個體,這個個體在問題里面有專門的功能,比如一張紙可以折疊,一支筆可以寫,這樣有助于我們以自身的角度進行思考分析,這就是面向對象。如果用面向過程的思路,會導致問題與程序之間的轉化不好處理,可能使解決問題出現(xiàn)偏差。 封裝的過程,其實就是對事物進行抽象的過程,也是對事物進行認識的過程,我們從開始到現(xiàn)在,封裝的層次越來越深,處理的問題也越來越復雜。因為我們需要理清復雜問題的內部規(guī)律,從而找出解決問題的辦法,而深層次的封裝使問題恢復成本來的樣子就是一種解決辦法。所以說封裝是在面對軟件復雜度增加,開發(fā)過程中遇到各種瓶頸時,為了解決這些問題而提出的,通過封裝可以達到模塊化編程,程序員分工合作,各自負責維護自己負責模塊對象細節(jié)的作用。當封裝的程度達到了一定的水平,就是面向對象的程序設計思想。 3什么是面向對象思想,和面向過程有什么不同? 所謂面向對象的思想其實就是一種在代碼編寫之上的軟件系統(tǒng)結構設計的思想,和語言無關,并不是C++或者JAVA 、Python等語言才有的。面向對象思想,是隨著軟件系統(tǒng)的復雜度越來越高,面對大規(guī)模軟件系統(tǒng)設計的問題,而提出的一種管理大型軟件系統(tǒng)設計的思想。只是在C語言出現(xiàn)時,計算機軟硬件系統(tǒng)還在起步階段,面向對象的思想尚未發(fā)展,因而C語言中缺乏面向對象相關的核心關鍵詞語法的支持。而JAVA、Python等一些1990年代之后問世的語言,受到C++語言影響以及面向對象思想的逐漸流行,在語法層面就提供了面向對象的核心關鍵詞支持,可以說在處理面向對象問題上具有先天優(yōu)勢。雖然C語言不支持很多面向對象的核心關鍵詞,但是隨著Linux內核,F(xiàn)fmpeg,Nginx等大規(guī)模以C語言編寫的開源軟件項目的發(fā)展與推廣,C語言遇到的軟件復雜度增加以及系統(tǒng)設計與系統(tǒng)長期維護的問題,與JAVA、C++編程遇到的復雜度問題是想通的。并且,面向對象思想也是由于開發(fā)者們在開發(fā)過程中遇到瓶頸才提出來的,這些問題,不管是用C語言編程還是JAVA編程,都會客觀存在。因而用C語言模擬JAVA等面向對象的語言,采用面向對象的思想進行系統(tǒng)頂層設計是很有必要的。 面向過程與面向對象的思想用途不同,沒有好壞之分。面向對象思想更傾向于程序之上的頂層設計與程序系統(tǒng)結構設計,然后真正要實現(xiàn)一個函數(shù)細節(jié)的時候,還是需要面向過程地分析細節(jié)如何實現(xiàn),需要初始化哪些變量,注冊哪些結構,設置哪些寄存器等面向過程的問題。 4在C語言中實現(xiàn)面向對象的思想 既然面向對象是種思想,任何語言都可以實現(xiàn),而且這種思想最重要的幾個特性是封裝,繼承,多態(tài)。那在C語言中如何實現(xiàn)呢? 在正式介紹C語言實現(xiàn)封裝,繼承和多態(tài)事前,先介紹一下C語言中的幾個概念和語法。 4.1基本知識 (1)結構體 在C語言中,常把一個對象用結構體進行封裝,這樣便于對對象進行操作,比如: strcut Point{ int x; int y; }; 結構體可以嵌套。因而可以把一個結構體當成另一個結構體的成員,如: struct Circle { struct Point point_; int radius; }; 該結構體與以下定義完全一樣(包括內存布置都一樣): struct Circle { int x; int y; int radius; }; (2)函數(shù)指針 函數(shù)指針是指針的一種,它指向函數(shù)的首地址(函數(shù)的函數(shù)名即為函數(shù)的首地址),可以通過函數(shù)指針來調用函數(shù)。 如函數(shù): int func(int a[], int n); 可以這樣聲明函數(shù)指針: int (*pFunc)(int a[], int n); 這樣使用: pFunc = func; (*pFunc)(a, n);【或者PFunc(a, n)】 可以用typedef定義一個函數(shù)指針類型,如: typdef int (*FUNC)(int a[], int n) 可以這樣使用: int cal_a(FUNC fptr, int a[], int n) { //實現(xiàn)體 } (3)extern與static extern和static是C語言中的兩個修飾符,extern可用于修飾函數(shù)或者變量,表示該變量或者函數(shù)在其他文件中進行了定義;static也可用于修飾函數(shù)或者變量,表示該函數(shù)或者變量只能在該文件中使用。可利用它們對數(shù)據(jù)或者函數(shù)進行隱藏或者限制訪問權限。 4.2封裝 在C語言中,可以用結構+函數(shù)指針來模擬類的實現(xiàn),而用這種結構定義的變量就是對象。封裝的主要含義是隱藏內部的行為和信息,使用者只用看到對外提供的接口和公開的信息。有兩種方法實現(xiàn)封裝: (1) 利用C語言語法。在頭文件中聲明,在C文件中真正定義它。
這樣可以隱藏內部信息,因為外部不知道對象所占內存的大小,所以不能靜態(tài)的創(chuàng)建該類的對象,只能調用類提供的創(chuàng)建函數(shù)才能創(chuàng)建。這種方法的缺陷是不支持繼承,因為子類中得不到任何關于父類的信息。如: (2) 把私有數(shù)據(jù)信息放在一個不透明的priv變量或者結構體中。只有類的實現(xiàn)代碼才知道priv或者結構體的真正定義。如: #ifndef POINT _H #define POINT_H typedef struct Point point; typedef struct pointPrivate pointPrivate; strcut Point { Struct pointPrivate *pp; }; int get_x(point *point_); int get_y(point *point_); point * new_point(); //newer a point object void free_point(point *point_);// free the allocated space #endif //C文件:point.c #include”point.h” struct pointPrivate { int x; int y; } int get_x(point *point_) { return point_->pp->x; } int get_y(point *point_) { return point_->pp->y; } //others….. 4.3繼承 在C語言中,可以利用“結構在內存中的布局與結構的聲明具有一致的順序”這一事實實現(xiàn)繼承。 比如我們要設計一個作圖工具,其中可能涉及到的對象有Point(點),Circle(圓),由于圓是由點組成的,所有可以看成Circle繼承自Point。另外,Point和Circle都需要空間申請,空間釋放等操作,所有他們有共同的基類Base。
//內存管理類new.h 同樣,Circle要繼承Point,則可以這樣: struct Circle { const struct Point point; //放在第一位,可表繼承 int radius; }; 4.3多態(tài) 可以是用C語言中的萬能指針void* 實現(xiàn)多態(tài),接上面的例子: //測試main.c void * p = new(Point, 1, 2); void * pp = new(Circle, 1, 2); draw(p); //draw函數(shù)實現(xiàn)了多態(tài) draw(pp); delete(p); delete(pp); C語言能夠模擬實現(xiàn)面向對象語言具有的特性,包括:多態(tài),繼承,封裝等,現(xiàn)在很多開源軟件都了用C語言實現(xiàn)了這幾個特性,包括大型開源數(shù)據(jù)庫系統(tǒng)postgreSQL,可移植的C語言面向對象框架GObject,無線二進制運行環(huán)境BREW。采用C語言實現(xiàn)多態(tài),繼承,封裝,能夠讓軟件有更好的可讀性,可擴展性。 相關資訊
發(fā)表評論
|
全國咨詢電話:400-611-6270,雙休日及節(jié)假日請致電值班手機:15010390966
在線咨詢: 曹老師QQ(3337544669), 徐老師QQ(1462495461), 劉老師 QQ(3108687497)
企業(yè)培訓洽談專線:010-82600901,院校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)
Copyright 2004-2018 華清遠見教育科技集團 版權所有 ,京ICP備16055225號,京公海網(wǎng)安備11010802025203號