目录
回复内容:
个人拙见,仅供参考,以期启发,抛砖引玉。
1. 什么事面向对象?
2. 与面向过程的区别?
3. 面向对象有什么好处?
更有助于人类的思考
把事物分解为实现,这是机器的脑子; 把事物联系成整体这才是人类的脑子
就拿买笔记本电脑来说吧
首页 后端开发 php教程 用最简单的一句话说清,什么是面向对象?他和过程区别是什么?有什么好处?

用最简单的一句话说清,什么是面向对象?他和过程区别是什么?有什么好处?

Jun 06, 2016 pm 08:26 PM
c java object php 面向对象设计模式

可能我们都在用面向对象方式编程,我们真的理解到他了吗,每个程序员对面向对象的理解也不一样,每当别人问我为什么用对象不用过程时,我总是说不到一个充分的理由,我一般是这么说的,用对象的好处是,代码简洁,重用性高。。。。说说你们的看法和这么些年的总结阿。

回复内容:

可能我们都在用面向对象方式编程,我们真的理解到他了吗,每个程序员对面向对象的理解也不一样,每当别人问我为什么用对象不用过程时,我总是说不到一个充分的理由,我一般是这么说的,用对象的好处是,代码简洁,重用性高。。。。说说你们的看法和这么些年的总结阿。

个人拙见,仅供参考,以期启发,抛砖引玉。

1. 什么事面向对象?

面向对象就是把跟某一主题(类型称为类,实体叫做对象)的所有方法(即函数)和所有属性(即变量)组合起来,用这种逻辑来组织程序的一种程序开发方法。

2. 与面向过程的区别?

面向过程是通过一个一个的函数堆砌起来来组织程序的,面向的是过程(函数),而面向对象是通过一个一个的类/对象堆砌起来来组织程序的,面向的是对象(类/对象)。

3. 面向对象有什么好处?

当软件的规模不断扩大时,面向过程式的程序开发就会遭遇力不从心,一方面难以应付规模带来的压力,后期难以维护,另一方面代码也难以实现复用,造成重复编码(面向对象通过继承应对)。
因此,面向对象开发很好的解决了大型程序开发的困难,程序组织更为清晰,更容易后期维护。

王垠看待面向对象编程(王垠使用Java开发了许多项目,包括他的Yin语言):
http://www.yinwang.org/blog-cn/2015/04/03/paradigms/
王垠这篇文章中关于OOP的见解,提到了,面向对象=过程式+抽象,同时指出了完全面向对象导致过度抽象的问题,过度抽象反而会增加耦合.

“对象思想”作为数据访问的方式,是有一定好处的。然而“面向对象”(多了“面向”两个字),就是把这种本来良好的思想东拉西扯,牵强附会,发挥过了头。很多面向对象语言号称“所有东西都是对象”,把所有函数都放进所谓对象里面,叫做“方法”,把普通的函数叫做“静态方法”。实际上只有极少需要抽象的时候,需要使用内嵌于对象之内,跟数据紧密结合的“方法”。其他的时候,你其实只是想表达数据之间的变换操作,这些完全可以用普通的函数表达,而且这样做更加简单和直接。把所有函数放进对象的做法是本末倒置的,因为函数本身并不属于对象,它们只是对象上面的变换操作。绝大部分函数是独立于对象的,它们不能被叫做“方法”。强制把所有函数放进它们本来不属于的对象里面,把它们全都作为“方法”,导致了面向对象代码逻辑过度复杂。很简单的想法,非得绕好多道弯子才能表达清楚。很多人至今不知道自己所用的“面向对象语言”里面的很多优点,都是从过程式语言继承来的。

大多数的面向对象语言里都缺乏正确的实现一等函数的机制。Java语言是一个极致,它完全不允许将函数当作数据来传递。你需要将全部的函数都封装进类,然后称它们为“方法”,但就像我说的,这是绑架。缺乏一等函数是为什么Java里需要这么多“设计模式”的主要原因。一旦有了一等函数,你将不再需要大部分的这些设计模式。

编程最重要的事情,其实是让写出来的符号,能够简单地对实际或者想象出来的“世界”进行建模。一个程序员最重要的能力,是直觉地看见符号和现实物体之间的对应关系。不管看起来多么酷的语言或者范式,如果必须绕着弯子才能表达程序员心目中的模型,那么它就不是一个很好的语言或者范式。
(引用结束)

个人也觉得,面向对象没有错,错的是"完全"面向对象,因为有时候并不需要采用面向对象,完全面向对象就太过于一刀切了.拿PHP的mysqli扩展来说,其提供有面向对象和过程化两套使用方法.面向对象就是new mysqli()创建一个对象,然后就可以很方便的调用方法和成员.过程化则是使用前缀为mysqli_的一系列函数.在这个场景下,个人觉得new mysqli()的确更合适一些.不过,对于某些场景,比如PHP内置的解析URL的函数parse_url,个人觉得就不需要使用面向对象了,如果再搞个url处理的类,把parse_url放到里面,就太多此一举,把简单问题搞复杂了,作为一个功能性很明确的函数,直接提供给编程人员调用,显然很友好.

抛砖引玉。

Q: 什么是面向对象?
A: 一种编程范式,与面向过程相对,代表一种以数据(对象)为单元的对现实世界的抽象方式。

Q: 面向对象与面向过程的区别是什么?
A: 用程序描述"我吃饭"。面向过程的写法:eat(I, food),面向对象的写法:I.eat(food)。两者最直观的区别是程序的组织方式不同,面向过程的程序以动作(函数)为构建单元,通过在函数中调用其它函数完成对现实世界的描述。面向对象是以数据(名词)为核心,通过对象之间的消息传递构建程序。

