面向对象的编程:使复杂的概念变得简单

披露: 您的支持有助于保持网站的正常运行!我们会为此页面上推荐的某些服务收取推荐费.


面向对象(OO)编程是一种编程范式,它包括或依赖于对象的概念,具有属性和功能并与其他对象进行交互的封装数据结构.

程序中的对象经常代表真实世界的对象-例如,电子商务网站应用程序可能具有Customer对象,Shopping_cart对象和Product对象。其他对象可能与现实世界中的对象松散相关,例如Payment_processor或Login_form。许多其他对象使用应用程序逻辑,并且没有直接的真实世界并行对象,这些对象管理身份验证,模板,请求处理或工作中的应用程序所需的其他任何众多功能.

面向对象编程

面向对象编程的历史

如果看起来面向对象的编程特别适合于对现实世界的系统进行建模,那么这并不是巧合。现在与面向对象编程相关的概念(包括用于描述它的大多数语言)起源于用于模拟现实世界系统的Simula编程语言。 1967年,将类,子类和对象添加到Simula中.

1970年代,艾伦·凯(Alan Kay)在研究Smalltalk时创造了“面向对象”一词。这是指对象在语言中的广泛使用以及它们作为组织基本单位的位置.

最初,面向对象编程的传播相对较慢。 Common Lisp在1970年代后期引入了Common Lisp对象系统,并向Lisp添加了对象。在1980年代,发明了完全面向对象的Eiffel编程语言。 Eiffel的发明者Bertrand Meyer编写了《面向对象的软件构造》,这是最早广泛传播OO编程概念的书籍之一。.

在1990年代和2000年代,面向对象的编程真正兴起。恰逢此期间,整个技术行业出现了大规模爆炸,而程序员突然涌入了大型技术公司。正如其倡导者所倡导的那样,面向对象编程的卖点之一是关注点的分离和松散的耦合(请参阅下文)使团队能够更有效地在大型系统上工作。.

到21世纪前十年末,面向对象的编程已成为开发大多数软件的公认“正确方法”。较新的编程语言(尤其是动态类型的解释型语言,如Python,Ruby和JavaScript)倾向于采用甚至实施面向对象的方法。同时,许多较旧的语言(例如Fortran和COBOL)都添加了面向对象的功能.

重要的面向对象概念

面向对象的程序设计是一个概念—一种解决设计计算机程序问题的方法。它不是一成不变的规则或特定的方法。不同的编程语言对OOP的处理方式也不同。有些或多或少严格,有些则不同。以下是面向对象设计概念的概述。请参阅我们的姊妹文章“面向对象编程”以获取资源和详细信息,这些资源和详细信息解释了如何以许多不同的语言实现这些概念。.

关注点分离

指导面向对象编程中所有其他概念的中心指导原则是关注点分离。这是一个想法,逻辑上不同的数据和功能束应分为不同的应用程序代码束.

这个想法并不是面向对象编程所独有的。大多数编程语言都允许分离关注点,并且大多数编程范例都将其分离。但是,关注点分离对于面向对象的编程特别重要。关注点之间的强烈分离是几乎所有其他面向对象概念的推动力.

对象和类

首先,似乎面向对象编程中的基本概念是对象。从某种意义上说,这是真的。但是从开发人员的角度来看,基本的关注点是类.

一个类定义一个对象;对象实例化一个类。例如,让我们继续考虑一个电子商务网站。有很多客户,但是他们都做同样的事情。因此,会有一个Customer类,程序员在其中定义了什么是客户及其工作方式。然后,系统中的每个单独客户都由一个客户对象表示.

由于类定义指定了所有实现细节,因此开发面向对象程序的大部分工作都涉及使用类,而不是对象。.

古典和非古典OO语言

少数语言结合了许多面向对象的概念,但没有专门称为类的构造。最著名的是JavaScript,它使用原型或随后被克隆的通用对象。术语,基本原理,甚至“幕后”实现都不同,但是开发人员的经验基本相同.

代表大多数OO语言的带有类的语言有时被称为“经典”。这既是对“类”一词的双关语,又是对类已成为面向对象编程的常规方法的认可.

方法和性质

对象具有变量,在大多数语言中,这些变量通常称为属性或属性。例如,一个Customer对象可能具有诸如shipping_address或name之类的属性。.

对象也具有称为方法的功能。这些是对象能够执行的操作,并且也在类中定义。例如,客户对象可能具有用于签出,change_shipping_address或注销的方法.

