C++的程序设计典范

原创 2003年06月30日 09:33:00

      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,另外,标准库一定要熟练使用,这是提高你设计能力的一个重要方面。

   

C语言及程序设计进阶例程-14 开发一个电子词典

贺老师教学链接  C语言及程序设计进阶 本课讲解开发一个电子词典(下载词库点击打开链接)#include #include #include //定义词条类 typedef struct { ...
  • sxhelijian
  • sxhelijian
  • 2015年05月30日 21:17
  • 2869

《C语言及程序设计》实践参考——电子词典

返回:贺老师课程教学链接【项目2-电子词典】做一个简单的电子词典。在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个,英文与释义间用’\t’隔开。编程序,将文件中的内...
  • sxhelijian
  • sxhelijian
  • 2015年05月02日 11:30
  • 4011

IT行业经典电子书和教程下载~

IT行业经典电子书和教程下载~ 电子书下载:计算机科学经典著作大合集~ http://pan.baidu.com/s/1j4XK5 (计算机图书-Share) 清华系列:清华出版计算机书籍相关资源全...
  • yangle20081982
  • yangle20081982
  • 2014年03月15日 15:24
  • 7068

C++程序设计课程主页-2012级

这门课的主人  教师:贺利坚——为同学设计学习任务的人,为全班学习把握节奏的人,谁不往前走踢谁屁股的人。常混迹CSDN博客和新浪博客,也可以上人人网加我好友,我的《IT学子成长指导》博客专栏,或许有些...
  • sxhelijian
  • sxhelijian
  • 2012年08月27日 01:38
  • 44557

C/C++语言经典、实用、趣味程序设计编程百例精解

C/C++语言经典、实用、趣味程序设计编程百例精解(1)  1.绘制余弦曲线 在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线 *问题分析与算法设计 如果在程序中使用数组...
  • Enjoying_Science
  • Enjoying_Science
  • 2014年08月31日 20:37
  • 1883

2017 程序设计实习之C++部分作业题汇总 - D:继承与派生

题目来源:2017 程序设计实习之C++部分作业题汇总1、D01:全面的MyString总时间限制: 1000ms 内存限制: 65536kB 描述 程序填空,输出指定结果#include #i...
  • Veniversum
  • Veniversum
  • 2017年05月09日 10:44
  • 279

程序设计基础(C&C++) 戴波、张东祥 第五章 指针 编程作业

1最大整数(25分)题目内容:输入3个整数,用指针指向最大整数并输出输入格式:输出格式:输入样例:1,2,3输出样例:3参考代码#include int main(){ int a,b,c;...
  • codeforcer
  • codeforcer
  • 2016年11月24日 21:54
  • 1049

C++程序设计课后习题及解答(第一章)

C++程序设计课后习题解答(第一章)
  • rl529014
  • rl529014
  • 2016年01月03日 17:09
  • 1470

C++程序设计 第7周 字符串操作

遇到的问题: 1. 访问数组出现“不确定”的提示,后来是发现数组的命名与C++的某些操作命令重合了。 2. 对于“83s”这样的字符串,stoi的命令会直接得出83,需要一个个的字符去判断是否是数...
  • beautydakki
  • beautydakki
  • 2018年01月13日 21:31
  • 7

C++“窗口”程序设计启蒙

【摘要】本文以C++菜菜鸟(只需要学习了C++数据类型和控制结构即可)为目标读者,用求解一元二次方程作为实例,展示窗口式程序的开发过程,获得初步体验。写作目的包括:(1)让学生通过模仿,开发出类似风格...
  • sxhelijian
  • sxhelijian
  • 2012年05月11日 08:09
  • 30071
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++的程序设计典范
举报原因:
原因补充:

(最多只允许输入30个字)