Chinaunix首页 | 论坛 | 博客
  • 博客访问: 880037
  • 博文数量: 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 。
阅读(15290) | 评论(31) | 转发(7) |
给主人留下些什么吧!~~

杭州李云2012-01-23 09:43:30

captivated: 对C++的一些技术和认识可以让程序员对C语言本身的认识更深入。对于OO封装的理解也有助于对C模块封装的理解 -- 比如,一个类就是一个完整的封装,如果C语言的某个.....
就我的经验,使用C++如果不结合使用pc-lint这样的静态分析工具(它支持Effective C++的规则检查),真的很难写出象样的程序。

在Linux上,掌握bintuils有助于更深入的理解C。

杭州李云2012-01-23 09:39:13

fireaxe: 真高兴两位又回到了技术讨论的路上了。
C程序员学C++不是必须的,甚至oo也不是必须的。但为什么这么多人都学了呢,我还见过做硬件的学习编程的。原因都一样提升.....
我认同学习OO也好、C++也好,其目的是为了提升能力。当然,最终的目的是为了有不错的就业机会,并过上更好的生活。

请站在一个新人的角度去理解“C程序员”。本文的标题也是一个新人所提的问。如果要改名,你觉得什么样的名称更适合?

Heartwork2012-01-22 00:42:23

楼主的oo引发了很多讨论哈,我再凑一下热闹。

做设计其实就是搭积木,你手中的积木决定了设计的质量。

从这个角度讲,学习一种高级语言对于使用低级语言(比如C/ASM)是很有好处的。因为高级语言提供了丰富的语言特性、函数库、中间件来完成许多general的功能(积木)。

更重要的一点是,即使你有一天用到了不具备这些积木的低级语言,它至少会告诉你哪些high level的概念在实现上是具有可行性的,显然,设计中使用这些概念可以降低项目的风险。

它们可以认为是软件工程理论中的最佳实践。

这么说来,学习任何一门高级语言多多少少都会提高自己的设计水平,只不过楼主从实用主义角度选择了C++(也就是老板选的

captivated2012-01-21 21:13:39

对C++的一些技术和认识可以让程序员对C语言本身的认识更深入。对于OO封装的理解也有助于对C模块封装的理解 -- 比如,一个类就是一个完整的封装,如果C语言的某个.c文件的实现主要围绕某个数据结构打转,实际上完全可以把这个.c文件理解成一个C++类。

不管怎么说OO,对OO和设计模式有一定了解还是比较好的。

只不过如果太过专注C++那些奇淫技巧就不好了。真的学不完。我觉得够用就好, -- 够用的意思是大约五到十本C++书籍常放手边备用还是OK的,最基本的一本是《C++ Primer》, 还有《Effective C++》, 《C++ templates》, 《Inside the C++ Object Model》, 还要STL标准库参考书等等...

而C就比较返璞归真一些... 适当的汇编参考,《深入理解计算机系统》,对于编译和链接的理解,对目标文件格式的理解,对于共享库的理解,对于像X86这样的CPU的段式管理(已经没什么用但必须要经过的)和内存分页管理(当前主流内存管理方式)的了解,对内核的