說到模型、模式等概念,我們大概知道什么意思。雖然說不出具體定義,但日常生活或成長過程中肯定接觸過。比如,我們從小學開始接觸的紙質的考勤表(矩陣,也算是人工智能的根),表格中打勾代表1,空格代表0...。也就是我們幾乎都具備了設計模型的能力,但怎么能讓現實問題或需求分解成多個模型并將他們用代碼標識出來,最終讓計算機能夠進行處理或計算這個過程離不開編程思想及編寫程序(函數)。本文以數據中心基礎設施管理系統DCIM(Data Center Infrastructure management)為例,簡要討論模塊化編程案例。
1、DCIM系統需求及架構設想
在設計較復雜的程序時,一般采用自頂向下的方法,將問題劃分為幾個部分,各個部分再進行細化,直到分解為較好解決問題為止。利用函數,不僅可以實現程序的模塊化,使得程序設計更加簡單和直觀,而且還可以把程序中經常用到的一些計算或操作編寫成通用函數,以供隨時調用。
DCIM(數據中心基礎設施管理系統)接入數據中心電力運行、配電監控系統、環境監控系統和安裝的設備等數據,提供電力容量管理、溫濕度監控管理、UPS電池監控管理、動環告警管理、設備管理、數字運維、能耗分析、智能化巡檢、智能運營等業務功能。使整個數據中心的管理更加智能化,提升整體運維效率及運營水平。
DCIM(數據中心基礎設施管理系統)應采用可靠穩定的操作系統及編程語言(例如本例企圖底層用C語言構建一樣),以保證系統的通用性和安全性。DCIM應采用分層模塊化設計架構,對整個數據中心進行集中管理,并具有良好的擴容性,可在滿足現有需求的同時,可根據后繼不斷擴容的需求,快速靈活地接入新設備、新系統。其架構示意圖1如下所示:
圖1 DCIM模塊化架構圖
2、將模塊化架構改為功能(函數)
根據需求構建了圖1所示的架構之后,接下來我們通過編程思想嘗試用函數來描述(編程)圖1的各模塊。我們首先用主程序、子程序、子過程等框架把軟件的主要結構和流程描述出來,并定義和調試好各個框架之間的輸入、輸出鏈接關系。模塊化的目的是為了降低程序復雜度,使程序設計、調試和維護等操作簡單化,將上面模塊改為函數后的示意圖如下圖2所示:
圖2 DCIM的函數示意圖
3、用C語言“實現”各功能(函數)
用C語言開發軟件系統時,為了方便用戶大都采用菜單(menu)方式。軟件運行時,首先在屏幕上顯示出各種功能,用戶只要按一些簡單的鍵,便可以進入相應的功能,就像在飯店點菜一樣。圖3為上述DCIM模擬程序運行后菜單的示意。
圖3 DCIM模擬程序主菜單
它共有6個功能,用戶只要按一個數字(如“6”),便可進入下一層相應的功能——南向接口。該層又是一個菜單,用戶繼續選擇。
圖4 DCIM模擬程序子菜單
上圖3和4所對應的部分代碼截圖如下,完整代碼詳見本文附件1:
圖5 DCIM菜單部分代碼
通常程序實現時,主菜單由主函數提供,下面的各級子菜單由各級子函數提供。最末一級的菜單,才提供一些具體的功能。菜單程序是一種常見的程序。它主要由兩部分內容構成:
(1)顯示菜單——由一些顯示操作提供。
(2)根據用戶的選擇轉向相應的函數——由選擇結構實現。
從這個過程可以看出,編程過程中理解需求并將其改變為合理的結構(或架構)看起來不需要懂代碼而更需要理解業務本身,也是非常關鍵的環(當然編寫程序也很重要)。現實生活中,雖然我們不寫程序,但不知不覺中采用編程思維,比如將一個復雜項目分解多個子項目并制定里程碑事件(整體計劃),之后按階段計劃逐步進入子項目的實施推進。以上菜單的具體實現代碼詳見本文附件1所示的dcim.h頭文件和main.c源文件,具體代碼函的意思不再贅述,感興趣者可以自行測試。在我看來,看此段代碼好比到施工現場看施工過程一樣,只是在這個現場中一個碼農剛剛開始了“搬磚”任務。
4、結束語
也許以上程序給我們產生回到“文本時代”的感覺。雖然這樣文本菜單看起來很過時(或很low),但計算機專業人員反而更喜歡這樣簡單直接或直白的方式跟計算機進行“交流”,不喜歡中間接入“中介”--圖形化界面。大多數非專業用戶喜歡圖形化界面,也是日常生活中計算機常用的形式。
實際上現在DCIM已經跨越了面向過程和面向對象的編程思想,開始應用面向模式的編程思想(即,我們的注意力轉向教授智能機器而不是直接編程,現在討論這些為時過早)。圖像化界面程序開發多數采用面向對象的編程思想,接下來的文章中進一步討論。
附件1:DCIM模擬系統完整代碼
//main.c 源文件
#include
#include
#include
#include "dcim.h"
char printMainMenu();
char printSubMain();
int main() {
int menuID;
//init(); //初始化函數,相當于建筑工程中的準備材料并運到現場
while (1) {
menuID = printMainMenu();
switch (menuID) {
case '1': resourMgmt(); break;
case '2': performanceMgmt(); break;
case '3': troubleMgmt(); break;
case '4': CustomerMgmt(); break;
case '5': pueMgmt(); break;
case '6':
while (1) {
menuID = printSubMain();
switch (menuID) {
case '1': DEMSapi(); break;
case '2': BAapi(); break;
case '3': PUEapi(); break;
case '4': DNCCapi(); break;
case '5': Pwoer(); break;
}
if (menuID == '0') break;
}
break;
case '0': exit(EXIT_SUCCESS);
}
}
//fclose(fp); --關閉初始化init()函數中打開的文件
return 0;
}
//打印主菜單
char printMainMenu() {
char menuID;
system("cls");
printf("***********數據中心基礎設施管理系統(DCIM )**********************\\n");
printf("* *\\n");
printf("* ------------------------------------------ *\\n");
printf("* | Data Center Infrastructure management | *\\n");
printf("* ------------------------------------------ *\\n");
printf("* *\\n");
printf("* 1)資源管理 *\\n");
printf("* 2)性能管理 *\\n");
printf("* 3)故障管理 *\\n");
printf("* 4)客戶管理 *\\n");
printf("* 5)能效管理 *\\n");
printf("* 6)南向接口 *\\n");
printf("* 0)退出軟件 *\\n");
printf("* *\\n");
printf("* ----------------------------------------- *\\n");
printf("* 請在上述功能中選擇(1——6) *\\n");
printf("* *\\n");
printf("******************************************************************\\n");
fflush(stdin);
menuID = getch();
return menuID;
}
//打印子菜單
char printSubMain() {
char menuID;
system("cls");
printf("*****************南向接口信息*************************************\\n");
printf("* *\\n");
printf("* 1)動力環監控系統 *\\n");
printf("* 2)BA樓宇智能化系統 *\\n");
printf("* 3)能耗系統 *\\n");
printf("* 4)冷機群控系統 *\\n");
printf("* 5)電力系統 *\\n");
printf("* 0)返回主菜單 *\\n");
printf("* *\\n");
printf("******************************************************************\\n");
fflush(stdin);
menuID = getch();
return menuID;
}
//dcim.h 頭文件需要獨立放到另一個文件
int resourMgmt() {
};
int performanceMgmt() {
return 0;
};
int troubleMgmt() {
return 0;
};
int CustomerMgmt() {
return 0;
};
int pueMgmt() {
return 0;
};
int DEMSapi() {
return 0;
};
int BAapi() {
return 0;
};
int PUEapi() {
return 0;
};
int DNCCapi() {
return 0;
};
int Pwoer() {
return 0;
};
-
操作
+關注
關注
0文章
43瀏覽量
19048 -
程序
+關注
關注
117文章
3824瀏覽量
82426 -
函數
+關注
關注
3文章
4371瀏覽量
64207
發布評論請先 登錄
VerilogHDL模塊化程序設計
《通過uart協議理解何為接口設計何為模塊化設計(封裝)》含程序和視頻
C語言模塊化程序設計理解
C語言模塊化程序設計需理解哪些呢
c++程序設計_基于proteus的51單片機開發實例30-模塊化程序設計

評論