开发良好的面向对象程序的挑战之一是确定如何在几个潜在的类之间划分功能。例如,结帐方法应该属于客户还是属于购物车?客户是否拥有注销方法,还是客户调用了某些Authentication_manager对象的注销方法??

许多新的OO程序员面临的另一个挑战是了解如何设计不代表现实世界的类。了解电子商务需要产品和项目管理系统需要项目非常容易。但是大型的面向对象程序具有无数的类,它们定义了各种抽象的功能束,例如对象关系映射器,对象工厂和控制器(仅举三个易于理解的示例).

解决这些问题需要实践。理解设计模式以及包括建模在内的开发过程也可以帮助面向对象的开发人员.

这里有一些资源可以帮助您更好地理解类,属性和方法:

  • 类,对象,属性和方法概念是这些概念的10分钟精彩视频概述。
  • .NET教程是在属性和方法之间选择,涵盖了适用于任何语言的一些设计注意事项;
  • 了解C#中的类,方法和属性可提供很好的解释,并提供一些有用的图表.

消息传递和动态调度

类以及此处涵盖的许多其他概念已经与面向对象的编程紧密地联系在一起。但是,根据创造该术语的计算机科学家的说法,面向对象的编程与消息传递有关.

消息传递意味着对象通过发送消息相互通信。这听起来很琐碎,但会影响函数调用的方式。一个对象会直接向另一个对象传递消息,而不是一个对象直接调用另一个对象的功能。该消息包含方法名称和任何关联的参数。然后,被调用的对象便具有处理该方法调用的能力,但是需要.

每个对象根据需要确定自己对方法调用的响应的能力称为动态调度。它允许对象随运行时间演化,并根据其当前状态响应消息.

消息传递可能会有些混乱,尤其是因为当今使用的大多数语言仅实现一种特定类型(方法调用)。这里有一些资源可以帮助您更好地理解它:

  • 有人问OO中传递的消息是什么?在StackExchange上;随后是一些非常有用的答案;
  • 另请参阅Smalltalk中的OO与Java之间的主要区别是什么?对消息传递如何从最初的想法变为现在在现代语言中主要起作用的方式有所了解;
  • c2 Wiki上的消息传递有详细的(如果有些混乱)解释.

封装形式

封装的概念与消息传递和动态调度密切相关。封装意味着对象外部的代码无法直接访问其内部数据。例如,如果一个对象需要“知道”另一个对象的属性(例如,Shipping_manager可能需要Customer对象的shipping_address),那么调用对象将无法直接找到该数据;它必须传递一条“询问” Customer对象的消息,然后该消息返回所需的数据。 (通常通过方法调用来完成。)

并非所有面向对象的语言都执行严格的封装。有些允许直接访问(获取和设置)对象的属性。但是,许多面向对象开发的专家鼓励程序员遵守封装原理(通过不直接调用属性),即使使用允许它的语言也是如此。.

封装有很多好处。首先,它允许从调用该属性的位置抽象出任何细节或副作用。例如,每次读取特定值时,您可能希望检查上一次计算该值的时间,如果满足某些条件,则重新计算该值。能够在一个地方随时添加,删除或更改该逻辑,而不会影响进行调用的代码中的其他任何地方,这是封装的好处.

继承与构成

继承和组合是各种类(及其实例化对象)相互关联的两种方式.

继承描述“是”关系:用户是人;用户是人。客户是用户。在此示例中,可能存在一个Person类,该类通常定义Person的所有属性和方法(名称,生日)。然后,User类将扩展Person类,以添加诸如username属性或login和logout方法之类的东西。然后,客户类可以扩展用户,添加仅客户需要的那些东西,例如order_history或billing_address.

当一个对象“拥有”另一个对象时,构图描述了一种“具有”关系。例如,Customer类可能拥有Billing_address,它本身是在类中定义的完整对象。像继承层次结构一样,组成层次结构可以很容易地深入到几层。例如:一个客户可能有一个Shopping_cart,该Shopping_cart有多个产品,每个产品都有一个供应商,依此类推。.

面向对象开发中的许多设计工作都与映射继承和组成的这些关系有关。类图是统一建模语言的一部分,是可视化这些关系的宝贵工具.

  • 继承与构成:您应该选择哪一个?在构建compex类层次结构时要考虑一些设计注意事项;
  • 组成与继承:如何选择?涵盖相同的问题,但角度不同且幽默得多;
  • Kirk Knoernschild撰写的Java Design:Objects,UML和Process在第一章中包括“复合重用原理”一节,解释了为什么即使继承似乎正确,有时组合还是更好的原因.

