Chinaunix首页 | 论坛 | 博客
  • 博客访问: 836368
  • 博文数量: 61
  • 博客积分: 2315
  • 博客等级: 大尉
  • 技术积分: 2560
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-22 18:00
文章分类

全部博文(61)

文章存档

2015年(3)

2014年(3)

2013年(9)

2012年(23)

2011年(23)

分类: C/C++

2012-01-12 16:38:29

最近网友问到这一问题,但我更希望被问的是“C程序员需要学面向对象编程吗?”,那就让我先从回答这一问题开始,并做适当的扩展。

就我的成长经历来看,C程序员必须学习面向对象编程!面向对象编程语言有其天然的一个优势 — 将软件世界的一切象现实世界那样视为对象。我在《专业嵌入式软件开发》一书的《设计,质量之本》一章中指出,软件设计的一个原则是“以人为本”,在软件世界中构建现实世界就能很好地贯彻这一原则,而对象在编程语言中的引入提供了设计便利性。对象的引入使得编程语言具有更具结构化的表达能力,这有助于提高程序的可维护性。

从C程序员的角度来看,通过使用对象能让程序更具模块性,而模块化是我们所倡导的很重要的软件开发方法之一。一旦掌握面象对象编程,C程序员的设计能力通常会有较大幅度的提升。这种提升使得即便是用C语言编程也能写出更具模块化的代码。这是我主张C程序员一定要学习面向对象编程的根本原因。

然而,尽管面向对象编程这种方法有其优势,但学习起来并不那么的容易,尤其对于从C语言过渡到C++的程序员。学习的第一个难点在于,面象对象编程与面向过程编程(指C语言)具有完全不同的思维方式。其差异性类似于对于使用拼音输入法的人来说第一反应是为字拼音,而使用五笔输入法的第一反应却是将字拆成字根。象练习五笔输入法那样,学习面向对象编程需要一定的时间通过模仿和实践去掌握面向对象的思维方法。在没有掌握面向对象编程方法之前,我们会认为它比面象对象编程复杂,且觉得很绕。然而,一旦掌握,你会发现它又是那样的自然。

学习的第二个难点,在于C++语言本身上。C++编程语言应是最复杂的系统编程语言,这可从《Effective C++》、《More Effective C++》、《Exceptional C++》和《More Exceptional C++》等书加起来有近200个编程规则可以看出。语言的复杂性增加了掌握它的难度。如果不使用像pc-lint这样的静态分析工具,我们很难写出专业的C++程序。

除了C++语言本身的复杂性,C程序员在转向C++时,由于C++对C语言语法的兼容,使得我们容易犯使用C++编写面向过程程序的错误。这在某种程度上不利于我们更快地掌握面向对象编程。

优雅的编程语言有助于收敛我们的编程行为,从而写出更好的程序。但真正决定程序可读性的,是程序员的逻辑思维是否清晰和表达是否精确。再好的编程语言,逻辑混乱和表达不精确的程序员一定会将程序写成“狗皮膏药”。从这一点来看,尽管C++倍受争议,但还是值得C程序员去掌握。另外,在一个C项目上我们可以无缝地使用C++,相信这是C程序员选择C++很重要的原因。

本文出自“李云”博客,请务必保留此出处  http://blog.chinaunix.net/space.php?uid=26470037&do=blog&id=3057731 。
阅读(14691) | 评论(31) | 转发(7) |
给主人留下些什么吧!~~

杭州李云2012-01-18 21:52:12

fxbird: 工作中用java的人有没有必要学习c,c++?谢谢.....
没有必要。除非你想从事C/C++方面的开发工作。

fxbird2012-01-18 17:33:38

工作中用java的人有没有必要学习c,c++?谢谢

杭州李云2012-01-17 12:41:01

lixiaoming1813: 谢谢!就嵌入式系统,你问我做过什么,老实说,我没有写过完整的嵌入式操作系统和硬盘的驱动,其他的我都做过。到现在为止我只碰到过一个操作系统内核是由C++写.....
认同你所说的“至于效率C++要做到与C相近,在编写代码过程中要时刻注意用很多所谓的技巧才能达到”,但技巧并不晦涩难懂,只是掌握语言要精准。

也认同你说的“至于能否显著提高嵌入式软件的结构,这个要看实现者的个人水平了”。其实不只是C++是这样,用C写也是这样,所有的编程语言都这样。

还是有一点要强调,不是说用C++就是一切都要用C++,该用C的内容还得用C,C++所支持的OO是我们在需要的时候在用。这同样与个人的能力有关,要知道什么时候用什么去达到目的。

lixiaoming18132012-01-17 11:51:38

谢谢!就嵌入式系统,你问我做过什么,老实说,我没有写过完整的嵌入式操作系统和硬盘的驱动,其他的我都做过。到现在为止我只碰到过一个操作系统内核是由C++写的,那就是ecos(至于你提到的RTEMS我没有听说过,算我见识面窄),这个系统先由汇编过渡到C(这是个基本的过程),然后再在C程序中为运行C++程序准备相关环境,当然这一部分可在汇编阶段中完成,但考虑到尽量多的可移植性,就用C来写。由此可以看出C++未必完全兼容C,况且实质上C++不是完全兼容C的,如果你精通这两种语言你就知道了。其他的主流操作系统内核都是用C编写的,包括windows系统。
至于效率C++要做到与C相近,在编写代码过程中要时刻注意用很多所谓的技巧才能达到,这些技巧晦涩难懂,这个分析一下STL的实现就知道了,这个让初学者很容易陷入技巧的分析实现及显摆中,而忘记真正的设计。而用C来实现面向对象的思想的技巧反而容易得多,而且有很高的效率。
至于能否显著提高嵌入式软件的结构,这个要看实现者的个人水平了,所以这点我不敢苟同。

杭州李云2012-01-17 10:17:56

lixiaoming1813: 别误会的意思,我说的是C程序员不一定要学C++,C的简便灵活可以轻松实现C++所具有的思想,面向对象的思想不是C++的专利,就面向对象的思想,相对来说,JAVA语言.....
理解。其实本文最开始的创作思路也是源于网友的提问,既然他问了学C++所以就写了C++。我认同学习面向对象编程不一定要用C++,这也是为什么我一开文就说我情愿他问的是“C程序员要不要学面向对象编程”的原因。当然,学习的目的不是为了去欣赏语言,除非我们是在设计自己的编程语言,而是为了在工作中用它。造成这种目的性的原因,一方面源于职场的需要,另一方面也是个人的意愿。不可否认,如果是一名C程序员,很自然地认为学C++是首选,因为C++完全兼容C。

对于你所说C如何好的观点我并不完全认同。其实C本身也存在不少陷阱与缺陷,它的成功有历史原因,乃至现在没有其它语言能撼动它的地位。不论是什么语言,不用去揪着它的弱点,而应发挥它的长处。如果用榔头去切菜,那不是榔头