Q: 面向对象的好处?
A: 面向对象更符合人类对现实世界的认知,人对抽象的“类”和具体的“对象实例”这些概念从童年起能有很好的理解,例如 "人类"就是一个抽象的 class,而"张三"就是一个属于"人类" class 的 object.面向对象有三大特征:封装、继承、多态,能够避免命名冲突、实现代码复用,对于构建大型程序十分有利。

上面的答案已经说的很清晰了。
面向对象就是对“类”的合理使用。
面向过程就是对“函数”的合理使用。
好处?减少重复的代码,增加可维护性。

以前在大学,跟马士兵老师学习 Java 时,他如是说:

面向过程
汽车启动是一个事件,汽车到站是另一个事件。在编程序的时候,关心的是某一个事件,而不是汽车本身。
编写启动汽车程序。
编写汽车到站程序。
如果汽车坏了,还要编写"修理汽车"程序。

面向对象
先选择操作对象——汽车。在编程序的时候,关心的是汽车本身,让汽车去完成各个动作。
命令汽车——启动。
命令汽车——到站。
如果汽车坏了,命令汽车——修理。

很显然,面向对象是最接近人类思维的编程思想。


依我看,最大的好处就是:

更有助于人类的思考

面向对象的定义,网上一搜一大把。的确,我们每个人都在使用它,却很少有人思考过其中的原因。

事实上,从语法层面上来说: 面向对象只是面向过程的语法糖。继承,多态等等,完全可用面向过程来模拟,只是繁简的区别罢了。

面向对象的存在,肯定是有价值的。诚然,面向过程也可用于软件工程,但为何不被人们所推崇?原因就是: 不好想

人类更愿意用联系的思想去看问题,因为这更贴近生活经验,而面向对象就能很好地体现这种思想。

把事物分解为实现,这是机器的脑子; 把事物联系成整体这才是人类的脑子

上面说的都挺不错的,偶也来凑个热闹~
简单到一句话:(按题主的要求)

  1. 什么是面向对象?对象是数据+操作。

  2. 和面向过程的区别是什么?面向对象更关注数据,而面向过程更关注操作。

  3. 有什么好处?面向对象让我们能更容易去封装数据、封装操作、扩展(继承机制),以及提供更轻量的接口--多态和duckType

楼上说的都挺不错的,但是说好的一句话说清呢。。。

要我说,面向对象比面向过程好的是:人类语言很大程度是面向对象的。(至少中文、英文是。我就会这两个…)

如果非要一句话概括,那么就是:面向对象是将问题模块化,面向过程是将问题程序化

老程序员了,c# JAVA c++ py都走过,现在爱node。那么多年的感觉就是,oo其实就是一种建模方法,简单的说就是你是如何理解这个世界这些业务的,oo只是其中一种。多接触各种不同的思想,才明白其中的差别,别纠结于理论。

化整为零的哲学思想

举一个栗子
实现电商网站里面的一个小功能叫“删除商品”
如果是面向对象:可能的思路是---“删除商品”是对商品进行删除的一种方法,那就在商品这个类里面增加一个方法
如果是面向过程:可能的思路是---“删除商品”就是1,判断用户登录状况;2,判断用户权限;3,对提交的操作进行库表操作;4,返回结果;

不知道说的明不明白,我没有学过面向对象编程,小白的理解~~~~

就拿买笔记本电脑来说吧

过程思维:询问周围朋友-->网上查询报价-->到附近的电脑城自己去买;
对象思维:找个人给他钱,让他搞个笔记本电脑给你。

oo更适合把数据和其对应的操作封装起来,对外隐藏实现细节。

能封装的就封装

我写过java,node,,可以说是从面向对象过渡到了面向对象+面向过程。从我个人的体会来说,面向过程更加快速简便,更加贴近人解决事物的办法。比如,商店卖掉一个球,面向过程的思路就是把球的总数拿过来,减去一,然后保存,同时,添加一个订单。 这种思维方式和现实业务的过程是比较类似的。所以叫做面向过程。

但是面向对象就是另一种方式,它首先要把这些实体都抽象两个类,球,订单。然后提供实现方法。比如,球的类有方法 sell,调用这个方法就会把球总数减1,然后调用订单的方法add,添加订单。总体的思路就是,先设计好类的接口以及交互方式,然后只要在 业务发生的时候, 将消息发送给相关的类就可以了。 这里,我们只需要调用 球的sell方法就行了。至于,它怎么下订单,订单价格,我们都不管。

可以看出,面向对象的方式比较有利于业务逻辑内聚,只要设计好接口,可能很长时间都不用更改类的通讯方式。永远都是 调用球的sell。当球的价格变了,或者有促销了,我们只需要修改sell实现,或者针对临时的促销,实现一个球的子类,比如叫做促销球。这样的话,能最大限度的保证架构的稳定。但是反过来说,如果真的要改架构,成本是比较大的。而且为了保证架构的稳定,前期设计上也会花费更多的资源。

面向过程的优势也正在于此,虽然处理复杂的业务不是强项,但是开发迅速,改变成本也比较小。非常适合复杂度不高或者适中,业务内容多变的开发。

以上。

现在我们来应该讨论 oop 和 aop 。。

封装,继承,多态。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

您如何在PHP中解析和处理HTML/XML? 您如何在PHP中解析和处理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

php程序在字符串中计数元音 php程序在字符串中计数元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

突破或从Java 8流返回? 突破或从Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? 什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。

See all articles