多态性

多态性(或更具体地讲,子类型多态性)是自然而然地继承而来的一个概念。如果父类(或“超类”)具有特定的方法,则其所有子类(“子类”)也将具有该方法。每个子类可能会以不同的方式实现该方法,但是调用对象不需要知道它们正在调用几种子类型中的哪一种。他们可以将对象的所有不同子类型视为等效.

多态性是一个大课题,并非没有争议。这里有一些资源可以帮助您解决问题:

  • Java中的多态—方法重载和重载是对多态的简要介绍;
  • 面向对象的编程概念:多态和接口特别是关于ActionScript的,但是提供了许多有关该主题的详细信息,包括各种问题和局限性。
  • 多态性-C ++中的面向对象编程是一个很好的视频说明;
  • Liskov替代原则(PDF)可以帮助您理解分型.

了解有关面向对象编程的更多信息

为了深入了解面向对象的程序设计,许多有关该主题的经典和现代书籍都是无价的,并且几乎不能用在线教程替代.

  • 设计模式:Gamma等人的《可重复使用的面向对象软件的元素》是一本经典的书,向主流开发人员介绍了面向对象的程序。它仍然是必读的;
  • Booch等人的面向对象的分析和设计与应用程序,不仅仅编写OO代码,而是深入到OOP移动的实质,即系统的分析和设计。
  • Matt Weisfeld的《面向对象的思维过程》是一本很好的书,对于熟练于过程或函数式编程的开发人员来说,他们需要将其思维方式重新训练为对象和类。
  • Keogh和Giannini撰写的OOP Demystified提供了有关在现实世界中应用程序开发中的OOP的教程,重点是应用面向对象的分析和设计过程所需的技能和思想;
  • Bertrand Meyer的《面向对象软件构造》是一本关于OO的经典书籍,是第一本介绍概念基础的技术和哲学的书。本书中的某些材料看似过时了,但基本原理仍然有意义。
  • 解释的设计模式:Shalloway和Trott撰写的《面向对象设计的新视角》是最重要的书,它推进了设计模式的实践或解决重复出现的问题的可重用策略。
  • Coad,North和Mayfield撰写的《对象模型:策略,模式和应用程序》是《 Design Patterns Explained》的很好的伴侣,为面向对象编程提供了许多其他模式和策略。.

为了更实际,更现代地了解面向对象的编程概念,请尝试以下一种或多种在线资源:

  • 快速学习面向对象编程是Mozilla开发人员网络上基于Python的教程;
  • 面向对象编程概念是Oracle的教程,从Java的角度介绍了面向对象的编程基础。
  • 面向对象的编程教程对核心概念进行了语言不可知的介绍。
  • 面向对象的编程概念及更多内容的简介对面向对象的编程进行了很好的概述,同时也涉及了几个紧密相关的主题,例如软件体系结构和设计模式。
  • 回顾一下Codecademy的面向对象编程,它使用JavaScript和浏览器内编辑器使您可以立即使用这些概念(但请记住,JavaScript在实现OOP概念方面有些不同);
  • 面向对象的编程基础知识是另一个Java资源,其中包含许多有关真实类的有用示例.

重要的面向对象语言

并非所有的编程语言都支持面向对象的编程。某些语言只支持OOP。其他允许各种编程方法。还有一些似乎是面向对象的,但是以非标准,不完整或只是普通的异常方式实现了面向对象的概念.

以下是一些较流行的可支持OO的语言的列表,并附有有关其面向对象方法的说明,以及一些资源来帮助您使用该语言进行OOP.

互联网上充斥着着眼于X语言和Y语言的文章-其中大部分只是表面文章。我们建议您查看此更一般的编程语言比较。这项周到的分析着眼于几种流行的OO语言的具体细节,讨论了每种OO概念如何实现。.

基于C的语言

C不是一种面向对象的语言。但是,至少可以在其中编写OO代码:

  • 使用ANSI-C进行面向对象的编程(PDF)
  • 菲尔面向对象的ANSI C指南
  • C语言中的面向对象编程.

这些书籍和文章中描述的技术对于非琐事程序来说都不是特别可靠或易于处理的技术。与其尝试将C扩展到极限,不如它是C的三个直接后代,其中包括面向对象的语言工具.

C++

