色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當(dāng)前位置:IT培訓(xùn) > 華清遠見教育科技集團 > 嵌入式學(xué)習(xí) > 講師博文 > 代碼封裝是為了什么 怎么封裝
代碼封裝是為了什么 怎么封裝
時間:2018-03-08作者:華清遠見

很多程序員小白在剛剛踏入職場,做程序開發(fā)工作的時候,經(jīng)常會被項目經(jīng)理叫去喝茶。

小白,你寫的這代碼耦合太嚴(yán)重啦,簡直沒有設(shè)計可言,更不要說擴展性和靈活性,所有的功能都定義在一個類里,這樣隨著功能的增多,代碼就越來越復(fù)雜。你趕緊把代碼拆分一下,各功能進行一下代碼封裝。

1那什么是封裝呢?

封裝,在C語言編程中,大部分時候用一個函數(shù)調(diào)用(API)將一個復(fù)雜過程的細節(jié)屏蔽起來,用戶不需要了解細節(jié),只需要調(diào)用該函數(shù)就能實現(xiàn)相應(yīng)的行為。例如吃飯函數(shù),將盛飯,動筷子,夾菜,張嘴,咀嚼,下咽等細節(jié)屏蔽起來,我們只需要調(diào)用吃飯函數(shù),默認(rèn)就實現(xiàn)了一遍這樣的流程。

面向?qū)ο笏枷胫械姆庋b使用更廣泛,即一個對象類(C語言中用結(jié)構(gòu)體代替),需要隱藏用戶不需要也不應(yīng)該知道的行為和屬性。用戶在訪問對象時,不需要了解被封裝的對象和屬性,就能使用該對象類,同時對象類也應(yīng)該通過權(quán)限設(shè)置,禁止用戶過多地了解被封裝的對象屬性與行為。

封裝的思想都是為了讓用戶不需要了解對象過多的細節(jié),就能直接通過API來使用對象,從而達到模塊化編程,程序員分工合作,各自負責(zé)維護自己負責(zé)模塊對象細節(jié)的作用。這個原則普遍存在于現(xiàn)實生活中,在軟件開發(fā)領(lǐng)域也始終提倡著。

2為什么要進行代碼封裝?

我們寫程序是用來解決問題的,而且要解決的是現(xiàn)實中的問題,所以我們需要將現(xiàn)實問題轉(zhuǎn)化為符號化的問題,而現(xiàn)實中的問題是由個體所組成的,所以我們將數(shù)據(jù)和處理數(shù)據(jù)的方法封裝起來形成一個個體,這個個體在問題里面有專門的功能,比如一張紙可以折疊,一支筆可以寫,這樣有助于我們以自身的角度進行思考分析,這就是面向?qū)ο蟆H绻妹嫦蜻^程的思路,會導(dǎo)致問題與程序之間的轉(zhuǎn)化不好處理,可能使解決問題出現(xiàn)偏差。

封裝的過程,其實就是對事物進行抽象的過程,也是對事物進行認(rèn)識的過程,我們從開始到現(xiàn)在,封裝的層次越來越深,處理的問題也越來越復(fù)雜。因為我們需要理清復(fù)雜問題的內(nèi)部規(guī)律,從而找出解決問題的辦法,而深層次的封裝使問題恢復(fù)成本來的樣子就是一種解決辦法。所以說封裝是在面對軟件復(fù)雜度增加,開發(fā)過程中遇到各種瓶頸時,為了解決這些問題而提出的,通過封裝可以達到模塊化編程,程序員分工合作,各自負責(zé)維護自己負責(zé)模塊對象細節(jié)的作用。當(dāng)封裝的程度達到了一定的水平,就是面向?qū)ο蟮某绦蛟O(shè)計思想。

3什么是面向?qū)ο笏枷耄兔嫦蜻^程有什么不同?

