论坛首页 Java企业应用论坛

再论闭包

浏览 24735 次
锁定老帖子 主题:再论闭包
该帖已经被评为良好帖
作者 正文
   发表时间:2009-06-24  
幸存者 写道
大家都知道世界公认的OO语言的鼻祖,第一种纯OO的语言smalltalk都支持闭包,我不知道那些宣称闭包与OO格格不入的人论据何在?
事实上我发现所有倒闭包派的观点几乎都一样——闭包与OO冲突。不过可笑的是,没有一个人给出论据和论证过程,只有结论。这种话要是说给OO的创始人Alan Kay听,估计他老人家都要笑掉大牙了。


“闭包与OO格格不入的人论据何在”
请你看看OO的基本概念

Alan Kay估计早都听到这种言论了,好像没听说他的牙已经离开他的牙床了
不要把你的感觉 附加到别人身上
1 请登录后投票
   发表时间:2009-06-24   最后修改:2009-06-24
维基百科 写道
面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法论。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。


麻烦你指出这句话中哪几个字或词说明了闭包与OO的冲突。

步行者 写道
Alan Kay估计早都听到这种言论了,好像没听说他的牙已经离开他的牙床了
不要把你的感觉 附加到别人身上

看来你连小学语文修辞手法都没学好,如何能学好编程语言呢?


0 请登录后投票
   发表时间:2009-06-24   最后修改:2009-06-24
幸存者 写道
维基百科 写道
面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法论。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。


麻烦你指出这句话中哪几个字或词说明了闭包与OO的冲突。

步行者 写道
Alan Kay估计早都听到这种言论了,好像没听说他的牙已经离开他的牙床了
不要把你的感觉 附加到别人身上

看来你连小学语文修辞手法都没学好,如何能学好编程语言呢?




闭包是对象吗,它有属性和方法吗?

你不会以为 我真的认为你的牙被笑掉了吧。。
那你得测测智商了
1 请登录后投票
   发表时间:2009-06-24  
步行者 写道
闭包是对象吗,它有属性和方法吗?

闭包为什么不能是对象?它为什么不能有属性和方法?

以C#为例:
class Program {
    static void Main(string[] args) {
        ShowClosure(a => a + 1);
    }

    static void ShowClosure(Func<int, int> f) {
        Console.WriteLine(f.Method);
        Console.WriteLine(f.ToString());
    }
}
0 请登录后投票
   发表时间:2009-06-24  
幸存者 写道
步行者 写道
闭包是对象吗,它有属性和方法吗?

闭包为什么不能是对象?它为什么不能有属性和方法?

以C#为例:
class Program {
    static void Main(string[] args) {
        ShowClosure(a => a + 1);
    }

    static void ShowClosure(Func<int, int> f) {
        Console.WriteLine(f.Method);
        Console.WriteLine(f.ToString());
    }
}


闭包是一个有状态的函数,是FP中的概念
我不熟悉 c#,
但看得出来 f 是一个对象,
如果a => a + 1是一个闭包
那 f 算是一个封装了闭包的对象
已不是单纯的闭包



1 请登录后投票
   发表时间:2009-06-24  
wikipedia 写道
a closure is a first-class function with free variables

闭包的核心概念就两个:一等函数(即可以作为参数的函数)和可使用外部变量。
没有什么单纯或不单纯的闭包之说,那些东西完全取决于某种语言如何实现闭包,而不取决于闭包本身的概念。
OO从来没有规定函数不能成为一等公民,也没有规定函数一定不能是对象,事实上早在70年代,函数和类在smalltalk中都是对象。说闭包不是对象或函数不能是对象完全没有道理。
0 请登录后投票
   发表时间:2009-06-24  
又提到 闭包是不是对象上来了?

你可以定义闭包的方法吗,你可以定义闭包的属性吗?
早都说过对象是状态和行为的封装
闭包是封装状态的行为

函数和类在smalltalk中都是对象
那是经过对象封装了

0 请登录后投票
   发表时间:2009-06-24  
步行者 写道
又提到 闭包是不是对象上来了?

首先幸存者同学没有说闭包就是对象, 只是说这两个概念并不冲突。 是你把问题引到这里的。
再次引用wikipedia中对于闭包的定义
引用

In computer science, a closure is a first-class function with free variables.

按照这个定义 只要有个东西不管它是什么东西只要满足这几个条件 都可以称作闭包。
那么对象可以满足这几个条件么 当然可以。 对象可以当作参数或返回值 对象可以是函数(例如python中的函数) 也可以拥有free variables. 所以对象也可以作为闭包的一种具体存在方式.

步行者 写道

你可以定义闭包的方法吗,你可以定义闭包的属性吗?

为什么不可以呢. 幸存者同学不是已经给出例子了么.

步行者 写道

早都说过对象是状态和行为的封装
闭包是封装状态的行为

什么意思 请给出具体解释或示例

步行者 写道

函数和类在smalltalk中都是对象
那是经过对象封装了

不讨论这句话的对错. 假设是对的那有怎么样.
0 请登录后投票
   发表时间:2009-06-24  
先放下Java中引入非OO的东西好不好这个话题不谈。
在这个帖子中 大多数反对Java中引入闭包的理由是 "闭包与OO格格不入" 但都没有给出解释来说明为什么"闭包与OO格格不入"
我猜想大概有2点原因
1. 认为闭包不是对象 引入非对象破坏的java的“纯洁性”。  关于这个问题请参考python 和smalltalk对闭包的处理.
2. 认为闭包破坏了对象的封装性.  的确在有些语言中闭包破坏了对象的封装性.
(比如下面这个perl的例子中通过闭包访问了对象中的局部变量。)
package Foo; #define a class in perl
sub new {
  my $class = shift;
  my $self = {};
  bless $self, $class;
  return $self;
}
my $pv = 1;

sub bar(){
  my $self = shift;
  my $do = shift;
  $do->();
}
1; #end

package main;
my $foo = Foo->new;
$foo->bar(sub {print $pv});

但这个功能对于闭包并不是必须的。 去掉这个功能它仍然是闭包。

希望认为闭包不符合oo特性的人可以把理由说出来。
0 请登录后投票
   发表时间:2009-06-24  
想说的 前面都说过了 ,有的话说了好几遍
不想重复了

每个人脑子里都有一个闭包,闭包在不同的地方似乎也有不同的定义
我认为 的 闭包在前面陈述过了

不过欢迎大家 把自己脑子里的闭包 陈述出来
把它与 OO 的区别与联系也提供出来供大家参考,供大家讨论

扔砖送花都欢迎,不过要讲清楚,有论据。。。



1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics