代碼封裝是為了什么 怎么封裝
時(shí)間:2018-03-08作者:華清遠(yuǎn)見(jiàn)
很多程序員小白在剛剛踏入職場(chǎng),做程序開(kāi)發(fā)工作的時(shí)候,經(jīng)常會(huì)被項(xiàng)目經(jīng)理叫去喝茶。 小白,你寫(xiě)的這代碼耦合太嚴(yán)重啦,簡(jiǎn)直沒(méi)有設(shè)計(jì)可言,更不要說(shuō)擴(kuò)展性和靈活性,所有的功能都定義在一個(gè)類里,這樣隨著功能的增多,代碼就越來(lái)越復(fù)雜。你趕緊把代碼拆分一下,各功能進(jìn)行一下代碼封裝。 1那什么是封裝呢? 封裝,在C語(yǔ)言編程中,大部分時(shí)候用一個(gè)函數(shù)調(diào)用(API)將一個(gè)復(fù)雜過(guò)程的細(xì)節(jié)屏蔽起來(lái),用戶不需要了解細(xì)節(jié),只需要調(diào)用該函數(shù)就能實(shí)現(xiàn)相應(yīng)的行為。例如吃飯函數(shù),將盛飯,動(dòng)筷子,夾菜,張嘴,咀嚼,下咽等細(xì)節(jié)屏蔽起來(lái),我們只需要調(diào)用吃飯函數(shù),默認(rèn)就實(shí)現(xiàn)了一遍這樣的流程。 面向?qū)ο笏枷胫械姆庋b使用更廣泛,即一個(gè)對(duì)象類(C語(yǔ)言中用結(jié)構(gòu)體代替),需要隱藏用戶不需要也不應(yīng)該知道的行為和屬性。用戶在訪問(wèn)對(duì)象時(shí),不需要了解被封裝的對(duì)象和屬性,就能使用該對(duì)象類,同時(shí)對(duì)象類也應(yīng)該通過(guò)權(quán)限設(shè)置,禁止用戶過(guò)多地了解被封裝的對(duì)象屬性與行為。 封裝的思想都是為了讓用戶不需要了解對(duì)象過(guò)多的細(xì)節(jié),就能直接通過(guò)API來(lái)使用對(duì)象,從而達(dá)到模塊化編程,程序員分工合作,各自負(fù)責(zé)維護(hù)自己負(fù)責(zé)模塊對(duì)象細(xì)節(jié)的作用。這個(gè)原則普遍存在于現(xiàn)實(shí)生活中,在軟件開(kāi)發(fā)領(lǐng)域也始終提倡著。 2為什么要進(jìn)行代碼封裝? 我們寫(xiě)程序是用來(lái)解決問(wèn)題的,而且要解決的是現(xiàn)實(shí)中的問(wèn)題,所以我們需要將現(xiàn)實(shí)問(wèn)題轉(zhuǎn)化為符號(hào)化的問(wèn)題,而現(xiàn)實(shí)中的問(wèn)題是由個(gè)體所組成的,所以我們將數(shù)據(jù)和處理數(shù)據(jù)的方法封裝起來(lái)形成一個(gè)個(gè)體,這個(gè)個(gè)體在問(wèn)題里面有專門的功能,比如一張紙可以折疊,一支筆可以寫(xiě),這樣有助于我們以自身的角度進(jìn)行思考分析,這就是面向?qū)ο蟆H绻妹嫦蜻^(guò)程的思路,會(huì)導(dǎo)致問(wèn)題與程序之間的轉(zhuǎn)化不好處理,可能使解決問(wèn)題出現(xiàn)偏差。 封裝的過(guò)程,其實(shí)就是對(duì)事物進(jìn)行抽象的過(guò)程,也是對(duì)事物進(jìn)行認(rèn)識(shí)的過(guò)程,我們從開(kāi)始到現(xiàn)在,封裝的層次越來(lái)越深,處理的問(wèn)題也越來(lái)越復(fù)雜。因?yàn)槲覀冃枰砬鍙?fù)雜問(wèn)題的內(nèi)部規(guī)律,從而找出解決問(wèn)題的辦法,而深層次的封裝使問(wèn)題恢復(fù)成本來(lái)的樣子就是一種解決辦法。所以說(shuō)封裝是在面對(duì)軟件復(fù)雜度增加,開(kāi)發(fā)過(guò)程中遇到各種瓶頸時(shí),為了解決這些問(wèn)題而提出的,通過(guò)封裝可以達(dá)到模塊化編程,程序員分工合作,各自負(fù)責(zé)維護(hù)自己負(fù)責(zé)模塊對(duì)象細(xì)節(jié)的作用。當(dāng)封裝的程度達(dá)到了一定的水平,就是面向?qū)ο蟮某绦蛟O(shè)計(jì)思想。 3什么是面向?qū)ο笏枷�,和面向過(guò)程有什么不同? 所謂面向?qū)ο蟮乃枷肫鋵?shí)就是一種在代碼編寫(xiě)之上的軟件系統(tǒng)結(jié)構(gòu)設(shè)計(jì)的思想,和語(yǔ)言無(wú)關(guān),并不是C++或者JAVA 、Python等語(yǔ)言才有的。面向?qū)ο笏枷�,是隨著軟件系統(tǒng)的復(fù)雜度越來(lái)越高,面對(duì)大規(guī)模軟件系統(tǒng)設(shè)計(jì)的問(wèn)題,而提出的一種管理大型軟件系統(tǒng)設(shè)計(jì)的思想。只是在C語(yǔ)言出現(xiàn)時(shí),計(jì)算機(jī)軟硬件系統(tǒng)還在起步階段,面向?qū)ο蟮乃枷肷形窗l(fā)展,因而C語(yǔ)言中缺乏面向?qū)ο笙嚓P(guān)的核心關(guān)鍵詞語(yǔ)法的支持。而JAVA、Python等一些1990年代之后問(wèn)世的語(yǔ)言,受到C++語(yǔ)言影響以及面向?qū)ο笏枷氲闹饾u流行,在語(yǔ)法層面就提供了面向?qū)ο蟮暮诵年P(guān)鍵詞支持,可以說(shuō)在處理面向?qū)ο髥?wèn)題上具有先天優(yōu)勢(shì)。雖然C語(yǔ)言不支持很多面向?qū)ο蟮暮诵年P(guān)鍵詞,但是隨著Linux內(nèi)核,F(xiàn)fmpeg,Nginx等大規(guī)模以C語(yǔ)言編寫(xiě)的開(kāi)源軟件項(xiàng)目的發(fā)展與推廣,C語(yǔ)言遇到的軟件復(fù)雜度增加以及系統(tǒng)設(shè)計(jì)與系統(tǒng)長(zhǎng)期維護(hù)的問(wèn)題,與JAVA、C++編程遇到的復(fù)雜度問(wèn)題是想通的。并且,面向?qū)ο笏枷胍彩怯捎陂_(kāi)發(fā)者們?cè)陂_(kāi)發(fā)過(guò)程中遇到瓶頸才提出來(lái)的,這些問(wèn)題,不管是用C語(yǔ)言編程還是JAVA編程,都會(huì)客觀存在。因而用C語(yǔ)言模擬JAVA等面向?qū)ο蟮恼Z(yǔ)言,采用面向?qū)ο蟮乃枷脒M(jìn)行系統(tǒng)頂層設(shè)計(jì)是很有必要的。 面向過(guò)程與面向?qū)ο蟮乃枷胗猛静煌�,沒(méi)有好壞之分。面向?qū)ο笏枷敫鼉A向于程序之上的頂層設(shè)計(jì)與程序系統(tǒng)結(jié)構(gòu)設(shè)計(jì),然后真正要實(shí)現(xiàn)一個(gè)函數(shù)細(xì)節(jié)的時(shí)候,還是需要面向過(guò)程地分析細(xì)節(jié)如何實(shí)現(xiàn),需要初始化哪些變量,注冊(cè)哪些結(jié)構(gòu),設(shè)置哪些寄存器等面向過(guò)程的問(wèn)題。 4在C語(yǔ)言中實(shí)現(xiàn)面向?qū)ο蟮乃枷?/p> 既然面向?qū)ο笫欠N思想,任何語(yǔ)言都可以實(shí)現(xiàn),而且這種思想最重要的幾個(gè)特性是封裝,繼承,多態(tài)。那在C語(yǔ)言中如何實(shí)現(xiàn)呢? 在正式介紹C語(yǔ)言實(shí)現(xiàn)封裝,繼承和多態(tài)事前,先介紹一下C語(yǔ)言中的幾個(gè)概念和語(yǔ)法。 4.1基本知識(shí) (1)結(jié)構(gòu)體 在C語(yǔ)言中,常把一個(gè)對(duì)象用結(jié)構(gòu)體進(jìn)行封裝,這樣便于對(duì)對(duì)象進(jìn)行操作,比如: strcut Point{ int x; int y; }; 結(jié)構(gòu)體可以嵌套。因而可以把一個(gè)結(jié)構(gòu)體當(dāng)成另一個(gè)結(jié)構(gòu)體的成員,如: struct Circle { struct Point point_; int radius; }; 該結(jié)構(gòu)體與以下定義完全一樣(包括內(nèi)存布置都一樣): struct Circle { int x; int y; int radius; }; (2)函數(shù)指針 函數(shù)指針是指針的一種,它指向函數(shù)的首地址(函數(shù)的函數(shù)名即為函數(shù)的首地址),可以通過(guò)函數(shù)指針來(lái)調(diào)用函數(shù)。 如函數(shù): int func(int a[], int n); 可以這樣聲明函數(shù)指針: int (*pFunc)(int a[], int n); 這樣使用: pFunc = func; (*pFunc)(a, n);【或者PFunc(a, n)】 可以用typedef定義一個(gè)函數(shù)指針類型,如: typdef int (*FUNC)(int a[], int n) 可以這樣使用: int cal_a(FUNC fptr, int a[], int n) { //實(shí)現(xiàn)體 } (3)extern與static extern和static是C語(yǔ)言中的兩個(gè)修飾符,extern可用于修飾函數(shù)或者變量,表示該變量或者函數(shù)在其他文件中進(jìn)行了定義;static也可用于修飾函數(shù)或者變量,表示該函數(shù)或者變量只能在該文件中使用�?衫盟鼈儗�(duì)數(shù)據(jù)或者函數(shù)進(jìn)行隱藏或者限制訪問(wèn)權(quán)限。 4.2封裝 在C語(yǔ)言中,可以用結(jié)構(gòu)+函數(shù)指針來(lái)模擬類的實(shí)現(xiàn),而用這種結(jié)構(gòu)定義的變量就是對(duì)象。封裝的主要含義是隱藏內(nèi)部的行為和信息,使用者只用看到對(duì)外提供的接口和公開(kāi)的信息。有兩種方法實(shí)現(xiàn)封裝: (1) 利用C語(yǔ)言語(yǔ)法。在頭文件中聲明,在C文件中真正定義它。
這樣可以隱藏內(nèi)部信息,因?yàn)橥獠坎恢缹?duì)象所占內(nèi)存的大小,所以不能靜態(tài)的創(chuàng)建該類的對(duì)象,只能調(diào)用類提供的創(chuàng)建函數(shù)才能創(chuàng)建。這種方法的缺陷是不支持繼承,因?yàn)樽宇愔械貌坏饺魏侮P(guān)于父類的信息。如: (2) 把私有數(shù)據(jù)信息放在一個(gè)不透明的priv變量或者結(jié)構(gòu)體中。只有類的實(shí)現(xiàn)代碼才知道priv或者結(jié)構(gòu)體的真正定義。如: #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語(yǔ)言中,可以利用“結(jié)構(gòu)在內(nèi)存中的布局與結(jié)構(gòu)的聲明具有一致的順序”這一事實(shí)實(shí)現(xiàn)繼承。 比如我們要設(shè)計(jì)一個(gè)作圖工具,其中可能涉及到的對(duì)象有Point(點(diǎn)),Circle(圓),由于圓是由點(diǎn)組成的,所有可以看成Circle繼承自Point。另外,Point和Circle都需要空間申請(qǐng),空間釋放等操作,所有他們有共同的基類Base。
//內(nèi)存管理類new.h 同樣,Circle要繼承Point,則可以這樣: struct Circle { const struct Point point; //放在第一位,可表繼承 int radius; }; 4.3多態(tài) 可以是用C語(yǔ)言中的萬(wàn)能指針void* 實(shí)現(xiàn)多態(tài),接上面的例子: //測(cè)試main.c void * p = new(Point, 1, 2); void * pp = new(Circle, 1, 2); draw(p); //draw函數(shù)實(shí)現(xiàn)了多態(tài) draw(pp); delete(p); delete(pp); C語(yǔ)言能夠模擬實(shí)現(xiàn)面向?qū)ο笳Z(yǔ)言具有的特性,包括:多態(tài),繼承,封裝等,現(xiàn)在很多開(kāi)源軟件都了用C語(yǔ)言實(shí)現(xiàn)了這幾個(gè)特性,包括大型開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)postgreSQL,可移植的C語(yǔ)言面向?qū)ο罂蚣蹽Object,無(wú)線二進(jìn)制運(yùn)行環(huán)境BREW。采用C語(yǔ)言實(shí)現(xiàn)多態(tài),繼承,封裝,能夠讓軟件有更好的可讀性,可擴(kuò)展性。 相關(guān)資訊
發(fā)表評(píng)論
|
學(xué)院新動(dòng)態(tài)
嵌入式招聘熱門文章全國(guó)咨詢電話:400-611-6270,雙休日及節(jié)假日請(qǐng)致電值班手機(jī):15010390966
在線咨詢: 曹老師QQ(3337544669), 徐老師QQ(1462495461), 劉老師 QQ(3108687497)
企業(yè)培訓(xùn)洽談專線:010-82600901,院校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)
Copyright 2004-2018 華清遠(yuǎn)見(jiàn)教育科技集團(tuán) 版權(quán)所有 ,京ICP備16055225號(hào),京公海網(wǎng)安備11010802025203號(hào)