最近看到网上有不少用C语言开发的GUI项目,关注收藏的人还比较多。但我想说C语言不适合开发GUI应用程序,强行使用多半是在造垃圾。我要说明一个观点:GUI开发必须使用面向对象编程语言。
GUI开发一个很重要的内容是对各个概念建立模型。比如说按钮、输入框、窗口、多选框、滚动条等等控件,你要知道它长什么样子、有哪些特点、有什么功能。有了模型之后,就可以根据它创建实例,生成各种各样的控件。在面向对象思想中,这叫做“类和对象”。对象是类的实例,类是对象的模板。对象是对客观事物的抽象,类是对对象的抽象。
如果用C语言编写GUI程序,代码可读性极差。指针结构体满天飞,手动调用构造函数、析构函数、拷贝函数来实现面向对象的特点,函数名特别长,不看文档不知道它是干什么的。手动调用容易忘记,函数名太长记不下来,也容易忘记。
控件的设计是复杂的,好在面向对象里有“封装”的概念。它隐藏了控件内部复杂的业务逻辑,对外提供简单友好的接口。使用者无需知道实现细节,只需要知道类中公开的成员变量、成员函数就可以使用它了。类的声明定义和它的实现分离,类的数据和它的功能结合,是高类聚、低耦合的优秀设计。就算没有文档,开发者看一看类的声明定义就大概可以知道它的功能。
如果用C语言操作控件,内部结构随意修改,大大降低了安全性。编程的时候代码智能补全也不好用,开发效率非常低。字符串的操作甚至停留在char*级别,处理中文还要解析编码类型,一点也不方便。
模型之间的关系非常复杂。有的模型高度相似,普通按钮、单选按钮、多选按钮都是点击后触发效果的控件;文本输入框、数字输入框、日期输入框都是输入类的控件;滚动条有水平的、垂直的两种类型。如果给每一个模型单独写一套代码,费时费力不说,还不容易维护。为了提高代码的复用程度,可以使用面向对象思想里“继承、派生、父子”这些概念。
如果用C语言编写GUI框架,代码特别长。因为不同控件的微小差异就要写几套差不多的代码。在原有控件的基础上开发自定义控件也不方便,破坏了代码的封装性,一不小心就出错了。
有些功能高度相关,可以复用相同的接口。比如要向字符串末尾添加字符、字符串、字节数组。这三种功能可以使用相同的函数名。设置控件内文本这个功能,成员函数名都是setText。“函数重载、多态性”在这里体现得非常明显,进一步提高了代码复用程度。
如果用C语言写这些功能,不同的功能要对应不同的函数。随着功能越来越多,函数名就会越来越长。对象之间往往存在一对一、一对多、多对一的复杂关系,连C++都不好处理,C语言怎么好做?