模块化程序设计案例DCIM-3

描述

说到模型、模式等概念,我们大概知道什么意思。虽然说不出具体定义,但日常生活或成长过程中肯定接触过。比如,我们从小学开始接触的纸质的考勤表(矩阵,也算是人工智能的根),表格中打勾代表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;
  };
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分