可能我们都在用面向对象方式编程,我们真的理解到他了吗,每个程序员对面向对象的理解也不一样,每当别人问我为什么用对象不用过程时,我总是说不到一个充分的理由,我一般是这么说的,用对象的好处是,代码简洁,重用性高。。。。说说你们的看法和这么些年的总结阿。
王垠看待面向对象编程(王垠使用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放到里面,就太多此一举,把简单问题搞复杂了,作为一个功能性很明确的函数,直接提供给编程人员调用,显然很友好.
我写过java,node,,可以说是从面向对象过渡到了面向对象+面向过程。从我个人的体会来说,面向过程更加快速简便,更加贴近人解决事物的办法。比如,商店卖掉一个球,面向过程的思路就是把球的总数拿过来,减去一,然后保存,同时,添加一个订单。 这种思维方式和现实业务的过程是比较类似的。所以叫做面向过程。
但是面向对象就是另一种方式,它首先要把这些实体都抽象两个类,球,订单。然后提供实现方法。比如,球的类有方法 sell,调用这个方法就会把球总数减1,然后调用订单的方法add,添加订单。总体的思路就是,先设计好类的接口以及交互方式,然后只要在 业务发生的时候, 将消息发送给相关的类就可以了。 这里,我们只需要调用 球的sell方法就行了。至于,它怎么下订单,订单价格,我们都不管。
可以看出,面向对象的方式比较有利于业务逻辑内聚,只要设计好接口,可能很长时间都不用更改类的通讯方式。永远都是 调用球的sell。当球的价格变了,或者有促销了,我们只需要修改sell实现,或者针对临时的促销,实现一个球的子类,比如叫做促销球。这样的话,能最大限度的保证架构的稳定。但是反过来说,如果真的要改架构,成本是比较大的。而且为了保证架构的稳定,前期设计上也会花费更多的资源。
面向过程的优势也正在于此,虽然处理复杂的业务不是强项,但是开发迅速,改变成本也比较小。非常适合复杂度不高或者适中,业务内容多变的开发。
以上。