pw:不清楚收藏是什么意思,这篇文章以前见过,后来我做了一下整理,就算是收藏吧。
计算机语言程序设计自从50年代中期至今,历经了将近半个世纪,其中经历了无数的挫折,更可喜的是语言的发展取得了重大的进步,其中发展了4中程序设计典范,在计算机的发展史上留下了光辉的一页。
一、过程式程序设计:确定你需要哪些过程,采用你能找到的最好的算法。
它关注的是计算机的处理过程,在这个阶段,算法是最重要的,不仅仅是因为这种设计典范的原因,还有当时的科研条件的限制,CPU,内存都少得可怜,一个算法的好坏直接影响了程序的最终质量。
当时支持这种典范的语言(当然,当时的语言还不是很多)都是以函数为中心,各种算法都是通过函数调用和其他语言功能写出的,于是函数就被当作在算法迷宫里建立起来的一种秩序。
由于当时设计典范就是这个样子的,所以促使人们研究各种算法,从而出现了很多非常经典的算法(也许更加准却的说法是,算法的出现,促使了这种设计典范的产生)例如:
1、1946 Los Alamos的Von Neumann,Stan Vlam,Nick Metropolis编的 Metropolis算法,即
Monte Carlo方法
2、1947 兰德公司的Grorge Dantzig创造的线性规划的单纯性算法
3、1950 美国国家标准局数值分析所的Magnus Hestenes,Edward Stiefel,Cornelius Lan
czos的Krylovz空间迭代法
4、1951 橡树岭国家实验室的Alston Householder矩阵计算的分解方法
5、1951 John Backus在IBM领导的小组研制的Fortron最优编译程序
6、1959-61 伦敦的Ferranti Ltd的J.G.F.Francis的称为QR的算法的计算机本征值的稳定
的方法
7、1962 London的Elliot Brothers Ltd的Tony Hoare提出的快速(按大小)分类法
8、1965 IBM的Cooley与Princeton及Bell的Turkey的FFT算法
可以这么说,这是这种设计典范的兴起,才会涌现了如此精彩的算法,以后就很少有什么经典的算法产生了(当然有,但是没这么多了)。
二、模块式程序设计:确定你需要哪些模块;将程序分为一些相应的模块,使数据隐藏在模块之中。
在随后的年代里,程序设计的重点放生了转移:从过程式设计转移到了对数据的组织。这种转移也反映了程序规模的增长,同时也暗示了软件工厂的出现。
模块简单的说就是一组过程和数据的包,这就是广为人知的“数据隐藏原理”。在一些小型的程序里面或者那些不需要处理与数据相关的过程之外,采用过程式设计已经绰绰有余了,但是一个比较好的技术----模块式设计,自从其出现之后,就备受关注,这是的后期维护工作变得相对简单了很多,设计思路也更加得清晰了。
比较常见的模块式设计方法有:
(1)名字空间/结构。这是一种很容易的达到信息隐藏的目的的方法,于是函数、类型等的名字就能够很容易的做成局部的东西。
(2)头文件和实现文件分离。通过这种方法,我们可以把声明和实现分离,一方面隐藏了用户并不关心的实现部分,另一方面也为重新编译提供了优化的手段。这种方法的实现是靠一个很重要的概念---分别编译。严格的说来,分别编译的使用不是语言要考虑的问题,而是关于如何最好的利用特定的语言实现的优点的问题。当然,最好的方式就是最大限度的模块化,通过语言特征去逻辑的表示模块化,然后通过能最有效的分别编译的一组文件,物理的利用这种模块化机制。
(3)用户定义类型。这时候你就要关心你需要哪些数据类型和相应的操作,然后对他们进行封装即可,实际的应用中,这种方式应用的很广泛,例如类,不过这个时候还没有实际的类。
模块式程序设计的引入,导致异常处理变得非常重要,对于错误的处理也就自然而然的建立在这些模块的基础之上,随着时间的推移,各种库被广泛应用,于是标准化的方式就要求出现,于是异常处理就应运而生。
三、面向对象式程序设计(OOP):确定你需要哪些类,为每个类提供完整的一组操作,利用继承去明确的表示共性。
面向对象,这是大家都非常熟悉的概念,但是什么是面向对象?你问10个人,会有15各答案。面向对象究竟必须包含那些特性?毫无疑问,继承、多态是肯定要入选的,关键是还有什么。封装?模板?异常?无论哪一个都有相当一部分忠实的拥护者。
这些我们没有必要去争论,关键的是面向对象有什么优势,嗯,这很多,你可以参考Booch的《面向对象分析与设计》。
对象概念对软件解决方案具有莫大的好处,在设计优秀合理的情况下尤其如此。你可以只编写一次代码而在今后反复重用,而在非OOP的情况下你则多半要在应用程序内部各个部分反复多次编写同样的功能代码。所以说,由于面向对象编程减少了编写代码的总量,从而加快了开发的进度同时降低了软件中的错误量。
用来创建对象的代码还可能用于多个应用程序。比方说,你的团队可以编写一组标准类来计算你的可用资源,然后用这些代码在所有需要同类对象的解决方案中创建对象,比如客户定单接口、股票价值报表和发给销售队伍的通知等等。
OOP的另一优点是对代码结构的影响。像继承之类的面向对象概念通过简化变量和函数的方式而便利了软件的开发过程。OOP可以更容易地在团队之间划分编码任务。同时,由于采用OOP,辨别子类代码的依附关系也变得更简单了(比如说继承对象的代码)。此外,软件的测试和调试也得以大大简化。
但是OOP也存在一些固有的缺点。假如某个类被修改了,那么所有依赖该类的代码都必须重新测试,而且还可能需要重新修改以支持类的变更。还有,如果文档没有得到仔细的维护,那么我们很难确定哪些代码采用了父类(被继承的代码)。假如在开发后期发现了软件中的错误,那么它可能影响应用程序中的相当大部分的代码。
面向对象编程在编程思想上同传统开发不同,需要开发人员转变传统开发中所具备的惯性思维方式。对一个有经验的OOP开发队伍来说,采用OOP的好处是显而易见的。如果你正在考虑转向OOP,那么你必须保证已经拥有了富有经验的主要开发人员能负责地检查软件中的缺陷和体系结构。
四、范型程序设计:确定你需要哪些算法,将他们参数化。
利用类和类层次机制,我们可以优雅并高效的表达单一的概念,还可以表达在某种层次体系中相互联系着的多个概念。然而有一些常见的重要概念却既不具有单一性又不属于某种层次体系。例如“整型vector”和“复数vector”,它们都是vector(这即是说,它们之间存在某种关系),但它们又因为各自的元素型别不同而被区分开来。像这样的抽象概念最好用参数化的概念来表达。比如,我们可以把元素的型别作为参数而将其参数化。
C++通过模板来提供型别的参数化能力。有一个极为重要的设计准则是:在使用模板定义基本的container时,模板应该在严格的性能要求下仍具有足够的可适应性和高效率。具体来说,其设计目标就是提供一种vector模板类,并且其与内建型别相比,又并不带来额外的运行时间负荷或者空间负荷。
总结:++并没有说专门支持哪一种设计典范,相反,它提供了上面的4中设计典范,为我们提供了相当的灵活性,但是个人认为要想发挥C++的强大优势,还是要使用OO&GP,另外,标准库一定要熟练使用,这是提高你设计能力的一个重要方面。