精华内容
下载资源
问答
  • 面向对象程序设计

    千次阅读 2011-10-23 22:26:22
    面向对象程序设计 求助编辑百科名片 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象...
     
    

    面向对象程序设计

    求助编辑百科名片

    面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。

    编辑本段理论历史

      1967年挪威计算中心的Kisten Nygaard和Ole Johan Dahl开发了Simula67语言,它提供了比子程序更高一级的抽象和封装,引入了数据抽象和类的概念,它被认为是第一个面向对象语言。20 世纪70年代初,Palo Alto研究中心的Alan Kay所在的研究小组开发出Smalltalk语言,之后又开发出Smalltalk-80,Smalltalk-80被认为是最纯正的面向对象语言,它对后来出现的面向对象语言,如Object-C,C++,Self,Eiffl都产生了深远的影响。随着面向对象语言的出现,面向对象程序设计也就应运而生且得到迅速发展。之后,面向对象不断向其他阶段渗透,1980年Grady Booch提出了面向对象设计的概念,之后面向对象分析开始。1985年,第一个商用面向对象数据库问世。1990年以来,面向对象分析、测试、度量和管理等研究都得到长足发展。
      实际上,“对象”和“对象的属性”这样的概念可以追溯到20世纪50年代初,它们首先出现于关于人工智能的早期著作中。但是出现了面向对象语言之后,面向对象思想才得到了迅速的发展。过去的几十年中,程序设计语言对抽象机制的支持程度不断提高:从机器语言到汇编语言,到高级语言,直到面向对象语言。汇编语言出现后,程序员就避免了直接使用0-1,而是利用符号来表示机器指令,从而更方便地编写程序;当程序规模继续增长的时候,出现了Fortran、C、Pascal等高级语言,这些高级语言使得编写复杂的程序变得容易,程序员们可以更好地对付日益增加的复杂性。但是,如果软件系统达到一定规模,即使应用结构化程序设计方法,局势仍将变得不可控制。作为一种降低复杂性的工具,面向对象语言产生了,面向对象程序设计也随之产生。

    编辑本段基本概念

      面向对象程序设计中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。通过这些概念面向对象的思想得到了具体的体现。
      1)对象 对象是运行期的基本实体,它是一个封装了数据和操作这些数据的代码的逻辑实体。
      2)类 类是具有相同类型的对象的抽象。一个对象所包含的所有数据和代码可以通过类来构造。
      3)封装 封装是将数据和代码捆绑到一起,避免了外界的干扰和不确定性。对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。
      4)继承 继承是让某个类型的对象获得另一个类型的对象的特征。通过继承可以实现代码的重用:从已存在的类派生出的一个新类将自动具有原来那个类的特性,同时,它还可以拥有自己的新特性。
      5)多态 多态是指不同事物具有不同表现形式的能力。多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。
      6)动态绑定 绑定指的是将一个过程调用与相应代码链接起来的行为。动态绑定是指与给定的过程调用相关联的代码只有在运行期才可知的一种绑定,它是多态实现的具体形式。
      7)消息传递 对象之间需要相互沟通,沟通的途径就是对象之间收发信息。消息内容包括接收消息的对象的标识,需要调用的函数的标识,以及必要的信息。消息传递的概念使得对现实世界的描述更容易。
      8)方法 方法(Method)是定义一个类可以做的,但不一定会去做的事。

    编辑本段语言

      一个语言要称为面向对象语言必须支持几个主要面向对象的概念。根据支持程度的不同,通常所说的面向对象语言可以分成两类:基于对象的语言,面向对象的语言。
      基于对象的语言仅支持类和对象,而面向对象的语言支持的概念包括:类与对象、继承、多态。举例来说,Ada就是一个典型的基于对象的语言,因为它不支持继承、多态,此外其他基于对象的语言还有Alphard、CLU、Euclid、Modula。面向对象的语言中一部分是新发明的语言,如Smalltalk、Java,这些语言本身往往吸取了其他语言的精华,而又尽量剔除他们的不足,因此面向对象的特征特别明显,充满了蓬勃的生机;另外一些则是对现有的语言进行改造,增加面向对象的特征演化而来的。如由Pascal发展而来的Object Pascal,由C发展而来的Objective-C,C++,由Ada发展而来的Ada 95等,这些语言保留着对原有语言的兼容,并不是纯粹的面向对象语言,但由于其前身往往是有一定影响的语言,因此这些语言依然宝刀不老,在程序设计语言中占有十分重要的地位。

    编辑本段优点

      面向对象出现以前,结构化程序设计是程序设计的主流,结构化程序设计又称为面向过程的程序设计。在面向过程程序设计中,问题被看作一系列需要完成的任务,函数(在此泛指例程、函数、过程)用于完成这些任务,解决问题的焦点集中于函数。其中函数是面向过程的,即它关注如何根据规定的条件完成指定的任务。
      在多函数程序中,许多重要的数据被放置在全局数据区,这样它们可以被所有的函数访问。每个函数都可以具有它们自己的局部数据。下图显示了一个面向过程程序中函数和数据的关系。
      图1 面向过程程序设计中函数和数据的关系示例
      这种结构很容易造成全局数据在无意中被其他函数改动,因而程序的正确性不易保证。面向对象程序设计的出发点之一就是弥补面向过程程序设计中的一些缺点:对象是程序的基本元素,它将数据和操作紧密地连结在一起,并保护数据不会被外界的函数意外地改变。下图显示了一个面向对象程序中对象与函数和数据的关系。
      图2 面向对象程序设计中函数和数据的关系示例
      比较面向对象程序设计和面向过程程序设计,还可以得到面向对象程序设计的其他优点:
      1)数据抽象的概念可以在保持外部接口不变的情况下改变内部实现,从而减少甚至避免对外界的干扰;
      2)通过继承大幅减少冗余的代码,并可以方便地扩展现有代码,提高编码效率,也减低了出错概率,降低软件维护的难度;
      3)结合面向对象分析、面向对象设计,允许将问题域中的对象直接映射到程序中,减少软件开发过程中中间环节的转换过程;
      4)通过对对象的辨别、划分可以将软件系统分割为若干相对为独立的部分,在一定程度上更便于控制软件复杂度
      6)以对象为中心的设计可以帮助开发人员从静态(属性)和动态(方法)两个方面把握问题,从而更好地实现系统;
      7)通过对象的聚合、联合可以在保证封装与抽象的原则下实现对象在内在结构以及外在功能上的扩充,从而实现对象由低到高的升级。

    编辑本段设计方法

      在数据输入模块内部设计中,采用面向对象的设计方法。[6]面向对象的基本概念如下:
      对象:对象是要研究的任何事物。从一本书到一家图书馆,单的整数到整数列庞大的数据库、极其复杂的自动化工厂、航天飞机都可看作对象,它不仅能表示有形的实体,也能表示无形的(抽象的)规则、计划或事件。对象由数据(描述事物的属性)和作用于数据的操作(体现事物的行为)构成一独立整体。从程序设计者来看,对象是一个程序模块,从用户来看,对象为他们提供所希望的行为。在对内的操作通常称为方法。
      类:类是对象的模板。即类是对一组有相同数据和相同操作的对象的定义,一个类所包含的方法和数据描述一组对象的共同属性和行为。类是在对象之上的抽象,对象则是类的具体化,是类的实例。类可有其子类,也可有其它类,形成类层次结构。
      消息:消息是对象之间进行通信的一种规格说明。一般它由三部分组成:接收消息的对象、消息名及实际变元。
      面向对象主要特征:
      封装性:封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象。
      继承性:继承性是子类自动共享父类之间数据和方法的机制。它由类的派生功能体现。一个类直接继承其它类的全部描述,同时可修改和扩充。继承具有传递性。继承分为单继承(一个子类只有一父类)和多重继承(一个类有多个父类)。类的对象是各自封闭的,如果没继承性机制,则类对象中数据、方法就会出现大量重复。继承不仅支持系统的可重用性,而且还促进系统的可扩充性。
      多态性:对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接受消息的对象自行决定,如是,同一消息即可调用不同的方法。例如:Print消息被发送给一图或表时调用的打印方法与将同样的Print消息发送给一正文文件而调用的打印方法会完全不同。多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应。在OOPL中可通过在派生类中重定义基类函数(定义为重载函数或虚函数)来实现多态性。
      综上可知,在面对对象方法中,对象和传递消息分别表现事物及事物间相互联系的概念。类和继承是是适应人们一般思维方式的描述范式。方法是允许作用于该类对象上的各种操作。这种对象、类、消息和方法的程序设计范式的基本点在于对象的封装性和类的继承性。通过封装能将对象的定义和对象的实现分开,通过继承能体现类与类之间的关系,以及由此带来的动态联编和实体的多态性,从而构成了面向对象的基本特征。
      面向对象设计是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在“对象”概念基础上的方法学。对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。而每继承性是对具有层次关系的类的属性和操作进行共享的一种方式。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。。按照Bjarne STroustRUP的说法,面向对象的编程范式:
      l 决定你要的类;
      2 给每个类提供完整的一组操作;
      3 明确地使用继承来表现共同点。
      由这个定义,我们可以看出:面向对象设计就是“根据需求决定所需的类、类的操作以及类之间关联的过程”。

    编辑本段未来发展

      (撰文/Bjarne Stroustrup & Tim Lindholm 编译/孟岩)

    在未来三年编写代码的方式会发生那些变化

      Stroustrup: 在C++中,假如没有合适的库在背后支撑,完成任何重要的工作都可能是很复杂的。而一旦有了合适的库,任何东西都可以被我们操控于股掌之间。因此,构造和使用程序库的重要性与日俱增。这也暗示我们,泛型程序设计(generic programming)将会越来越多地被运用。只有通过GP,我们才能确保库的通用性和高效率。我还预期在分布式计算和“组件(components)”应用领域会出现喜人的增长。就大部分程序员而言,通过使用方便适用的程序库,这些开发工作会变得简单明了。
      现在有一个趋势,编译器厂商试图把其特有的“对象模型”和图形界面(GUI)细节推销给用户。比如微软的COM和Inprise的类属性“properties”。对于用户来说,这既不必要,也不情愿。我所希望看到的程序库,应该是用标准C++打造,界面灵活,值得信赖的程序库。通常,这些界面应该是平台无关的。C++的表达能力极强,即使不使用大量的宏,也应该足以达成这一要求。就算有些地方无法百分之百的遵守这一原则,也应该将对于平台和厂家的依赖性限制起来。这个目标的完成情况,可以反映软件工具产业对于应用程序开发行业的关注程度。我怀疑目前对于那些独立的、跨平台厂商来说,并不存在相应的市场。如果能够建立这样的市场,也许能够促进厂商们为客户做出“真正有用的”产品。
      Lindholm: 对于编写代码的开发者来说,主要的驱动力量仍将是两个:网络和分布式——也就是设计和开发非单机软件的需求。大部分的应用程序将不会是孤零零地运行在单一设备上,而是运用了类似EJB和JSP之类技术的,平台无关的分布式程序。程序员们将不得不面对分布式计算的重重险阻。这将对许多程序员所依赖的设计模式、技术和直觉构成严峻的挑战。这是选择编程语言之前必须认识到的,尽管不同语言的设计特性可能促进或者阻碍这一转化。
      在网络应用的增长中,一个很重要的部分是小型移动设备和特殊Internet设备的爆炸性增长。这些设备各有各的操作系统,或者只在某种特定的设备领域内有共同的操作系统。我们现在还可以一一列举出这些设备——家庭接入设备、蜂窝电话、电子报纸、PDA、自动网络设备等等。但是这些设备领域的数量和深入程度将会很快变得难以估量。我们都知道这个市场大得惊人,PC的兴起与之相比不过小菜一碟。因此在这些设备的应用程序市场上,竞争将会相当残酷。获胜的重要手段之一,就是尽快进入市场。开发人员需要优秀的工具,迅速高效地撰写和调试他们的软件。平台无关性也是制胜秘诀之一,它使得程序员能够开发出支持多种设备平台的软件。
      我预期的另一个变化是,我们对于代码(Java)和数据(XML)协同型应用程序的开发能力将会不断提高。这种协同是开发强大应用程序的核心目标之一。我们从XML的迅速流行和ebXML规范的进展中,已经看到了这个趋势。ebXML是一个针对电子商务和国际贸易的,基于XML的开放式基础构架,由联合国贸易促进和电子商务中心(UN/CEFACT)与结构性信息标准推进组织(OASIS)共同开发。
      我们能否期望出现一个真正的面向组件(component-oriented)的语言?它的创造者会是谁呢?
      Stroustrup: 我怀疑,这个领域中之所以缺乏成果,正是因为人们——主要是那些非程序员们——对“组件”这个意义含糊的字眼寄予了太多的期望。这些人士梦想,有朝一日,组件会以某种方式把程序员赶出历史舞台。以后那些称职的“设计员”只需利用预先调整好的组件,把鼠标拖一拖放一放,就把系统组合出来。对于软件工具厂商来说,这种想法还有另一层意义,他们认为,到时候只有他们才保留有必要的技术,有能力编写这样的组件。
      这种想法有一个最基本的谬误:这种组件很难获得广泛欢迎。一个单独的组件或框架(framework),如果能够满足一个应用程序或者一个产业领域对所提出的大部分要求的话,对于其制造者来说就是划算的产品,而且技术上也不是很困难。可是该产业内的几个竞争者很快就会发现,如果所有人都采用这些组件,那么彼此之间的产品就会变得天下大同,没什么区别,他们将沦为简单的办事员,主要利润都将钻进那些组件/框架供应商的腰包里!
      小“组件”很有用,不过产生不了预期的杠杆效应。中型的、更通用的组件非常有用,但是构造时需要非同寻常的弹性。
      在C++中,我们综合运用不同共享形式的类体系(class hierarchies),以及使用templates精心打造的接口,在这方面取得了一定的进展。我期待在这个领域取得一些有趣和有用的成果,不过我认为这种成果很可能是一种新的C++程序设计风格,而不是一种新的语言。
      Lindholm: 编写面向组件的应用程序,好像更多的是个投资、设计和程序员管理方面的问题,而不是一个编程语言问题。当然某些语言在这方面具有先天优势,不过如果说有什么魔术般的新语言能够大大简化组件的编写难度,那纯粹是一种误导。
      微软已经将全部赌注押在C#上,其他语言何去何从?
      Stroustrup: C++在下一个十年里仍然将是一种主流语言。面对新的挑战,它会奋起应对。一个创造了那么多出色系统的语言,绝不会“坐视落花流水春去也”。
      我希望微软认识到,它在C++(我指的是ISO标准C++)上有着巨大的利益,C++是它与IT世界内其他人之间的一座桥梁,是构造大型系统和嵌入式系统的有效工具,也是满足高性能需求的利器。其他语言,似乎更注重那些四平八稳的商用程序。

    OOP名词释意

      OOP被理解为一种将程序分解为封装数据及相关操作的模块而进行的编程方式。有别于其它编程方式,OOP中的与某数据类型相关的一系列操作都被有机地封装到该数据类型当中,而非散放于其外,因而OOP中的数据类型不仅有着状态,还有着相关的行为。OOP理论,及与之同名的OOP实践相结合创造出了新的一个编程架构;OOP思想被广泛认为是非常有用的,以致一套新的编程范型被创造了出来。(其它的编程范型例如函数式编程或过程式编程专注于程序运行的过程,而逻辑编程专注于引发程序代码执行的断言)对面向模拟系统的语言(如:SIMULA 67)的研究及对高可靠性系统架构(如:高性能操作系统和CPU的架构)的研究最终导致了OOP的诞生。

    不同OOP语言各有什么优势和劣势

      Stroustrup: C++的优点自始至终都是这么几条:灵活、高效,而且并非专有语言。现在ISO C++标准的出现,巩固了最后一点。
      我认为C++的高效是它最基本的优点。这种高效来自于其特有的数据和计算模型,较之Java和C#,这种模型更加贴近机器。不过,哪些程序才真正地渴望这么高的效率?这是个问题。我认为这类程序非常多。人们对于计算机的期望,永远都超越硬件科技的发展速度。很显然,Java和C#的设计者的想法不同,他们认为,在很多地方效率问题无关紧要。
      C++主要的缺点,归罪于糟糕的教育(是那些始终认为C++是个纯粹面向对象语言的人,和那些把C++当成C语言变体的人导致了这种情况),归罪于不同平台上的不一致性,归罪于不完整、不标准的编译器实现,归罪于平台无关的系统级程序库的缺少。
      这些问题归于一点,就是缺乏一个卓越的厂商,能够满足整个C++社区的需求,勇于投入大量的资金开发必要的程序库。
      Lindholm: Java技术的成功,是因为它在合适的时间,出现在合适的地点,而且合理地选择了语言和计算平台的支持目标。Java并不是在所有场合都优于其他OOP语言,但是对于出现的新问题能够解决得很出色。它面向Internet计算环境,避免了C++中晦涩的结构,成功翻越了继承机制的恼人问题。垃圾收集机制显著地提高了生产率,降低了复杂度。在网络背景下使用虚拟机,以及有关安全性和动态加载的一系列设计选择,迎合了正在出现的需求和愿望。这些特性使Java不仅成为现有程序员的新武器,而且也为新的程序员创造了繁荣的市场空间。
      此外,Java拥有一个标准化的、二进制形式的类库,提供了必要的(当然并非充分的)平台与厂商无关性。平台与厂商无关性要求一项技术必须有清晰的规范,摒弃那些阻碍二进制标准实施的特性。C++虽然有一个ISO标准,但其实甚至对于相同系统与相同指令体系的各个平台,也提不出一个实用的、各版本兼容的二进制标准。
      历史上很多使用虚拟机的语言饱受责难,是因为其不够出色的性能问题,而这要归过于缓慢的解释器和糟糕的垃圾收集器。Java的早期实现也因为同样的问题受到严厉的批评。但是自那时起,业界向新的虚拟机实现技术投入了大量资金,取得了显著的效果,如今在大部分场合,Java的性能跟常规的静态编译语言相比毫不逊色。这使得程序员在获得平台和厂商无关性的同时,也不必付出性能上的代价。
      C++并没有强制使用面向对象方法,因此为了编写出色的面向对象代码,就要求程序员们有相当强的纪律性。很多公司就是因为这个原因放弃了C++。作为语言,Java的一个突出的优点就是强制面向对象方法,不允许非面向对象的结构。
      C#介于C++和Java之间,脚踏两只船,因此既不够安全,又失之复杂。
      对于公司来说,采用新的语言要付出巨大代价。雇不到好的程序员(没人熟悉这种新语言),培训费用高得惊人,学习过程中生产率和产品质量下降,多年的经验随风消逝,等等。一种语言如何克服这些障碍?
      Lindholm: 说得很对,采用新东西确实常常开销巨大。不过问题是:这个新东西是否能够节省更多的开支,或者提供巨大的改进,获取合理的回报?很多公司发现,转向Java技术不论在开发的后端(尽快进入市场、快速迭代开发、维护简单性)还是前端(跨平台发布,适用范围从低端设备到高端服务器的技术,安全性),都能节省大笔的开销。
      对于新事物的接纳,常常是在痛楚的压力之下。很大程度上,这正是Java所经历的。Java的产生,是对当时很多系统的缺陷所做出的反应。Java技术通过下面的手段减轻了开发者的痛楚:1) 顾及了网络计算方面的需求,是应运而生。2) 在技术能力的抉择上,保持良好的品位,顾及了大众的心理。3) 采用适度强制性策略推行设计决定。此外,Java技术已经成为大学教学中的主流,这同样保证了Java开发者队伍的不断壮大。
      但是最重要的一点是,再没有另一种程序设计技术,能够像Java那样允许程序员开发基于Internet的不同平台之上的应用程序。Java平台在这方面的杰出表现,已经被大量的实例证明。Java已经成为Internet上的缺省应用程序平台,Java APIs也成为Internet应用程序开发的天然平台。
      Stroustrup: 微软和Sun把大笔的金钱扔在Java、VB和C#中,并不是因为他良心发现,也不是因为他们真的相信这些语言能够带给程序员更美好的生活,而是利益使然。
      有一个说法,认为软件工具厂商如果能够把应用程序开发者的专业技术任务负担起来,将获取巨大的经济利益。我对其背后的经济分析颇为怀疑,我认为这很难成为现实,特别是当应用程序开发者使用开放的、标准化的工具时,他们可以有多种选择,从而使上面的想法更加不可能。
      多年以前,C++就已经具有泛型能力(也就是templates和STL),有运算符重载,有枚举类型?我们会不会在Java的未来版本中看到这些特性?Java是不是应该纳入这些特性呢?
      Strousturp:从1988-89年起,C++就已经有了templates。但是我们花了不少时间来了解如何最好地运用这个工具,早期各厂家对于template的支持在品质上也有很大的差异。有些编译器厂商动作迟缓,至少??Visual C++4.0才开始支持template,在此之前一直声称template是过于复杂而又没什么用的技术,时至今日,Visual C++对于template的支持在主流编译器中都属于最差的一档——译者注)暗中鼓励声名狼藉的反template宣传,直到他们自己终于学会了这项技术为止。直到今天,对于template的支持在品质上仍然有待改进。
      你上面提到的那些特性,我认为Java(还有C#)应该,也肯定会逐渐引入。那些对于程序员来说最有用的语言特性和概念,将会逐渐集中,成为各家主流语言的必然之选。也就是说,我认为类似析构函数和模板特殊化之类的机制,远远比枚举等机制重要得多。
      Lindholm:Java技术成功的原因之一,就是很清楚哪些不该做。我们得多问几个为什么:这项特性是不是必不可少?增加它会带来哪些开销?运算符重载是C++中一项极其强大的特性,但是它也大大增加了C++语言的复杂度,很多人都难以招架。Java在各种可能的权衡之中,做出了明智的抉择,找到了能力与需求之间的完美平衡点。
      当然,Java也会发展,而且最重要的是,现在是开发者们在推动发展。Java增加泛型能力这件事,很好地展示了Java是如何通过整个开发者社群的参与,在权衡中决定正确的平衡点。关于增加泛型类型(generic types)的“Java规格申请”(Java Specification Request, JSR)已经进入JCP(Java Community Process)程序,而且已经开发了很长一段时间)。现在,在JCP中,有超过80个JSRs正在讨论中,这充分体现了整个体系对开发者的积极反馈和高度合作,这正是驱动Java平台不断进化的动力。

    面向对象的语言

      支持部分或绝大部分面向对象特性的语言即可称为基于对象的或面向对象的语言。
      早期,完全面向对象的语言主要包括Smalltalk等语言,目前较为流行的语言中有JavaC#Eiffel等。随着软件工业的发展,比较早的面向过程的语言在近些年的发展中也纷纷吸收了许多面向对象的概念,比如C->C++,C->Objective-C,BASIC->Visual Basic->Visual Basic .NETPascal->Object PascalAda->Ada95

    发展 vs. 革新(Evolution vs. Revolution)

      C++是一种发展型的语言,Java和C#似乎更像是革新型语言(它们是从头设计的)?什么时候,革新型的语言才是必需的呢?
      Lindholm: Java技术并非凭空出世,反而更像是发展型的。Java所有的特性,在Java平台推出之前,都至少已经存在于另一种环境之中。Java的贡献在于,在众多的特性和权衡中,做出了合理的选择,使得产品既实用,又优雅。Java技术对于程序员的态度是:抚养,但不溺爱。
      Stroustrup:从技术上讲,我并不认为Java和C#是什么“从头设计的”革新型语言。倘若Java是从技术原则出发,从头设计,大概就不会模仿C/C++那种丑陋和病态的语法了(不必惊讶,Stroustrup在很多场合表示过,C++采用C的语法形式,实在是迫于兼容性。他本人更偏爱Simula的语法——译者)。
      我认为,只有当程序员们面对的问题发生了根本的变化的时候,或者当我们发现了全新的、极其优越的程序设计技术,又完全不能为现存语言所支持的时候,我们才需要全新的语言。问题是,我们恐怕永远也碰不到那些“根本”、“全新”的情况。
      我以为,自从OOP问世以来,可称为“根本”的新型程序设计技术,唯有泛型程序设计(generic programming)和生成式程序设计(generative programming)技术,这两项技术主要是源于C++ templates技术的运用,也有一部分曾经被视为面向对象和函数式语言(functional languages)的次要成分,现在都变成正式、可用和可承受的技术了。我对于目前C++模板(template)程序设计的成果非常兴奋。例如,像POOMA, Blitz++和MTL等程序库,在很多地方改变了数值计算的方式。
      Java和C#的一个“卖点”,就是它们的简单性。现在Java是不是快失去这个卖点了?
      Stroustrup:新语言总是宣称自己如何如何简单,对老语言的复杂性颇多非议。其实这种所谓的“简单性”,简单地说,就是不成熟性。语言的复杂性,是在解决现实世界中极为烦琐和特殊的复杂问题的过程中逐渐增加的。一个语言只要活的时间够长,总会有某些地方逐渐复杂起来,或者是语言本身,或者是程序库和工具。C++和Java显然都不例外,我看C#也一样。如果一种语言能够度过自己的幼年时代,它会发现,自己无论是体积还是复杂性都大大增加了。
      Lindholm:Java技术的的功能在增加,需要学习的东西也在增加。不过功能的增加并不一定带来复杂性的增加。Java技术的发展,并没有使学习曲线更加陡峭,只是让它继续向右方延展了。

    编辑本段特点和面临的问题

      面向对象设计方法以对象为基础,利用特定的软件工具直接完成从对象客体的描述到软件结构之间的转换。这是面向对象设计方法最主要的特点和成就。面向对象设计方法的应用解决了传统结构化开发方法中客观世界描述工具与软件结构的不一致性问题,缩短了开发周期,解决了从分析和设计到软件模块结构之间多次转换映射的繁杂过程,是一种很有发展前途的系统开发方法。
      但是同原型方法一样, 面向对象设计方法需要一定的软件基础支持才可以应用,另外在大型的MIS开发中如果不经自顶向下的整体划分,而是一开始就自底向上的采用面向对象设计方法开发系统,同样也会造成系统结构不合理、各部分关系失调等问题。所以面向对象设计方法和结构化方法目前仍是两种在系统开发领域相互依存的、不可替代的方法。

    编辑本段相关图书

    1图书信息

       书 名: 面向对象程序设计
      作 者:董正言
      出版社 清华大学出版社
      出版时间: 2010年8月1日
      ISBN: 9787302227816
      开本: 16开
      定价: 29.50元

    内容简介

      《面向对象程序设计(C++版)》以面向对象程序设计技术的本质属性为主线,以C++语言为基础,全面地阐述了面向对象程序设计的基本原理。全书共分13章,前5章介绍C++语言的基本编程技术,包括C++的数据类型、常用的运算符、结构化控制语句和函数;第6章~第9章介绍面向对象程序设计方法的核心内容,包括类和对象、类的继承和多态;第10章介绍C++的程序结构、编译预处理指令和命名空间等内容;第11章介绍C++语言标准库中的输入/输出流类;第12章以C++语言为基础,介绍面向对象的异常处理机制;第13章简要介绍使用C++语言和面向对象的程序设计方法设计Windows应用程序的方法。
      《面向对象程序设计(C++版)》语言简洁流畅,通俗易懂,内容全面,重点突出,对核心和重点内容都佐以大量的例证。
      《面向对象程序设计(C++版)》既可以作为高等院校计算机科学与技术及相关专业“面向对象程序设计”课程的授课教材,也可以作为C++程序开发人员的参考书。

    图书目录

      第1章 绪论
      第2章 基本数据类型和运算符
      第3章 控制语句
      第4章 复合数据类型
      第5章 函数
      第6章 类和对象(上)
      第7章 类和对象(下)

    2图书信息

      
      

    面向对象程序设计

    书名: 面向对象程序设计
      作 者:许薇
      出版社: 清华大学出版社
      出版时间: 2009年09月
      ISBN: 9787302202578
      开本: 16开
      定价: 19.00 元

    内容简介

      《面向对象程序设计(C++描述)》以C++语言为描述工具,描述了面向对象程序设计的主要思想和方法,并对其中的重要概念和机制做了详细论述及C++技术的实现。书中知识编排脉络清晰、主旨明确,用例简洁且针对性强,突出并实现了阅读环节对学习效果的价值。《面向对象程序设计(C++描述)》适合于具有结构化程序设计方法知识的读者使用,可作为计算机专业学生面向对象程序设计课程的教材,也可作为从事计算机软件开发人员的参考资料。

    图书目录

      第1章 C++基础知识
      1.1 面向对象的程序设计语言
      1.1.1 C++语言
      1.1.2 Java语言
      1.1.3 Visual Basic语言
      1.2 变量
      1.2.1 变量的定义方法
      1.2.2 const修饰符
      1.2.3 引用类型
      1.3 函数
      1.3.1 函数原型
      1.3.2 内联函数
      1.3.3 带默认参数的函数
      1.3.4 函数的参数传递
      1.3.5 函数重载
      1.4 名字空间
      1.5 动态内存分配
      1.5.1 内存申请
      1.5.2 内存释放
      1.6 作用域
      1.6.1 生存期
      1.6.2 全局和局部变量
      1.7 多文件结构
      本章 小结
      思考与练习
      第2章 面向对象程序设计概述
      2.1 面向对象程序设计的基本概念
      2.1.1 面向对象方法的产生
      2.1.2 面向对象方法的方法与结构
      2.1.3 类和对象的概念
      2.1.4 消息与事件的概念
      2.2 面向对象程序设计的特点
      2.2.1 抽象性
      2.2.2 封装性
      2.2.3 继承性
      2.2.4 多态性
      2.3 面向对象的软件开发
      2.3.1 面向对象分析
      2.3.2 面向对象设计
      2.3.3 面向对象实现
      2.3.4 面向对象测试
      2.3.5 面向对象软件维护
      本章 小结
      思考与练习
      ……
    展开全文
  • 面向对象程序设计语言和面向过程程序设计语言的区别由哪些? 面向对象的特点是:封装,继承,多态,其中多态又分为重载和重写,面向对象的编程思想更接近现实的事物 面向对象的优点:  1.编程更加容易,因为面向...

    面向对象程序设计语言和面向过程程序设计语言的区别由哪些?

    面向对象的特点是:封装,继承,多态,其中多态又分为重载和重写,面向对象的编程思想更接近现实的事物

    面向对象的优点:
        1.编程更加容易,因为面向对象更接近于现实,所以你可以从现实的东西出发,进行适当的抽象
        2.在软件工程上,面向对向可以使工程更加模块化,实现更低的耦合和更高的内聚
        3.在设计模式上(似乎只有面向对象才涉及到设计模式),面向对象更好的实现开闭原则,也使代码更容易阅读
    相对而言,面向过程的程序设计是面向对象程序设计的基础,面向对象的程序设计里面一定会有面向过程的程序片断

    面向对象的编程(ObjectOrientedProgramming,oop面向对象程序设计)是一种计算机编程架构,oop的一条基本原则
    是计算机程序是由单个能够起到子程序作用的单元或者对象组合而成的。oop达到了软件工程的三个主要目标:重用性,
    灵活性和扩展性,为了实现整个运算,每个对象都能狗接收信息,处理信息和向其他对象发送信息。oop主要由以下的概
    念和组件

    面向过程就是分析出解决问题所以需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用
    就可以了,面向对象是把构成问题的事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个
    事物在整个解决问题的步骤中的行为。
    举例:例如五子棋,面向过程的设计思想就是首先分析问题的步骤:
    1.开始游戏 2.黑子先走 3.绘制画面 4.判断输赢 5.轮到白子 6.绘制画面 7.判断输赢 8返回步骤2 9.输出最后结果
    把上面的每个步骤分别用函数实现,问题就解决了

    而面向对象的设计则是从另外的思路来解决问题,整个五子棋可以分为:
    1.黑白双方这两方的行为是一模一样的
    2.棋盘系统,负责绘制画面
    3.规则系统,负责判断诸如犯规,输赢等

    展开全文
  • 面向对象程序设计概念

    千次阅读 2019-09-26 17:03:28
      面向对象程序设计(object-oriented programming,OOP)是一种新的程序设计的范型。程序设计范型是设计程序的规范、模型和风格,它是一类程序设计语言的基础。 面向对象设计范型的主要特征是:  程序=对象+...

    一. 程序设计范型

      面向对象程序设计(object-oriented programming,OOP)是一种新的程序设计的范型。程序设计范型是设计程序的规范、模型和风格,它是一类程序设计语言的基础。
    面向对象设计范型的主要特征是:

     程序=对象+消息

      面向对象程序的基本元素是对象。面向对象程序的主要结构特点是:一、程序一般由类的定义和类的使用两部分组成;二、程序中的一切操作都是向对象发送消息来实现的,对象收到消息后,启动有关方法完成相应的操作。
      需要说明的是,某一种程序设计语言不一定与一种程序设计范型相对应。实际上具有两种或多种范型特征的程序设计语言,即混合型语言。例如,C++就不是纯粹的面向对象程序设计范型的语言,而是具有面向过程程序设计范型和面向对象设计范型的混合性设计语言。

    二. 面向对象程序设计的基本概念

    1. 对象
     现实中的对象,具有以下特征:

    1. 每个对象必须有一个名字以区别其他对象;
    2. 用属性来描述对象的耨些特征;
    3. 有一组操作,每一组操作决定对象的一种行为;
    4. 对象的行为可以分为两类:一类作用于自身的行为,另一类作用与其他对象的行为。

    2. 类
      类是一组具有相同属性和行为的对象的抽象。类与对象之间的关系是抽象与具体的关系。类是对多个对象进行综合抽象的结果。

    3. 消息与方法
      面向对象程序设计中,对象之间也需要联系,称为对象的交互。面向对象程序设计技术必须提供一种机制允许一个对象与另一个对象的交互。这种机制称为消息传递。
      对象所能实现的行为(操作),在程序设计方法中称为方法。它们是通过调用相应的函数来实现的,在C++语言中方法是通过成员函数来实现的。方法包括界面和方法体两部分。方法的界面给出了方法名和调用协议(相对于C++中的成员函数的函数名和参数表);方法体则是实现某种操作的一系列计算步骤,也就是一段程序(相对于C++中成员函数的函数体)。

    三. 面向对象程序设计的基本特征

    1. 抽象
      抽象是通过特定的实例(对象)抽取共同性质后形成概念的过程。面向对象程序设计中的抽象包括两个方面:数据抽象和代码抽象(或称为行为抽象)。前者描述某类对象的属性或状态,也就是此类对象区别于彼类对象的特征物理量:后者描述了某类对象的共同行为特征或具有的共同功能。对于一组具有相同属性和行为的对象,可以抽象成一种类型,在C++中,这种类型就称为类(class),类是对象的抽象,而对象是类的实例。
      抽象在系统分析、系统设计以及程序设计的发展中一直起着重要的作用。在面向对象程序设计方法中,对一个具体问题的抽象分析的结果,是通过类来描述和实现的。

    2. 封装
      在现实世界中,所谓封装就是把某个事物包围起来,使外界不知道该事物的具体内容。在面向对象程序设计中,封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐蔽对象的内部细节。对象好像是一个不透明的黑盒子.表示对象属性的数据和实现各个操作的代码都被封装在黑盒子里,从外面是看不见的,更不能从外面直接访问或修改这些数据及代码。使用一个对象的时候,只需知道它向外界提供的接口而无需知道它的数据结构细节和实现操作的算法。
      C++对象中的函数名就是对象的对外接口,外界可以通过函数名来调用这些函数来实现某些行为(功能)。封装的好处是可以将对象的使用者与设计者分开,大大降低了人们操作对象的复杂度。使用者不必知道对象行为实现的细节,只需要使用设计者提供的接口的功能即可自由地操作对象。封装的结果实际上隐藏了复杂性,并提供了代码重用性,从而减轻了开发软件系统的难度。
      封装是面向对象程序设计方法的一个重要特性,封装具有两方面的含义:一是将有的数据和操作代码封装在一个对象中,各个对象相对独立、互不干扰;二是将对象中某此据与操作代码对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界消息,这种对外界隐蔽的做法称为信息隐蔽。信息隐蔽有利于数据安全,防止无关人员访和修改数据。

    3. 继承
      继承是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。 从继承源上分,继承又分为单继承和多继承。

    4. 多态
      面向对象系统的多态性是指不同的对象收到相同的消息时执行不同的操作。
      C++语言支持两种多态性即编译时的多 态性和运行时的多态性。 编译时的多态性是通过函数重载(包括运算符重载)来实现的,运行时的多态性是通过虚函数来实现的。
      多态性增强了软件的灵活性和重用性,为软件的开发与维护提供了极大的便利。尤其是采用了虚函数和动态联编机制后,允许用户以更为明确、易懂的方式建立通用的软件。

    展开全文
  • Java面向对象程序设计

    2019-06-09 10:17:55
    Java面向对象程序设计 现实世界存在各种各样的对象,对象具有特定的属性和行为,对象之间相互作用。 面向对象是人们认识世界的一种直观方法,人们通过认识特定问题领域的一个一个对象,抽象形成类,采用面向...

     Java面向对象程序设计

     

    oop

    现实世界存在各种各样的对象,对象具有特定的属性和行为,对象之间相互作用。 面向对象是人们认识世界的一种直观方法,人们通过认识特定问题领域的一个一个对象,抽象形成类,采用面向对象程序设计方法设计类(封装特定的属性和行为),并生成对象,实现对象之间的交互。 面向对象的特性:封装、继承、多态。

    Java语言是一种完全的面向对象程序设计语言,所有的数据类型都是用类描述的。 Java程序也是由若干个类组成的,类是Java语言的核心。 类是对象的模板,只有实例化成为对象后才可以使用。 对象是类的实例。

    面向对象程序设计的一个特性就是封装。 将实体特征的属性隐藏起来,对象与外界仅通过公共方法进行交流,这样可以提高程序的可靠性、安全性,改善程序的可维护性。

    数据的隐藏与开放对外的接口可以通过访问权限控制符来实现,权限控制符可以用来设置类、成员变量、成员方法等的访问权限。 Java提供public、protected、private、默认等4种访问控制符,在类、成员变量、成员方法的前面均可以使用访问控制符关键字,没有显式使用的为默认控制类型。

    现实世界中存在很多一般与特殊的现象。 子类继承父类,父类派生子类,子类还可以派生子类,这样就形成了类的层次结构。 继承机制是实现软件可重用的根基,也是提高软件系统的可扩展性与可维护性的主要途径。

    展开全文
  • 面向过程程序设计与面向对象程序设计有何不同? 面向过程的程序设计 面向过程的程序设计的核心是过程(流水线式思维), 过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理...
  • 一.结构化程序设计//面向过程...在较大规模的程序设计中,结构化程序设计将变得难以重用,难以修改,此时更适合面向对象程序设计。 二.面向对象程序设计 面向对象程序设计有抽象,封装,继承,多态的特点。 1.将...
  • 面向对象程序设计的基本概念

    千次阅读 多人点赞 2021-01-31 17:03:44
    1.基本术语 (1) 对象和对象类   对象是代码和数据的...类是面向对象程序设计的核心技术,可以理解成一种定义了对象行为和外观的模板;把对象看作是类的原原本本的复制品,类具有继承性、封装性、多态性、抽象性。  
  • Python中的面向对象程序设计

    千次阅读 多人点赞 2019-05-07 23:08:31
    面向对象程序设计 面向对象程序设计是在面向过程程序设计的基础上发展而来的,它比面向编程具有更强的灵活性和扩展性,本次学习需要了解以下内容; ①了解什么是面向对象; ②掌握如何定义和使用类; ③掌握如何创建...
  • 文章目录面向对象程序设计(简称oop)类封装(encapsulation有时称为数据隐藏)对象日历举例 面向对象程序设计(简称oop) 面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。 ...
  • 面向对象程序设计总结

    千次阅读 2019-03-24 17:18:54
    C++面向对象程序设计总结 一.复合类型 1.1.指针和引用 (1) .程序中定义的变量会被分配一定的内存单元,当需要存取这个变量的值时,可以通过变量的名字访问这块内存。除了通过名字直接访问变量的内存单元,也可以...
  • 面向对象程序设计步骤

    千次阅读 2017-08-21 10:03:09
    面向对象程序设计的第一步,就是在问题领域中识别出有效的对象,然后从识别出的对象中抽象出类来。面对纷繁复杂的现实问题,往往存在多种对象划分的方式,而不同的划分会带来类的设计以至于程序结构的各种不同。对象...
  • python面向对象程序设计

    千次阅读 2016-04-28 19:51:53
    python3 面向对象程序设计 寻找GPA最高的学生
  • 什么是面向对象程序设计

    万次阅读 多人点赞 2019-08-22 11:10:04
    1.面向对象和面向过程区别→2.什么是对象→3.什么是消息→4.什么是封装→5....面向过程程序设计:所谓的面向过程程序设计就是函数的定义和调用。简单地说,过程就是程序执行某项操作的一段代码,函...
  • 面向对象程序设计基础总结

    千次阅读 2017-05-11 19:58:15
    面向对象程序设计java基础总结
  • 面向对象程序设计:通过对象的属性和行为描述对象。类定义了同类对象的公共属性和行为。类 = 数据结构 + 对数据进行操作的函数 OOP:把复杂的系统分解成多个更小的对象组成。这些对象可在其他程
  • 面向对象程序设计  《C#程序设计基础入门教程》是面向计算机相关专业的一门专业基础课,涉及计算机体系结构、面向对象编程、文件操作、WinForm基础以及程序设计等内容,通过本课程的学习,学生能够了解 C#语言特征...
  • 面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体...
  • 面向对象程序设计心得

    千次阅读 2019-06-17 11:52:48
    面向对象程序设计心得 其实我认为一句话便可以描述出很多,那就是代码是滚雪球一步一步滚出来的,而不是应该与之相反的。 这句话让我感触很深的地方时当时做的一个搜索,因为大多复制,黏贴,所以并没有进行全部的...
  • 经过2周的面向对象程序设计的学习,我深有感触,发现Java对我们专业发展发挥的重要作用,它涉及多个领域,是我们未来成为优秀的程序员必备的装备。 我们面向对象程序设计课刚上来就是尝试编辑一个类似于qq一样的...
  • 面向对象程序设计 C++大作业

    千次阅读 多人点赞 2018-09-16 19:04:34
    面向对象程序设计 C++大作业 题目:C++通信录 专业:计算机科学与技术 班级:信息A1611 组号:第一小组 内容: (1)输入信息; (2)显示信息; (3)删除记录; (4)查询、修改记录; (5...
  • 实验9 面向对象程序设计方法

    千次阅读 2020-06-16 11:36:29
    4、掌握面向对象程序设计的应用方法 二、 实验内容 1、写出程序的运行结果: 2、写出程序的运行结果: 3、定义一个 Circle 类,根据圆的半径求周长和面积。再由 Circle 类创建两个圆对象,其半径分别为 5 和 10,...
  • C++面向对象程序设计 学习心得

    千次阅读 2019-06-23 17:19:45
    C++面向对象程序设计 学习心得: 这学期学了C++面向对象程序设计,通过成绩单处理,ATM,通讯录,图书管理系统这几个简单系统,慢慢地对系统的设计有了一个初步的认识。 简单说一下设计系统具体的过程以及一些注意...
  • 【C++】面向对象程序设计

    千次阅读 2016-09-18 15:50:17
    面向对象程序设计 对象 面向对象的特征 封装 继承 多态
  • 面向对象程序设计(Java语言描述)测试题6,About~Object
  • 名词解释一、抽象封装消息抽象:面向对象...消息:消息是面向对象程序设计用来描述对象之间通信的机制。一个消息就是一个对象要求另一个对象实施某种操作的一个请求。二、填空题(I) 目前有面向过程的结构化程序设...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,242
精华内容 22,496
关键字:

面向对象程序设计