php - 用最简单的一句话说清,什么是面向对象?他和过程区别是什么?有什么好处?
黄舟
黄舟 2017-04-10 16:12:10
0
19
1243

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

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

reply all (19)
刘奇

王垠看待面向对象编程(王垠使用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放到里面,就太多此一举,把简单问题搞复杂了,作为一个功能性很明确的函数,直接提供给编程人员调用,显然很友好.

    PHPzhong

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

    1. 什么事面向对象?

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

    2. 与面向过程的区别?

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

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

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

      巴扎黑

      抛砖引玉。

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

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

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

        巴扎黑

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

          阿神

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

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

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

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


            Ty80

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

            更有助于人类的思考

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

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

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

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

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

              伊谢尔伦

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

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

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

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

                迷茫

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

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

                  洪涛

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

                    洪涛

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

                      Latest Downloads
                      More>
                      Web Effects
                      Website Source Code
                      Website Materials
                      Front End Template
                      About us Disclaimer Sitemap
                      php.cn:Public welfare online PHP training,Help PHP learners grow quickly!