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

fireaxe2012-01-15 23:08:08

统一楼主,C语言同样需要面向对象,看看linux kernel的实现就知道了。至于为什么选择C++,是因为它与C比较像,有时间看看java更好。不过我觉得没必要研究太深入,够用就好

杭州李云2012-01-15 11:05:52

Heartwork: 学习面向对象程序设计可以提高C程序员的设计水平,这一点我基本赞同。封装、信息隐藏这些概念用C可以很简单的实现。多态用C实现相对丑陋一点。

但是为了学习这.....
首先,学C++的目的不应只是为了学习OO,而是为了用它,这不存在代价一说。当一个项目只有C++适用时,我们没得选择是用Java或Smalltalk。从严谨性的角度来说,文中应明晰这一点。

您所提的三个观点似乎都是在说明C++语言不雅,这我完全同意。但我认为在这方面我们无需过多讨论。每种语言有它的适用场合和发展历程,我们在不能改变语言的选择权和修改语言的语法和语意时,只能适应。我们可以选择不适应,但我们将失去相应的职场机会。

就学习Smalltalk的观点,我认为还是应以使用为导向。一种不以用为目的的学习可以当作兴趣,但我担心很难坚持。

是的,C中用C++时是得注意Mangling

Heartwork2012-01-14 23:26:15

学习面向对象程序设计可以提高C程序员的设计水平,这一点我基本赞同。封装、信息隐藏这些概念用C可以很简单的实现。多态用C实现相对丑陋一点。

但是为了学习这些设计理念来学习C++貌似代价有点高。

1)C++的oo不是很纯粹。比如C++的类型定义,实际还是暴露了内部实现。
2)C++的多范式,比较容易分散学习者的注意力。特别是在以前泛型比较火的时候。
3)很容易陷入到技术细节,学到的设计经验不能很好适应C的语境。楼主提到的四本书我翻过前三本,Effective C++和 More Effective C++基本属于这种情况。Exceptional C++中exception-safe的主题算是与语言无关,值得编写函数库的程序员看看。

如果真的对oo很偏执的话,那就学smalltalk吧。

另外,在C中使用C++的话,还是需要通过中间层来解决C++的Name mangling问题。

F9624642012-01-14 16:37:23

我也觉得很重要

小豆熊2012-01-12 21:53:44

看来面向对象的优越性无可替代啊!~