C ++是多范例的,这意味着它支持几种不同的编程方法(PDF),包括面向对象。它基于C,并且专门开发为增加对OOP的类概念的支持.

  • C ++中的面向对象编程(OOP):计算机科学教授的出色入门指南
  • 学习C ++中的面向对象程序设计:有关OOP的大型,多部分教程
  • C ++教程20-1 —类和面向对象的编程:有关C ++的大型视频系列的一部分,本节内容开始介绍OOP概念
  • 使用C进行面向对象编程的简介++
  • C语言中的面向对象编程++.

C#

C#(“ C锋利”)是另一种C派生词,主要用于对Microsoft .NET Framework中使用的C ++进行改进。.

  • C#中的面向对象编程
  • 面向C#的面向对象编程基础(视频)
  • C#OOPS概念(视频)
  • C#中的面向对象编程基础:PLuralsight的高级教程(提供免费试用版)
  • C#中的面向对象编程概念简介:涵盖了C#中的抽象,封装,继承和多态性
  • C#.NET中带有示例的十大OOPS概念:如果您已经了解OOP概念,那么这将是您快速掌握C#的快速指南
  • 学习C#:如何掌握面向对象的编程语言:总体而言,如何最好地学习C#和OOP的高层概述
  • 开始C#面向对象编程.

目标C

Objective-C的开发与C ++大约在同一时间进行,并且目标基本相同,即向C添加OOP功能。今天,Objective-C实际上仅用于Apple的OS X和iOS的Cocoa开发平台以及GNUstep,开源替代品.

  • 使用Objective-C进行面向对象的编程
  • 面向对象设计简介
  • 面向对象的程序设计和Objective-C语言(PDF)
  • 面向对象编程简介.

普通口齿不清

Lisp本质上不是面向对象的。但是,Common Lisp是最流行的Lisp方言之一,其中包括Common Osp Lisp Object System(CLOS),该系统提供OOP功能。.

CLOS中实现的面向对象的方法与其他语言中的OO处理方法完全不同。这意味着,如果您想学习一般的OO或以其他类型的语言应用OO,则CLOS并不是一个很好的起点。但是,如果您正在使用Lisp,则CLOS非常重要。此外,如果您对OOP特别感兴趣,则可以通过学习CLOS来以不同的眼光看待OO概念。.

  • CLOS基础
  • CLOS简要指南
  • Lisp通用对象系统:概述(PDF)
  • CLOS:集成面向对象和函数式编程(PDF)
  • COMMON LISP中的面向对象编程:CLOS程序员指南.

Erlang

根据一些常规的观点,Erlang不是一种面向对象的语言。但是,有一种引人入胜的少数派观点恰恰相反,它的支持者指出,Erlang是最面向对象的语言,甚至说Erlang是唯一真正的面向对象的语言。.

这其中的大部分也适用于Elixir。另一方面,也许这只是面向对象的风格,而不是真正的面向对象.

F#

F#(“ F尖锐”)是一种多范式语言。它的核心实际上是函数式编程,但是它包括对OO的支持,并试图调和这两种不同的编程方法.

  • “ F#中的面向对象编程”系列
  • F#快速指南:面向对象的编程
  • F#概述—命令式和面向对象的编程
  • 面向对象的F#-创建类
  • F#中的面向对象编程(PDF)
  • F#中没有类的OOP.

Fortran

Fortran是仍然最常用的最古老的编程语言。当它于1950年代发明时,就没有面向对象之类的东西。在该语言的Fortran 2003发行版中,Fortran添加了显式OOP支持。但是可以在语言的早期版本中实现一些基本的OOP概念.

  • 在Fortran面向对象之前,Fortran中的OOP:
    • Fortran 90中的伪面向对象样式
    • 通过Fortran 90进行面向对象的编程(PDF)
    • 使用Fortran90的面向对象概念简介.
  • 官方支持的Fortran中的OOP:
    • Fortran 2003中的面向对象编程
    • 实践中的现代Fortran
    • FORTRAN 2003中的科学编程:包括面向对象编程的教程(PDF).

Go是Google于2007年开发的一种相对较新的语言。关于Go是否是面向对象的,有很多讨论。.

Go中没有所谓的“对象”或“类”,但确实有一些类似的结构。从某种角度来看,您可以将Go视为面向对象.

实际上,许多人确实认为Go是OO:

  • 进行面向对象的设计
  • Go中的面向对象编程
  • Go中的面向对象语言模式
  • 进行面向对象的程序员或无对象的面向对象编程(视频)
  • 轻松编写Go中的面向对象程序设计总结.

爪哇

