封裝編程
㈠ 編程之封裝框架
有了函數封裝和封裝大項後,有時候調用還是有不少重復賣型的編程代碼,為了不做重復的低效復制粘貼,引用框架就顯得相當重要,我認為的框架是將重復的代碼部分做歸納總結,進一步提煉得出執行框架,重復的部分是框架的組成部分,可變的是調用框架執行代碼的部分。
註:可以看我之前的文章描述的關於函數封裝(功能小項)和封裝大項說明
比如下面是自製的菜單框架YMC,仿MVC,防止遞歸調用。
菜單是獨立操作,當一個菜單調用時,前一個菜單就要退出。
菜單框架分為刷新整個視圖,刷新元素視圖,菜單變化處理,按鍵輸入、菜單的進入、菜單的退出和定時任務。
菜單框中肢猜架YMC的h文件內容:
typedef struct
{
void (*DrawViewData)(void);//視圖數據
void (*DrawViewFrame)(void);//視圖窗體
void (*DrawViewChange)(void);//視圖數據變化
void (*MenuBtnCtrl)(U32);//控制按鍵識別
void (*MenuExit)(void);//菜單退出
void (*OnTimer)(void);//定時任務
} _ViewCtrl;
enum
{
TIMER_ONCE,//單次
TIMER_FOR,//永久
TIMER_SEC,//永久秒
};
void YMCCtrl_SetTimer(U8 Opt,U16 Timer);//設置定時
void YMCCtrl_Set(_ViewCtrl *main_Ctrl);//設置菜單主體元素
//Index 第幾個元素更新
void SetYMCViewElement(U16 Index);
U8 GetYMCViewElement(U16 Index);
//刷新整個界面元素
void SetYMCViewFrameTrue(void);
//菜單使用的緩存
U8 *YMC_SettempsBuf(void);
void YMC_SettempsBufClear(void);
extern OS_EVENT * msg_YMCkey; //按鍵郵箱事件塊指針主界面鍵值
extern void (*YMCJumper)(void);
菜單框架YMC的c文件內容:
//全局跳轉函數菜單跳轉
void (*YMCJumper)(void);
static U8 YMCLastSec;
//菜單使用的緩存
U8 YMC_GETTEMPS[800];
U8 *YMC_SettempsBuf(void)
{
return YMC_GETTEMPS;
}
void YMC_SettempsBufClear(void)
{
memset(YMC_GETTEMPS,0x00,sizeof(YMC_GETTEMPS));
}
typedef struct
{
U16 UpdataDataEle;//更新元素
U8 UpdataMenuFrame:1;//更新整個menu
U8 TimerOpt:2;//0一次,1永久,2秒定時
U8 :0;
U16 Timer;//0,1次數10ms 2次數秒
} ViewSetup; //
static ViewSetup YMCViewDraw= {0};
//更新菜單全部內容
void SetYMCViewFrameTrue(void)
{
YMCViewDraw.UpdataMenuFrame = 1;
}
//Index 第幾個位置更新
void SetYMCViewElement(U16 Index)
{
YMCViewDraw.UpdataDataEle |= 1<<index; p=""> </index;>飢喚
}
//更新菜單全部內容
U8 GetYMCViewElement(U16 Index)
{
return ((YMCViewDraw.UpdataDataEle&(1< 0);
}
//設置菜單定時
void YMCCtrl_SetTimer(U8 Opt,U16 Timer)
{
YMCViewDraw.TimerOpt = Opt;
YMCViewDraw.Timer = Timer;
}
static _ViewCtrl YMCCtrl= {0};
void YMCCtrl_Set(_ViewCtrl *main_Ctrl)
{
YMCCtrl = *main_Ctrl;
}
//更新菜單內容
void YMCViewUpdata(void)
{
if(YMCViewDraw.UpdataMenuFrame)//更新菜單全部內容
{
YMCViewDraw.UpdataMenuFrame = 0;
Mutex_Pend();//互斥保護
if(YMCCtrl.DrawViewFrame)
{
YMCCtrl.DrawViewFrame();
}
if(YMCCtrl.DrawViewData)
{
YMCCtrl.DrawViewData();
}
Mutex_Post();
YMCViewDraw.UpdataDataEle = 0;
}
if(YMCViewDraw.UpdataDataEle)//更新菜單元素內容
{
Mutex_Pend();//互斥保護
if(YMCCtrl.DrawViewData)
{
YMCCtrl.DrawViewData();
}
Mutex_Post();
YMCViewDraw.UpdataDataEle = 0;
}
}
//檢查當前menu是否改變
static U8 CheckYMCCg(void)
{
static void *func = NULL;
if(YMCJumper != func)
{
func = YMCJumper;
return 1;
}
return 0;
}
//定時
static void CalcOnTimer(U16 *Timer)
{
if(YMCViewDraw.TimerOpt == 0)
{
if(*Timer<=YMCViewDraw.Timer)
{
(*Timer)++;
}
if(*Timer==YMCViewDraw.Timer)
{
YMCCtrl.OnTimer();
}
}
else if(YMCViewDraw.TimerOpt == 1)
{
if(*Timer<=YMCViewDraw.Timer)
{
(*Timer)++;
}
if((*Timer>=YMCViewDraw.Timer)&&(YMCViewDraw.Timer))
{
*Timer = 0;
YMCCtrl.OnTimer();
}
}
else
{
if (YMCLastSec != User_RtcTime.RTC_Seconds)
{
YMCLastSec = User_RtcTime.RTC_Seconds;
if(*Timer<=YMCViewDraw.Timer)
{
(*Timer)++;
}
if((*Timer>=YMCViewDraw.Timer)&&(YMCViewDraw.Timer))
{
*Timer = 0;
YMCCtrl.OnTimer();
}
}
}
}
//YMC菜單框架主函數
void CtrlYMC_Func(void)
{
U8 err;
U32 UserKeyCmd;
U16 Timer = 0;
//默認顯示窗體
YMCViewDraw.UpdataMenuFrame = 1;
YMCCtrl_SetTimer(0,0);
YMCLastSec = User_RtcTime.RTC_Seconds;
SetMenuSetupflag(MENUSET_TMDLYCLOSE,MENUSETCLOSEDLY);
YMCJumper();
while(1)
{
YMCViewUpdata();
MenuDelayClose();//菜單定時自動退出,簡單分層狀態機
if(CheckYMCCg())
{
if(YMCCtrl.MenuExit)
{
YMCCtrl.MenuExit();
CheckYMCCg();
}
Run_SavePlan();//退出時存儲菜單數據
return;
}
if(YMCCtrl.DrawViewChange)
{
YMCCtrl.DrawViewChange();
}
if(YMCCtrl.OnTimer)
{
CalcOnTimer(&Timer);
}
UserKeyCmd = (U32)OSMboxPend(msg_YMCkey,10,&err);
if(OS_ERR_TIMEOUT != err)
{
if(YMCCtrl.MenuBtnCtrl)
{
YMCCtrl.MenuBtnCtrl(UserKeyCmd);
}
}
}
}
//執行YMC菜單框架的任務。
void CtrlYMC_task(void *pdata)
{
//跳轉到主界面
YMCJumper = Menu_Init_Func;
CheckYMCCg();//初始化菜單跳轉
while(1)
{
//跳轉函數執行
CtrlYMC_Func();
delay_ms(10);
}
}
菜單主體:(功能大項)
typedef struct {
U8Minute;//分
}MainMenuCg;
MainMenuCg MainMenu_Cg;
//清除當前顏色區
void Dw_Pic_Window_YMCMenu(void)
{
}
//顯示窗口控制項
void Dw_Pic_Whole_YMCMenu(void)
{
}
/***********************************************************************
* 函數名稱 : YMCMenu_Init
* 描述 : 初始化按鍵值和緩存
* 輸入形參 :
* 返回值 :
************************************************************************/
static void YMCMenu_Init(void)
{
}
/***********************************************************************
* 函數名稱 : ShowYMCMenu_DataInfo
* 描述 : 顯示數據
* 輸入形參 :
* 返回值 :
************************************************************************/
static void ShowYMCMenu_DataInfo(void)
{
if (GetYMCViewElement(0))
{
Dw_Element0();
}
if(GetYMCViewElement(1))
{
Dw_Element1();
}
}
/***********************************************************************
* 函數名稱 : ShowYMCMenu_DataChange
* 描述 : 數據更改
* 輸入形參 :
* 返回值 :
************************************************************************/
static void ShowYMCMenu_DataChange(void)
{
if(YMCMenu_Cg.Minute != User_RtcTime.RTC_Minutes)//全局rtc分比較 1分鍾刷一次
{
YMCMenu_Cg.Minute = User_RtcTime.RTC_Minutes;
SetYMCViewElement(1);
}
}
/***********************************************************************
* 函數名稱 : YMCMenu_Exit
* 描述 : 退出
* 輸入形參 :
* 返回值 :
************************************************************************/
static void YMCMenu_Exit(void)
{
}
/***********************************************************************
* 函數名稱 : YMCMenu_Btn
* 描述 : 按鍵處理
* 輸入形參 :
* 返回值 :
************************************************************************/
static void YMCMenu_Btn(U32 UserKeyCmd)
{
switch (UserKeyCmd)
{
case YMCKEY:
{
Func1();
}
break;
case YMCKEY+1:
{
Func2();
}
break;
case YMCKEY+2:
{
MainJumper = YMCMenu2_func;
}
break;
default:
break;
}
}
/***********************************************************************
* 函數名稱 : ShowYMCMenu_func
* 描述 : 顯示界面
* 輸入形參 :
* 返回值 :
************************************************************************/
static void ShowYMCMenu_func(void)
{
Dw_Pic_Window_YMCMenu();
Dw_Pic_Whole_YMCMenu();
SetYMCViewElement(0);
}
/***********************************************************************
* 函數名稱 : YMCMenu_func
* 描述 : 界面
* 輸入形參 :
* 返回值 :
************************************************************************/
void YMCMenu_func(void)
{
_ViewCtrl YMCCtrl = { 0 };
YMCCtrl.DrawViewData = ShowYMCMenu_DataInfo;
YMCCtrl.DrawViewFrame = ShowYMCMenu_func;
YMCCtrl.DrawViewChange = ShowYMCMenu_DataChange;
YMCCtrl.MenuBtnCtrl = YMCMenu_Btn;
YMCCtrl.MenuExit = YMCMenu_Exit;
YMCCtrl_Set(&YMCCtrl);
YMCMenu_Init();
}
外部引用:void YMCMenu_func(void);
執行菜單跳轉:
MainJumper = YMCMenu_func;調用之後
1、進入YMCMenu_func主體函數執行,
2、執行一次初始化YMCMenu_Init,
3、執行一次窗體全部繪制ShowYMCMenu_func
4、循環執行當元素需要刷新時執行ShowYMCMenu_DataInfo里菜單顯示元素刷新
5、當有按鍵按下時識別按鍵後執行YMCMenu_Btn,執行按鍵功能
6、當菜單數據變化時執行ShowYMCMenu_DataChange,自動執行變更數據
7、最後當執行MainJumper = YMCMenu2_func;時退出當前菜單執行YMCMenu_Exit
8、再執行進入YMCMenu2_func主體函數執行,重復上訴步驟。
從而完成菜單的初始化、顯示,交互,菜單變化處理,退出。
下面是空函數控制,當執行空菜單時相當於執行空的菜單,沒有任何菜單顯示和控制。
/***********************************************************************
* 函數名稱 : VOID_Func
* 描述 : 空菜單控制
* 輸入形參 :
* 返回值 :
************************************************************************/
void VOID_Func(void)
{
_ViewCtrl YMCCtrl = { 0 };
YMCCtrl_Set(&YMCCtrl);
}
總結:YMC特點菜單不會遞歸調用,運行時載入(不使用菜單時不會佔用系統資源)
框架是總結整合的東西,類似一個籃筐將獨立運行在系統的一個地方,成為一個獨立小系統,每次使用是使用一個整體,而不是一個小部分功能。
㈡ 編程中封裝是什麼意思
封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的介面訪問其他對象。(采自java面試題)
㈢ 編程語言中的,封裝,繼承,多態 怎麼解釋
網上能找到的都是說的嚴謹的,如果沒理解真沒辦法一兩句說清楚,封裝提高了代碼可重用性可維擴性,寫方法、類都是封裝;繼承是然將兩個或兩個以為有共性的成員拿出來寫成基類,其根本目的還是提高可重用性,並且也更符日常生活中的面向對象思想。多態是不同對象實例對同一個消息作出不同響應的能力。但這些不同對象實例必須有共性約束,或是父子類的方法繼承,或是對同一介面的消息實現,比如:員工類有以下子類:項目經理、前台、程序員,都有一個共同成員方法」開工「,當執行該指令時,不同實例所執行的任務是不一樣的
㈣ 請問: 在編程中, 對函數進行封裝的目的和好處是什麼
封裝的目的是便於之後的調用,整體性比較好,同時打包成dll文件後,對自己的源碼也是一種保護。
㈤ 3。試敘述面向對象編程封裝的好處
封裝的意思是說對象數據和操作該數據的指令都是對象自身的一部分,封裝能夠實現盡可能對外部世界隱藏數據。譬如,當你在某個模塊中定義某個變數、常量、函數前聲明了關鍵字Private,你就將它封裝了起來,降低了它被外界污染的可能。
將抽象得到的數據成員和代碼成員相結合,形成一個有機的整體,也就是將數據與操作數據的行為進行有機 的結合,這就是封裝。在面向對象的程序設 計中,通過封裝,將一部分成員作
為與外部通訊的介面,將其他 的成員隱藏起來,這樣可以使程序中的不同部分的相互依賴減少到最小。
/封裝 目的與實現類就是對現實實體或者虛擬對象的抽象表示,抽象就是有
選擇 的忽略,而封裝就是忽略的具體實現手段。
類就是通過「封裝」特性把實現的細節進行隱藏,呈現給用戶一個清晰易用的接。
一個類其實有點像一個黑 匣子!
㈥ 在Java面向對象的編程當中的為什麼要封裝什麼叫封裝
概念:所謂封裝,就是通過定義類並且給類的屬性和方法加上訪問控制來抽象事物的本質特性.
這個意思:
封裝就是定義一個類,然後給該類的 屬性(成員變數) 和 方法 加上 訪問控制修飾詞(public,private,
protected,默認包訪問許可權),使得該類的屬性和方法對於類外部來說,想可見的可見,不想可見的隱藏。
所以,通過封裝這個手段,就抽象出來了事物的本質特性。
對上面進行進一步的解釋:
什麼叫抽象?比如拿 人類 來舉例子,封裝是一種手段,通過封裝定義出來的這個類,和現實當中的人這個實體(對象),他們之間就是一種抽象,我們現實當中只存在一個一個的人(對象),人類只是一個概念性的東西,是我們人自己歸納總結出來的,我們知道人都長什麼樣,所以我們知道符合這個樣子的就叫人,人的大腦總是習慣將事物分類,因此人類的概念就出現了,那麼我們發現一個一個的人,都有眼睛鼻子嘴(屬性),都能吃飯(方法),等等,這就是人這個事物的本質特性,然後我們得編程啊,人類的概念光在腦海中出現了還不行,還得體現到代碼上,那麼你想體現到代碼上,也就是定義一個類,就要使用封裝這個手段。
為什麼要加上訪問控制?
一是,有些東西是很關鍵很機密的,不想隨便被使用,被改變,被訪問。
二是,可能這個東西不是很關鍵機密,訪問和改變也無所謂,但是,因為有些屬性和方法,它們對於外部來說,是無關的沒用的,但是對於我自己這個類來說,是必要的,因為可能在我自己這個類中要使用它們,這個時候,進行隱藏,不讓外部看,好處就是,如果將這些不必要的內容也暴露給外部的話,那麼在使用的時候,使用者會被迷惑,因為這個東西對他沒用,但是又可以調用,訪問,而且他又不知道又沒有用,但是如果進行隱藏,不給外部查看,那麼就很清晰了,因為這樣一來,只要是對外暴露的屬性方法,都是有用的,你想一下,JDK的類庫裡面的那些類,比如String類,對外暴露的屬性和方法,哪個是無用的?這也是一種良好的編程習慣和規范。
說了這么多,其實我的理解也有限,面向對象思想又不局限於某種語言,樓主仔細體會一下吧,我說的可能也不全對,這只是我個人的一點理解。
剛才上網搜到了一句話,不是我說的,但我感覺說的也不錯,可以仔細體會一下:
封裝是人們對現實世界中解決問題時,為了進行簡化問題,對研究的對象所採用的一種方法,一種信息屏蔽技術。
㈦ 在Java面向對象的編程當中的為什麼要封裝什麼叫封裝
java面向對象編程中所謂封裝,就是通過定義類並且給類的屬性和方法加上訪問控制來抽象事物的本質特性。
封裝就是定義一個類,然後給該類的屬性(成員變數)和方法加上訪問控制修飾詞(public,private, protected,默認包訪問許可權),使得該類的屬性和方法對於類外部來說,想可見的可見,不想可見的隱藏。就是把數據和行為結合在一起在一個包中,並對對象使用者隱藏數據的實現過程。Java用3個關鍵字來設置邊界,從而進行對數據的隱藏。Public(共有)的定義任何人都可使用.private(私有)意味著除你自己,類型創建者及那個類型的內部函數成員可以訪問外其他任何人使用都會產生錯誤。Friendly(友好)
意味在包(package)中是可以訪問的.
㈧ 封裝在所有的編程語言里都有用到嗎
封裝是面向備畢對象的特性,面向對象大滾鋒語言(c++.c#.Java等)都用的到滾晌,面向過程的語言(例如c語言)沒見過