网上看见一篇文章,觉得很有道理!
原文:http://www.cppblog.com/netnchen/archive/2007/03/28/20764.html
一种语言代表了一种思维,而思维决定了问题的解决方式。
从程序设计语言出现到现在已经经历了四代。大多数高级语言都对应到第三代或四代程序设计语言。按其主要支持的编程模型(思维模式)分类,大致可以分为如下类型
1 . 过程型:这类语言把应用抽象为序列化的操作步骤,其典型代表如PASCAL,C等。
2 . 函数型:这类语言把应用抽象为函数(按定义,函数是从一个域到另一个域的映射);它们试图把问题分解为集合和集合间的函数关系。典型代表是LISP。
3 . 逻辑型:这类语言把问题抽象为事实与规则的结合,试图通过逻辑演算解决实际问题。典型代表是PROLOG。
4 . 面向对象型:这类语言从上世纪80年代后迅速发展,这类语言试图将实际问题抽象为独立的对象以及对象间的交互,典型代表是早期的SmallTalk和Eiffel。
5 . 面向数据结构型:这类语言将问题抽象为对结构化数据的操作,例如现在常用的SQL。
作为一个诞生与上世纪80年代初期的编程语言,C++被广泛的认为是一种支持面向对象的语言;但是,我认为C++的伟大之处却更多的在于(除了所提供完备的面向对象支持)它同样提供了C的面向过程的编程模型以及只有少数高级语言能支持的范型编程(我更喜欢叫它面向算法的编程)。在实际的应用过程中,我们往往需要不同层次的抽象,C++所支持的广泛的编程模型为我们提供了强大和灵活的工具,使得我们在设计和实现时能自如的选择不同的模型,以最合理的(组合)方式解决问题。
不可否认,在当今的程序设计中,面向对象已经基本上是一统江湖,但它往往并不是最合理的选择;例如在针对协议栈的开发中,使用面向过程的模型往往优于使用面向对象的模型(或许这也是为什么主流的电信设备供应商坚持使用C的原因?);而在针对算法进行抽象时,使用面向对象的思维模式几乎完全是不可行的(算法和对象间的不同之处是显而易见的);如果机械的运用面向对象思维,只能使最终产品的质量、可维护性、可读性下降。
或许有人会问,那么应该如何选择抽象方式呢?我觉得这个应该是因人和问题的不同而不同的,关键是在使用C++的过程中,多从这些方面进行思考、总结,以体会采用不同模式解决问题的优缺点,努力使用最合理的方式(或组合)对问题进行抽象并加以解决。我也常常为这些种种选择而迷惑,因此在这儿也希望那些已经到了"不惑"层次的哥们多多指教。
当然,从另一方面来说,越多的选择往往意味着越难的选择,这或许也是为什么现在这么多人趋骛与更单纯、更简单的JAVA,C#的原因吧;但是当我们真正理解并掌握C++提供的这些编程模型时,我想我们会更加坚定当初选择C++的信念;
没有评论:
发表评论