面试题之谈一谈你所知道的C++的框架
梧桐树同学提出了一条面试题,试着回答了一些。不过感觉用来做面试答案还是有些不太好,同时行文匆匆,可能有些描述不准确或者错误的地方,大家指正。
题目如下:
记得阿里巴巴的题目有一道是:
(C++)谈一谈你所知道的C++的框架....
这个问题问得我突然不知道框架是什么了,感觉C++里面很少提框架这个名词啊。
【我的回答部分】
梧桐树你好,这个问题的确是问得很大啊。我尽量回答看看。
框架,在英文中叫做Framework。应用程序框架就叫做Application Framework。现在是framework满天飞的时候,你没有听过框架,但是你肯定听过.net framework这个词。否则微软的广告就做的太水了。当然,.net framework是为了.net,其实主要是C#来做的,很多同学说,C++也可以啊,用CLR的C++就可以,不过带CLR的C++还是C++吗,而且既然用了CLR,为什么就不干脆来用C#呢?不过这个只是顺便一说,因为我也没有研究过CLR,也没有用过CLR下的C++,没有研究,没有发言权。还是来谈谈C++下面的framework。
首先,要清楚的是没有framework,我们能不能做开发,做应用。想想是可以的哦。在没有framework的时候,我们直接调用函数,完成功能。just simple。
然后没有framework和有framework,到底有什么区别。最大的区别就是,没有framework的时候,是我们call函数,而有framework的时候,是framework来call我们。
比较老牌的C++的framework,应该就是MFC了,MFC的全称为Microsoft Foundation Class,也就是微软基础类库,那不还是类库吗?好像没有提到framework啊。不过你细看里面函数的话,可以看到很多函数的前缀为Afx,Af也就是Application Framework了。
那C++的STL,全称为Standard Template Library,也就是标准模板库,它是不是框架呢?我们看看它提供了些什么,它提供了字符串类,输入输出流,各种数据结构,以及算法。这些都是在我们的程序中,被我们调用来完成功能的,从我的观点,它不能算是框架,而只是一套类库。
那MFC呢,为什么它算是框架呢?首先提起MFC,想到的是什么。应该是界面吧。MFC提供了包括static,editbox,button,radio,list,tree等等控件,但是单单就是界面吗?当我们点击按钮时,它会执行动作。这里面原来还绑定了函数。同时我们在对应的函数中写下比如一个MessageBox,那到时候就会执行,显示出这个消息框。这一切都是MFC在里面做,我们所需要做的,就是拖一个按钮过来,加上对应的Buttonclick事件,然后在对应的函数中加上对应的实现就可以了。
原来framework就是,在我们写我们的软件之前,就将整个的执行流程给我们规定好了,我们在规定的点填空,然后就可以完成应用了。比如我在2009年写一个软件,但是MFC是在2000年(其实不是哈,举例而已)就完成了。它怎么知道我要完成什么,然后再来调用我写的这些函数,最终完成功能。
其实现在一般来实现框架,都是使用了面向对象技术,也就是我们常常听到,听得耳朵都生茧了,其实还没有太明白的运行时绑定,也就是面向对象中封装,继承,多态中的多态行为。但是MFC那时,由于性能的原因,用虚函数比较少,主要用宏(在侯捷老师的书中叫做巨集,其实是一个东西)来完成,不过还是很多地方使用的虚函数。这个看深入浅出MFC来了解具体的原理吧。
作为framework,只需要定义一个superclass,然后你需要实现的时候,继承这个superclass,无论是类,抽象类还是接口,然后实现它,这样framework不需要知道你,它只需要知道superclass就可以运行了。而且是它来调用你。
其实这两天想了一下,除了面向对象之外,我们C系统中用回调函数,其实也就是函数指针,不也是用来实现让其他人来调用,自己来实现被调用的部分吗?哦,其实也就是现在常常提到的控制反转(还是依赖反转)?不过C和C++的世界中,这些名词提得比较少,一下子没有联系起来。
不过MFC完成的东西很多,windows消息的封装,消息映射和消息路由是一部分,同时它也提供了CString等类给我们来使用,还提供了Document-View,还提供了序列化等等东西。
另外有名的C++框架,好像有个重量级的网络开发框架叫ACE的,但是没有了解过,仅仅是知道有这么一个东西。
linux算不算框架,从现在linux的驱动开发,使用模块来进行开发的角度,似乎也可以认为这一套算是一个框架,只要注册了模块,那它就知道,也可以来调用。
另外,有插件机制的软件,算不算框架?
我知道的有插件机制的软件,比较古老的有Winamp,现在的有firefox,以及thunderbird这些Mozilla出的系列软件,eclipse等,这些中eclipse肯定算是框架了,其他呢?
另外C++中,Qt,wXwidget等等,尽管没有用过,但是应该也算是框架,而且是跨平台的。
写了一些东西,但是比较的乱,而且可能有些意思也没有表达清楚,有空我还可以再整理整理,问题很大,对于框架,还有很多要去学的。模式都没有学好,也没法去把框架谈好。
同时,上面这段,用来做面试的答案还是比较勉强,而且作为一个比较大的题目,真正展开来讨论,几个小时也不会结束,可以考虑考虑如何将这些知识比较好的表达出来。同时和面试官做好互动。难道是面试旺旺?阿里似乎网站开发比较多,C++用得不多吧。不太清楚