所謂面向?qū)ο蟮乃枷肫鋵嵕褪且环N在代碼編寫之上的軟件系統(tǒng)結(jié)構(gòu)設(shè)計的思想,和語言無關(guān),并不是C++或者JAVA 、Python等語言才有的。面向?qū)ο笏枷耄请S著軟件系統(tǒng)的復(fù)雜度越來越高,面對大規(guī)模軟件系統(tǒng)設(shè)計的問題,而提出的一種管理大型軟件系統(tǒng)設(shè)計的思想。只是在C語言出現(xiàn)時,計算機軟硬件系統(tǒng)還在起步階段,面向?qū)ο蟮乃枷肷形窗l(fā)展,因而C語言中缺乏面向?qū)ο笙嚓P(guān)的核心關(guān)鍵詞語法的支持。而JAVA、Python等一些1990年代之后問世的語言,受到C++語言影響以及面向?qū)ο笏枷氲闹饾u流行,在語法層面就提供了面向?qū)ο蟮暮诵年P(guān)鍵詞支持,可以說在處理面向?qū)ο髥栴}上具有先天優(yōu)勢。雖然C語言不支持很多面向?qū)ο蟮暮诵年P(guān)鍵詞,但是隨著Linux內(nèi)核,F(xiàn)fmpeg,Nginx等大規(guī)模以C語言編寫的開源軟件項目的發(fā)展與推廣,C語言遇到的軟件復(fù)雜度增加以及系統(tǒng)設(shè)計與系統(tǒng)長期維護的問題,與JAVA、C++編程遇到的復(fù)雜度問題是想通的。并且,面向?qū)ο笏枷胍彩怯捎陂_發(fā)者們在開發(fā)過程中遇到瓶頸才提出來的,這些問題,不管是用C語言編程還是JAVA編程,都會客觀存在。因而用C語言模擬JAVA等面向?qū)ο蟮恼Z言,采用面向?qū)ο蟮乃枷脒M行系統(tǒng)頂層設(shè)計是很有必要的。

面向過程與面向?qū)ο蟮乃枷胗猛静煌瑳]有好壞之分。面向?qū)ο笏枷敫鼉A向于程序之上的頂層設(shè)計與程序系統(tǒng)結(jié)構(gòu)設(shè)計,然后真正要實現(xiàn)一個函數(shù)細節(jié)的時候,還是需要面向過程地分析細節(jié)如何實現(xiàn),需要初始化哪些變量,注冊哪些結(jié)構(gòu),設(shè)置哪些寄存器等面向過程的問題。

4在C語言中實現(xiàn)面向?qū)ο蟮乃枷?/p>

既然面向?qū)ο笫欠N思想,任何語言都可以實現(xiàn),而且這種思想最重要的幾個特性是封裝,繼承,多態(tài)。那在C語言中如何實現(xiàn)呢?

在正式介紹C語言實現(xiàn)封裝,繼承和多態(tài)事前,先介紹一下C語言中的幾個概念和語法。

4.1基本知識

(1)結(jié)構(gòu)體

在C語言中,常把一個對象用結(jié)構(gòu)體進行封裝,這樣便于對對象進行操作,比如:

strcut Point{

int x;

int y;

};

