oo,不管是java一切基于class的oo,还是js一切基于propotype的oo,核心都是为可变性服务的,就是this下面挂着一堆或者public或者private的可变变量,也就是属性,然后用各种方法去改变这些属性的值。一个对象实例在生命周期内,这些内外部可变属性一直存在,而且你的确在调用方法的时候不知道这些this.xx在内部是咋变化的。
如果把问题抽象为全部都是不可变数据的话,也就是对象内部没有可变的this.xxx属性了,一切输入输出都体现在方法的入参和返回值上。。。那。。。其实也就没有必要搞成对象的方法了,和直接搞几个纯函数木有什么区别。
所以,我觉得oo天生就是按照可变数据的思路来抽象问题的,所以才有this/self这种东西。fp相反。各有各的适合场景。
【 在 eGust (十年) 的大作中提到: 】
: oo 是纯粹靠直觉设计出来的东西,这套东西跟学院派的 functional programming 比起来就是渣渣。
: fp 很重要的一个概念就是 immutable,无数 bug 都是因为数据的变动产生的。oo 最大的问题就是,你调用一个方法,不知道数据会不会变化;传一个对象给一个函数,不知道会不会被修改。rust 解决数据被无意修改的问题的思路就是引入 ownership,这与 oo 的设计是格格不入的
: 另外就是,zero-cost abstraction 在 oo 条件下很难实现,因为编译期很难确定数据有没有变化(无法保证 immutable),具体哪个函数被调用了(需要在运行期查虚函数表)。
: ...................
--
FROM 223.72.67.*