Java是从头开始构建的,是面向对象的。这里有一些很棒的资源可以帮助您使用Java:

  • 面向对象的系统设计:斯坦福大学CS108的网站,其中包含代码,讲义,讲义幻灯片的链接,以及您自己完成本课程所需的几乎所有内容
  • Java教程:面向对象的编程概念
  • Java编程教程面向对象编程(OOP)基础
  • 面向对象的编程概念(六个视频系列)
  • 面向对象编程— Java教程
  • Java基础教程:Java中的面向对象编程
  • Java中的面向对象编程
  • Java的面向对象编程基础(PDF).

的JavaScript

许多人不认为JavaScript确实是面向对象的。但是很多其他人认为这肯定是.

我们认为我们的工作是帮助您找到有用的资源,而不是参与无可争议的辩论。因此,这里有一些JavaScript的OOP资源:

  • 面向对象的JavaScript简介(Mozilla开发人员网络)
  • JavaScript:世界上最容易被误解的编程语言
  • JavaScript中的OOP:您需要了解的内容
  • 面向对象的JavaScript:创建可扩展,可重用的高质量JavaScript应用程序和库
  • 面向对象JavaScript的原理
  • 面向对象的JavaScript(视频).

的PHP

在版本4之前,PHP甚至都不支持基本的面向对象概念,并且直到PHP5才支持完整的面向对象.

  • 面向对象的PHP初学者
  • 适用于绝对初学者的面向对象的PHP
  • PHP中的面向对象编程原理
  • 面向对象的PHP(视频)
  • 面向对象的PHP:概念,技术和代码.

蟒蛇

Python代码不需要是面向对象的,但是该语言完全支持它。查看以下资源:

  • 面向对象程序设计:麻省理工学院开放课件中的Python形式的OOP简介
  • Python中的面向对象编程
  • 改善Python:Python类和面向对象的编程
  • Python课程:面向对象的编程
  • Python 3面向对象编程.

红宝石

在Ruby中,所有东西都是对象,甚至是“原始”数据类型,例如字符串和整数。通过对其中一个调用加法,可以将两个整数相加。您可以通过在其上调用length方法来找到字符串的长度.

  • Ruby用户指南:面向对象的思维
  • Ruby模块:Ruby编程语言的主要OOPs功能
  • Ruby中的实用面向对象设计.

短暂聊天

Smalltalk可能是最有影响力的面向对象语言,对后来出现的语言产生了深远的影响。结果,至少对其有所了解是一件好事。这些资源将帮助您入门:

  • 使用Smalltalk进行面向对象的编程(PDF)
  • Smalltalk和面向对象:简介(PDF)
  • Smalltalk:语言入门(视频)
  • 编程Smalltalk –从一开始就面向对象:编程原理简介.

另一方面…

如果您想成为一名全面的开发人员,那么了解任何概念的优缺点很重要。尽管面向对象已成为理解编程的主要方式,但仍然存在合理的批评,包括思想本身以及围绕它们的炒作文化。.

以下是向OOP提出反驳的一些资源:

  • 面向对象的编程是一场昂贵的灾难,必须结束
  • 面向对象的编程本来就有害
  • 面向对象的编程:一个灾难故事.

当今的面向对象编程

尽管面向对象编程在计算机编程中仍然是一种重要的方法,但它不再是“良好软件开发”的行业标准。其他范例,特别是函数式编程,以及支持它们的新语言也走在了最前列。同时,对面向对象编程以及设计模式运动的批评正在上升。.

尽管如此,今天编写的大量软件还是面向对象的。如果您使用任何常见的面向对象语言进行工作,则需要对基本的面向对象概念有很好的了解.

更有趣的东西

我们有更多与编码和开发有关的编程指南,教程和信息图:

  • C ++开发人员资源:除了有关C ++的信息外,还有更多有关面向对象编程的信息.
  • Linux编程简介和资源:尽管不专门针对面向对象的编程,但是对Linux编程的许多层次的讨论必将激发您的精力。.
  • INTERCAL简介和资源:如果很难进行面向对象的编程,那么学习INTERCAL将会很容易。这种戏仿(或笑话)语言是如此的复杂和可怕,以至于即使是对多态性的最深入的讨论也似乎令人愉悦。.

您应该学习什么代码?

对应该学习哪种编程语言感到困惑?查看我们的信息图,您应该学习什么代码?它不仅讨论了语言的不同方面,还回答了一些重要问题,例如:“我将以编程为生赚多少钱?”

您应该学习什么代码?
您应该学习什么代码?

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me