結(jié)構(gòu)體可以嵌套。因而可以把一個結(jié)構(gòu)體當(dāng)成另一個結(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ù)的首地址),可以通過函數(shù)指針來調(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定義一個函數(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ù)進行隱藏或者限制訪問權(quán)限。

4.2封裝

在C語言中,可以用結(jié)構(gòu)+函數(shù)指針來模擬類的實現(xiàn),而用這種結(jié)構(gòu)定義的變量就是對象。封裝的主要含義是隱藏內(nèi)部的行為和信息,使用者只用看到對外提供的接口和公開的信息。有兩種方法實現(xiàn)封裝:

(1) 利用C語言語法。在頭文件中聲明,在C文件中真正定義它。

這樣可以隱藏內(nèi)部信息,因為外部不知道對象所占內(nèi)存的大小,所以不能靜態(tài)的創(chuàng)建該類的對象,只能調(diào)用類提供的創(chuàng)建函數(shù)才能創(chuàng)建。這種方法的缺陷是不支持繼承,因為子類中得不到任何關(guān)于父類的信息。如:
//頭文件:point.h
  #ifndef POINT_H
  #define POINT_H
  struct Point;
  typedef struct 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”
strcut Point
 {
  int x;
  int y;
};
point * new_point()
{
point * new_point_ = (point *) malloc(sizeof(point));
return new_point_;
}
void free_point(point *point_)
{
if(point_ == NULL)
return;
free(point_);
}

(2) 把私有數(shù)據(jù)信息放在一個不透明的priv變量或者結(jié)構(gòu)體中。只有類的實現(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語言中,可以利用“結(jié)構(gòu)在內(nèi)存中的布局與結(jié)構(gòu)的聲明具有一致的順序”這一事實實現(xiàn)繼承。

比如我們要設(shè)計一個作圖工具,其中可能涉及到的對象有Point(點),Circle(圓),由于圓是由點組成的,所有可以看成Circle繼承自Point。另外,Point和Circle都需要空間申請,空間釋放等操作,所有他們有共同的基類Base。

//內(nèi)存管理類new.h
 #ifndef NEW_H
  #define NEW_H
  void * new (const void * class, ...);
  void delete (void * item);
  void draw (const void * self);
  #endif
  
//內(nèi)存管理類的C文件:new.c
  #include “new.h”
  #include “base.h”
  void * new (const void * _base, ...)
  {
  const struct Base * base = _base;
  void * p = calloc(1, base->size);
  assert(p);
  * (const struct Base **) p = base;
if (base ->ctor)
  {
va_list ap;
va_start(ap, _base);
 p = base ->ctor(p, &ap);
  va_end(ap);
}
  return p;
}
 
void delete (void * self)
{
const struct Base ** cp = self;
if (self && * cp && (* cp) —> dtor)
self = (* cp) —>dtor(self);
free(self);
}
  
void draw (const void * self)
{
const struct Base * const * cp = self;
assert(self &&* cp && (* cp)->draw);
(* cp) ->draw(self);
}
  
//基類:base.h
#ifndef BASE_H
#define BASE_H
struct Base
{
size_t size; //類所占空間
void * (* ctor) (void * self, va_list * app); //構(gòu)造函數(shù)
void * (* dtor) (void * self); //析構(gòu)函數(shù)
void (* draw) (const void * self); //作圖
};
#endif
 
//Point頭文件(對外提供的接口):point.h
#ifndef   POINT_H
  
#define  POINT_H
extern const void * Point;                /* 使用方法:new (Point, x, y); */
#endif
 
//Point內(nèi)部頭文件(外面看不到):point.r
#ifndef POINT_R
#define POINT_R
struct Point
{
const void * base; //繼承,基類指針,放在第一個位置,const是防止修改
int x, y;        //坐標(biāo)
}
#endif
  
//Point的C文件:point.c
#include “point.h”
#include “new.h”
#include “point.h”
#include “point.r”
static void * Point_ctor (void * _self, va_list * app)
{
struct Point * self = _self;
self ->x = va_arg(* app, int);
self ->y = va_arg(* app, int);
return self;
}
  
static void Point_draw (const void * _self)
{
const struct Point * self = _self;
printf(“draw (%d,%d)”, self -> x, self -> y);
}
static const struct Base _Point = {
sizeof(struct Point), Point_ctor, 0, Point_draw
};
const void * Point = & _Point;
  
//測試程序:main.c
#include “point.h”
#include “new.h”
int main (int argc, char ** argv)
{
void * p = new(Point, 1, 2);
draw(p);
delete(p);
}

同樣,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)面向?qū)ο笳Z言具有的特性,包括:多態(tài),繼承,封裝等,現(xiàn)在很多開源軟件都了用C語言實現(xiàn)了這幾個特性,包括大型開源數(shù)據(jù)庫系統(tǒng)postgreSQL,可移植的C語言面向?qū)ο罂蚣蹽Object,無線二進制運行環(huán)境BREW。采用C語言實現(xiàn)多態(tài),繼承,封裝,能夠讓軟件有更好的可讀性,可擴展性。


發(fā)表評論

全國咨詢電話:400-611-6270,雙休日及節(jié)假日請致電值班手機:15010390966

在線咨詢: 曹老師QQ(3337544669), 徐老師QQ(1462495461), 劉老師 QQ(3108687497)

企業(yè)培訓(xùn)洽談專線:010-82600901,院校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)

Copyright 2004-2018 華清遠見教育科技集團 版權(quán)所有 ,京ICP備16055225號,京公海網(wǎng)安備11010802025203號

有位老師想和您聊一聊

主站蜘蛛池模板: 成人无码潮喷在线观看 | 曰本女人牲交全视频免费播放 | 麻豆合集| 夜间视频在线观看 | 少妇做爰免费视看片 | 九九九九视频 | 91国语精品 | 日本无码视频在线观看 | 国产97人人超碰CAO蜜芽PROM | 欧美老熟妇com | 天天爱天天做天天爽夜夜揉 | 在线观看免费播放av片 | 激情国产一区二区三区四区 | 午夜香吻免费观看视频在线播放 | 在线中文字幕日韩 | 一本久久A久久免费精品不卡 | 国产伦子沙发午休系列资源曝光 | 熟妇人妻中文AV无码 | 四虎永久免费观看在线 | 精品国内自产拍在线观看 | 免费无码成人AV片在线在线播放 | 国产成人乱色伦区 | 成熟人妻换╳╳╳╳ | 日日激情综合久久一区 | 最新视频一区二区 | 特高潮合集hd | 成人自拍视频 | 精品国产午夜福利精品推荐 | 2024AV天堂手机在线观看 | 加勒比色综合久久久久久久久 | 好深好湿好硬顶到了好爽 | 久久不卡精品 | 久久精品中文字幕无码绿巨人 | GV无码免费无禁网站男男 | 97无码成人永久免费视频软件 | 看全黄大色黄大片老人做 | 丁香五月欧美成人 | 成年美女黄网站色大片不卡 | 国产午夜无码片在线观看网站 | 最新国模无码国产在线视频 | 中国裸体BBBBXXXX |