自学习软件以来,先后使用c ,vfp6.0 ,vb 6.0 ,java ,c# 开发软件做项目,现在的项目又回到学习的第一门语言c上来,现在的项目用嵌入式非标准c语言做开发,由于项目较大,需要实现例如线程,网络,日历,各种主流存储卡的操作等方面,所以写出高效简洁易理解的程序成为开发组成员的长期原则。
    今天做一个显示菜单,因为不象高级语言一样,有直接的控件可以用,很快搞定,必须自己写结构并实现,显示在外接大屏幕上。因为上一个项目是用c#开发的,所以在做这个设计的时候可能就不自觉的用了一些思想,等到写完了主要的几个文件[menu.h ,menu.c]后发现我的着几个文件简直可以稍加变动移植成为c#,并且即便在c#里还不算很烂的设计,进一步看,然后给同事调用,调试修改错误等,证明了模块的独立性非常好,因此在此做一比较分析。
 menu.h文件如下:(menu.c省略,为个函数实现)

#ifndef    __MENU_h__
#define    __MENU_h__
//    write your header here
typedef struct menuitem{
    //此处省略
}
MENUITEM;

    //此处也可用enum
#define CHS 0
#define ENG 1
#define CHM 2

extern const MENUITEM chs_menu_top ;
extern const MENUITEM chs_menu_managment ;
extern const MENUITEM chs_menu_setting ;
extern const MENUITEM chs_menu_lan ;
extern const MENUITEM chs_menu_comm ;
extern const MENUITEM chs_menu_setMAC ;
extern const MENUITEM chs_menu_setID ;
extern const MENUITEM chs_menu_setIP ;
extern const MENUITEM chs_menu_setENG  ;
extern const MENUITEM chs_menu_setCHM;
extern const MENUITEM chs_menu_setCHS;

extern const MENUITEM eng_menu_top ;
extern const MENUITEM eng_menu_managment ;
extern const MENUITEM eng_menu_setting ;
extern const MENUITEM eng_menu_lan ;
extern const MENUITEM eng_menu_comm ;
extern const MENUITEM eng_menu_setMAC ;
extern const MENUITEM eng_menu_setID ;
extern const MENUITEM eng_menu_setIP ;
extern const MENUITEM eng_menu_setENG  ;
extern const MENUITEM eng_menu_setCHM;
extern const MENUITEM eng_menu_setCHS;


extern const MENUITEM * menu_cur_item ;

extern const MENUITEM * menu_cur_head ;

void menu_initial(void);
void menu_disp_item(unsigned int x,unsigned int y,    const unsigned char * text,unsigned char mode);
void showMainMenu();
void menu_enter();
void menu_move_up();
void menu_move_down();
void menu_move_back();
void menu_show_current();

char processMenuCommand();
//char setMenuLanguge(unsigned char lan);
#endif

对应可转换为c#的一个接口(IMenu.cs)和实现类(Menu.cs)
 struct menuitem{
//省略定义
    }
MENUITEM;
enum Lan
{ CHS =0, ENG =1,CHM = 2
}


interface menu
{
const MENUITEM chs_menu_top ;
const MENUITEM chs_menu_managment ;
const MENUITEM chs_menu_setting ;
const MENUITEM chs_menu_lan ;
 
const MENUITEM chs_menu_comm ;
 
const MENUITEM chs_menu_setMAC ;
const MENUITEM chs_menu_setID ;
 
const MENUITEM chs_menu_setIP ;
 
const MENUITEM chs_menu_setENG  ;
 
const MENUITEM chs_menu_setCHM;
 
const MENUITEM chs_menu_setCHS;

 
const MENUITEM eng_menu_top ;
 
const MENUITEM eng_menu_managment ;
 
const MENUITEM eng_menu_setting ;
 
const MENUITEM eng_menu_lan ;
 
const MENUITEM eng_menu_comm ;
 
const MENUITEM eng_menu_setMAC ;
 
const MENUITEM eng_menu_setID ;
 
const MENUITEM eng_menu_setIP ;
 
const MENUITEM eng_menu_setENG  ;
 
const MENUITEM eng_menu_setCHM;
 
const MENUITEM eng_menu_setCHS;


 public
const MENUITEM  menu_cur_item ;

 public
const MENUITEM  menu_cur_head ;

void menu_initial(void);
void menu_disp_item(unsigned int x,unsigned int y,    const unsigned char  text[],unsigned char mode);
void showMainMenu();
void menu_enter();
void menu_move_up();
void menu_move_down();
void menu_move_back();
void menu_show_current();

char processMenuCommand();

}

在menu.c中的代码中将指针改为对应对象(在c中是为了节约资源),就很快成为class Menu了。

    在计算机语言中,面向对象的类一般具有三个基本特性:封装性、继承性和
多态性。

现在来看一下是如何借鉴OO思想的 (显示封装性提高程序模块化和阅读性):
 1。 分为.h和.c来写(也许你回说在c中本来就一直这么做的,但很多人在.h中的定义并不好),和OO中的接口的概念相似,定义和实现分开,并且对外提供接口,提高可维护性。

2。详细的看.h的定义。
     menu.h可以看做一个c#文件,包含几个类的定义
     第一段,enum定义保证在引用是不使用绝对数,用有意义的字符出现在程序中增加可读性。stuct结构可以是看作一个类。
    struct结构的定义和作用就和c#中完全一样了。
    在看对应class Menu的定义,最开始可以认为是属性申明(public和protect类型的),中间是是属性的操作(在java中对应get_*和set_*操作,c#中则可以用get / set 方法进一步封装)当然在c中也可以来通过函数来访问,但因为在c中他们不论怎么定义都必须是全局变量,所以空间必须被占用的,而增加一个函数来访问就降低了效率,也占用了代码空间和cpu资源。最后的部分是类的操作。

    如果要修改系统主菜单,显然只修改menu.c中的具体text显示就可以了,操作方式或流程,输出对象改变了,也可以只修改menu.c 文件,而调用和接口保持不变。

    按照模块化的思想,这个程序达到了较高的模块独立性,内部menu.c的函数实现和外部调用也可以达到比较满意的聚合和低耦合。
    作为软件发展的较高阶段的OO思想,指导其产生的土壤,也可以提高我们不得不用c语言和其他较低级和非面向对象语言编程的场合,提高大型项目的软件编写效率和质量。