在编程思维系列中谈到了类。类是面向编程中很重要的一个概念。面向对象在软件领域影响很大,面向对象更是一种思想。这种思想也放大到其他领域。
面向对象编程历史面向对象编程概念是在 20 世纪 50 年代末和 1960 年代初 MIT 提出 。被称为面向对象编程之父的 Alan Kay 将面向对象概念与更传统的抽象数据类型对象概念第一次区分开来。
麻省理工学院的另一个早期例子是 Ivan Sutherland 在 1960-1961 年创建的 Sketchpad ;在他1963 年技术报告关于画板的论文的的术语表中定义了“对象”和“实例”的概念。
面向对象程序设计的雏形,最早出现在1960年代的 Simula 语言中。当时的程序设计领域正面临着一种危机,在软硬件环境逐渐复杂的情况下,软件如何良好的维护?面向对象程序设计在某种程度上通过强调可复用性解决了这一问题。
20世纪70年代的 Smalltalk 语言在面向对象方面堪称经典——以至于 30 年后的今天依然将这一语言视为面向对象语言的基础。( Smalltalk 编程语言的第一个版本由Alan Kay、Dan Ingalls和Adele Goldberg在Xerox PARC开发)。
1986年,计算机协会组织了第一届面向对象编程、系统、语言和应用程序会议(OOPSLA),当时出乎意料地有1000 人参加。
在 20 世纪 80 年代中期,Brad Cox 开发了Objective-C,他曾在 ITT Inc. 使用 Smalltalk 。Bjarne Stroustrup在他的博士论文中使用了 Simula,创建了面向对象的 C 。
在 20 世纪 90 年代初期和中期,支持面向对象编程技术的编程语言变得越来广泛,面向对象编程成为了最主要的编程范例。
面向对象编程思想通常面向对象编程(Object-oriented programming,缩写:OOP)) 被理解为一种将程序分解为封装数据及相关操作的模块而进行的编程方式。有别于其它编程方式,在OOP编程中,对数据类型相关的一系列操作都被有机地封装到该数据类型当中,而非分散于其外地方,因而 OOP 中的数据类型不仅有着状态,还有着相关的行为。
面向对象编程语言和面向对象实践实践相结合也创造出了新的一个编程架构。因而面向对象程序设计,同时也是一种程序开发的抽象方针。它包含数据、特性、代码与方法。对象是是类(class)的实例,是程序的基本单元,它将程序和数据封装其中,这样提高软件的重用性、灵活性和扩展性。在面向对象程序编程里,程序会被设计成彼此相关的对象。因而面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反。
传统的程序设计主张将程序看作一系列函数的集合,或者一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接收数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”。面向对象程序设计提高了程序的灵活性和可维护性,并且在大型项目设计中广为应用。此外,大多数学习者认为面向对象程序设计要比以往的程序更便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。
总之,当我们提到面向对象的时候,它不仅指一种程序设计方法。它更是一种程序开发方式。
批评声音1、OOP 并没有达到理想中可重用性和模块化的目标,经常由于过分强调软件设计和建模(数据/对象)而牺牲了其他重要方面,例如如何设计计算和算法。
2、OOP代码比过程代码“本质上效率更低”,OOP 需要更长的编译时间;OOP语言在类扩展和修改方面不够灵活。
效率方面,这一条目前已经很难证明了。
3、面向对象语言通常带许多隐式环境。例如你想要一根香蕉,但你得到的却是一只拿着香蕉的大猩猩和整个丛林。
面向对象的分析和设计面向对象的分析和设计(OOAD Object-oriented Analysis and Design)是一种通过应用面向对象编程来分析和设计应用程序、系统或业务的技术方法。在整个软件开发过程中使用可视化建模,用简洁明了的模型来指导利益相关者沟通和提升产品质量。
现代软件工程中的 OOAD 通常以迭代和增量的方式进行。OOAD活动的输出分别是分析模型(对应OOA)和设计模型(对应 OOD)。这种思想旨在让软件工程在风险和商业价值等关键因素的驱动下不断完善和发展。
面向对象分析计算机应用程序最终必须在现实世界中有用,因而对现实世界(应用程序部分)进行建模一直是计算机科学多个领域的主要关注点。软件生命周期中任何分析活动本质是为对现实功能的模拟,更好呈现出效果。
面向对象分析与其他形式的分析的主要区别:面向对象围绕对象组织需求,是根据系统在现实中的交互,对对象的行为(过程)和状态(数据)的建模。
面向对象分析之前,其他系统分析实践的特点是混合了不同的建模技术,如数据流图、ER 图、状态转换图等。这些技术用于软件之前分阶段建模,系统实际搭建完成后,这些技术通常对构建需求模型没有多大帮助,不容易于理解、可扩展性差。
举个例子,要造个汽车,之前建模方式,分析汽车组成,对不同部分,用不同的方式。导致一台汽车,只能一家厂家自己生产,因为只有自己知道需要如何的轮胎,如何的发动机。而面向对象,汽车作为对象,轮胎、发动机只是其中一个属性,这个对象确定轮胎的大小和发动机的功率。这样促成了流水线和分工。
OOA 技术提供了一个连贯的框架,定义了系统的数据、行为。OOA 技术强调两种结构化机制:泛化和聚合,建模者可以根据这两种机制组织和管理模型,形成了一套全面的建模概念。这种思想影响很深,从软件领域到其他领域。
面向对象设计面向对象设计 (OOD ) 则是开发人员实现面向对象分析中生成的概念模型。分析模型对应于技术中概念被映射到程序中就是类和接口等,再通过应用架构模式和设计模式结合面向对象的设计原则设计出软件架构,从而形成解决方案。
面向对象建模面向对象建模 (OOM Object-Oriented Modeling) 是在整个开发生命周期中使用面向对象范例对应用程序、系统和业务领域进行建模。是现代软件工程中 OOD 和 OOA 活动中最主要技术。
OOM 主要分为两个方面,动态行为(如业务流程和用例)的建模,以及静态结构(如类和组件)的建模。
OOA 和 OOD 是 OOM 过程中两个不同的抽象层次(即分析层次和设计层次)。
统一建模语言(UML)和 SysML是用于面向对象建模的两种流行的国际标准语言。
OOM 有两大好处:
1、有利于沟通,相比文档,可视化模型图更容易理解。
2、是一种很有用的抽象,面向对象建模将系统需求和设计的抽象定义为基本结构和行为(如流程和对象),对具体功能和复杂源代码的做了更高级别的抽象。
面向对象的需求分析面向对象的思想也影响了需求分析领域,从而出现面向对象需求分析(Object-oriented requirements analysis)。
传统的需求分析:
数据流图分析:通过数据流图来描述和分析系统的数据流动和处理过程,帮助识别数据的输入、输出和转换过程。
标记需求分析:使用标记、关键词和关键短语来识别和提取用户需求,并进行分类和整理。
原型法分析:通过构建原型来验证和评估用户需求,以便更好地理解和捕捉需求细节。
在面向对象的需求分析中,我们通过对象对现实世界的实体进行建模。通过创建不同类型的对象模型,确定对象类如何相互关联、对象如何聚合,以及如何形成其他对象、对象如何与其他对象交互等等。
通常的步骤:
1、识别对象,即对现实世界物体模拟;
2、识别用例,是现实世界物体的各种行为总结;
3、定义类,根据对象的属性和行为进行分类;
4、建立对象关系,通过类之间的关系,建立对象之间的交互和依赖。
5、约束条件,识别和建立系统中各种约束条件,比如现实物体有那些行为约束。
这些步骤中,识别对象和对象类的分析过程被认为是面向对象需求分析中最困难的环节,不过也有不少方法,比如基于自然语言对对象描述,名词性质的为对象和属性,动词就是行为和操作;比如基于场景的分析,识别和分析系统使用的各种场景。基于每个场景识别所需的对象、属性和操作。有一种称为 CRC 卡的分析方法,其中分析师和设计人员扮演对象的角色,可以有效地支持这种基于场景的方法。
在需求分析中是一项复杂活动,我们经常发现无论使用那种方式,系统的最终用户对模型总有难以理解的部分。因而正应该做的是根据情况灵活使用不同的方式。
面向对象的管理面向对象管理(Object Oriented Management)的目标是在一个框架中提供一套清晰的原则,使所有参与者都能够使用,以便最大限度地减少管理开销。
面向对象的管理集成了敏捷和精益等方法论,例如授权团队、小而快速的工作迭代。它还应用了帕累托原理以及从对象和代理角度看待所有活动的观点,其中代理作用于处理对象的相互交互。
这部分资料还比较少,但也说明面向对象的思想已经延伸到各个领域。面向对象思想起源于编程领域,然后再软件的各个阶段扩展,形成大量实践后,开始在其他行业使用。软件作为一个相对新型的领域,软件工程发展,吸收了其他行业不同的经验和思想,而面向对象思想,则是软件领域对其他领域的一个反哺。
随着软件世界发展,将有更多的思想从软件领域产生。例如敏捷思想影响了美国海军陆战队,详细信息可以看《赋能》。