- 浏览: 169784 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
cmm13655612162:
zhai4902176 写道 写的真不错,作为基础很薄弱的我理 ...
SAX解析XML 详解 -
kisso143:
写的很详细,不错,收藏一下
SAX解析XML 详解 -
zhai4902176:
写的真不错,作为基础很薄弱的我理解的还是挺浅的。请问楼主 “ ...
SAX解析XML 详解 -
ahzdc:
讲的很好啊
JAVA 注解示例 详解 -
elisonwell:
不错,我喜欢
JAVA 注解示例 详解
--再论闭包 --
下面这个例子 引自 《Groovy in action》 第五章。
一段 Java 代码,
interface ResourceUser { void use(Resource resource) } resourceHandler.handle(new ResourceUser(){ public void use (Resource resource) { resource.doSomething() } });
下面是一段等价 Groovy 的代码。
resourceHandler.handle { resource -> resource.doSomething() }
惊叹吧 ? 8行JAVA代码居然被 Groovy 如此 easy 地实现了。
惊叹! 惊叹之余再来反思。。。
(1),为何能如此简单(Groovy):因为它在使用闭包。
Groovy中 行为元素(函数,过程)作为一级元素。
像resource -> resource.doSomething() 就是一个匿名函数。
参数 为 resource,返回值 为 resource.doSomething()。
(2),为何如此复杂(Java):因为它在模拟闭包。
函数咱没有,那就包装一下,模拟一下,但好像臃肿了点。。
(3),易理解吗?
Groovy :资源处理器 (名词:resourceHandler)处理 (动词:handle)一个函数 (匿名函数:resource ->
resource.doSomething())。
模拟闭包的Java :资源处理器 (名词:resourceHandler)处理 (动词:handle)一个资源用户 (名词:new
ResourceUser(){...})。
资源处理器应该只处理资源啊。。。
(4), 重新造句 (Java)
OO的Java :资源处理器 (名词:resourceHandler)处理 (动词:handle)一个资源 (名词:resource)。
new ResourceHandler(){ protected void handle(Resource resource){ //doSomething .... resource.doSomething(); //doSomething .... } }.handle(request);
个人观点 :
一种功能如果可以用FP中的闭包来实现,
那它必然也可以用OO中的对象来实现, 而且更贴近于人的思维。
有必要用对象模拟闭包吗?个人感觉没必要,
用对象模拟的闭包 来实现一种功能,感觉相比上诉两种情况更复杂。
评论
ruby受到lisp影响 其实要超过受到perl的影响
我知道啊,正因为我知道我才这么说的。
不过有人大言不惭的说Lisp是银弹,我还是比较佩服的(不会没看出我在说反话吧,哪有什么银弹语言),既然都是银弹了,还要其他语言干啥啊?
你的逻辑中有一个很严重的误导就是,程序复杂以及代码可读性差是由于Java本身过于复杂造成的,而实际上绝大多数复杂性是由于固有的业务复杂性造成的,而不是语言本身。语言本身的提高只能缓解一定的编程复杂度,但是不能减少任何业务本来固有的复杂度,不存在银弹的。
你的意思是“不能减少任何业务本来固有的复杂度”,就不能减少程序员的劳动量?
引入一个好的语言特性,在代码中就能造成线性的差别(可读性和代码量上),连带影响 debug、测试代码量、影响架构、影响交流成本,差异到了工程中就是到指数级了,根本不是引入一个库/框架能比的。
当然糟糕的语言特性也会造成反效果罢了。
Lisp 是银弹有什么错的吗?
http://page.mi.fu-berlin.de/prechelt/Biblio/jccpprt_computer2000.pdf
如果Lisp是银弹的话,为什么狼都还活着呢?
如果Lisp是银弹的话,是不是ruby之类的动态语言都能算是银弹么?
消亡的话,java早就消亡了,在很早以前,我就貌似听说过java,c++已死的言论
觉得也合理
但是消失还差的很远
现在都有人用COBOL~~但是cobol早就没有生命力了
需要借助 IDE 生成代码,而生成代码的可读性就更差了;
长代码导致出错增加、重构困难、bug 迷雾;
代码越长,要求的注释越多;
为了分而治之,衍生出各种分层理论,design over code 之类的,但是层数越多,调用栈就越复杂,弹出巨大的 stack trace 你根本弄不清问题在哪 ……
这些问题归结到底,就是欠缺清晰、简洁的表达造成的。
OO 到了极致,从指令流程序变成数据流程序,便成为了函数式语言,这里头的东西几十年就研究通透了 …… 在精巧设计的 lambda 面前,很多杂乱的语言特性如 annotation、for in、try...catch 都变得没有价值,很多庞大的库和大量使用了 xml 的框架都会变成鸡肋 —— 因为用闭包可以更简单的做到。像上面的例子,很多人只看到少了 7 行,其实是少了 7/8 ……
可是现在 java 语言做一点点微小的进步都非常困难 …… 不进步便消亡,只是关系到数量庞大的公司和个人的利益,消亡的过程肯定比较缓慢。
照你的逻辑,Java早该灭亡了,有Lisp还要Java干嘛?
因为使用者众,程序也多,断无一夜之间全部消失之理。
Lisp诞生远比Java早。
需要借助 IDE 生成代码,而生成代码的可读性就更差了;
长代码导致出错增加、重构困难、bug 迷雾;
代码越长,要求的注释越多;
为了分而治之,衍生出各种分层理论,design over code 之类的,但是层数越多,调用栈就越复杂,弹出巨大的 stack trace 你根本弄不清问题在哪 ……
这些问题归结到底,就是欠缺清晰、简洁的表达造成的。
OO 到了极致,从指令流程序变成数据流程序,便成为了函数式语言,这里头的东西几十年就研究通透了 …… 在精巧设计的 lambda 面前,很多杂乱的语言特性如 annotation、for in、try...catch 都变得没有价值,很多庞大的库和大量使用了 xml 的框架都会变成鸡肋 —— 因为用闭包可以更简单的做到。像上面的例子,很多人只看到少了 7 行,其实是少了 7/8 ……
可是现在 java 语言做一点点微小的进步都非常困难 …… 不进步便消亡,只是关系到数量庞大的公司和个人的利益,消亡的过程肯定比较缓慢。
照你的逻辑,Java早该灭亡了,有Lisp还要Java干嘛?
因为使用者众,程序也多,断无一夜之间全部消失之理。
需要借助 IDE 生成代码,而生成代码的可读性就更差了;
长代码导致出错增加、重构困难、bug 迷雾;
代码越长,要求的注释越多;
为了分而治之,衍生出各种分层理论,design over code 之类的,但是层数越多,调用栈就越复杂,弹出巨大的 stack trace 你根本弄不清问题在哪 ……
这些问题归结到底,就是欠缺清晰、简洁的表达造成的。
OO 到了极致,从指令流程序变成数据流程序,便成为了函数式语言,这里头的东西几十年就研究通透了 …… 在精巧设计的 lambda 面前,很多杂乱的语言特性如 annotation、for in、try...catch 都变得没有价值,很多庞大的库和大量使用了 xml 的框架都会变成鸡肋 —— 因为用闭包可以更简单的做到。像上面的例子,很多人只看到少了 7 行,其实是少了 7/8 ……
可是现在 java 语言做一点点微小的进步都非常困难 …… 不进步便消亡,只是关系到数量庞大的公司和个人的利益,消亡的过程肯定比较缓慢。
照你的逻辑,Java早该灭亡了,有Lisp还要Java干嘛?Lisp是银弹啊?
你的逻辑中有一个很严重的误导就是,程序复杂以及代码可读性差是由于Java本身过于复杂造成的,而实际上绝大多数复杂性是由于固有的业务复杂性造成的,而不是语言本身。语言本身的提高只能缓解一定的编程复杂度,但是不能减少任何业务本来固有的复杂度,不存在银弹的。
java 应该像操作系统中的linux 走向简单稳定
菜鸟意见。。。。欢迎攻击。。。
<div class="quote_div">
<p><span>to liusong1111:
首先谢谢你的回帖!
前面的所有回复我都认真看过,我不了解ruby,但大约看懂了你的代码,
ruby中的闭包确实可以添加方法,添加属性。</span></p>
<p><span>因为ruby里的闭包被封装成了对象
groovy也一样,</span></p>
<p> </p>
<pre name="code" class="java">println ({it*it} instanceof Object)
//output:
//true</pre>
<div><span><span style="white-space: pre-wrap;">对闭包的调用,实际上是对封装闭包的对象方法的调用</span></span></div>
<div><br></div>
<div>
<pre name="code" class="java">def closure = {it*it}
println closure(2)
// ||
println closure.call(2)</pre>
</div>
<div> </div>
<div>闭包无疑是从FP中引入的概念(计算机领域)</div>
<div>一种编程语言引入它 是因为它的轻巧,简洁。</div>
<div>我想不是因为它具有OO特性吧</div>
<div><br></div>
<div><br></div>
<div><br></div>
</div>
<p> </p>
<p>争论源于“闭包与OO格格不入“的论断。</p>
<p>你上面的逻辑,如同说“对象上的操作,实际上是对封装对象行为的函数的调用“,因此,”面向对象“与”过程式编程“格格不入,“面向对象”没有意义。</p>
<p>最终又归结到信仰问题了。</p>
<div class="quote_div">
<p> </p>
<pre name="code" class="java">interface ResourceUser {
void use(Resource resource)
}
resourceHandler.handle(new ResourceUser(){
public void use (Resource resource) {
resource.doSomething()
}
});</pre>
<p> </p>
<p><span style="font-size: small;">下面是一段等价<strong><span style="color: #000000;"> Groovy</span> </strong>的代码。</span> </p>
<pre name="code" class="java">resourceHandler.handle { resource -> resource.doSomething() }</pre>
<p> </p>
<p><span style="font-size: small;">惊叹吧 ? 8行JAVA代码居然被 Groovy 如此 easy 地实现了。</span> </p>
<p><span style="font-size: small;">惊叹! 惊叹之余再来反思。。。</span> </p>
<p> </p>
</div>
<p>行数比例貌似 8:1 <img src="/images/smiles/icon_cool.gif" alt=""></p>
<p> </p>
就跟 inter 有 挺穆 跟 倒穆。。
AC milan 有挺安 跟 倒安一样。。 ms现在还可以投票取消闭包。
说实话。 Java 7 可能是对Java社区的一次强大冲击。 不亚于Java 5 。 企业级应用里面为什么爱用Java。 首先面向对象。 开源社区足够强大。 语法足够简单。一些大公司他们连 泛型都不用。 1.4用到死。。就别提Java 7 了。
我始终觉得。 Java老向c#靠拢就走歪了。 盖房子的工人没必要还一身amani。。
相当精辟,大公司都倾向于使用稍微老点的版本。
不是骂人。
没有本质差别,不过是个匿名的方法而已,加速不了软件的开发,也不可能用这些东西就把一个低级程序员变成高级程序员,顶多少打几行字而已。
因为软件开发,并不取决于打字的速度,所以,语言是否优秀,也不取决于它的语法是否能够少写几个字。
首先谢谢你的回帖!
前面的所有回复我都认真看过,我不了解ruby,但大约看懂了你的代码,
ruby中的闭包确实可以添加方法,添加属性。</span></p>
<p><span style="">因为ruby里的闭包被封装成了对象
groovy也一样,</span></p>
<p>
</p>
<pre name="code" class="java">println ({it*it} instanceof Object)
//output:
//true</pre>
<div><span style=""><span style="white-space: pre-wrap;">对闭包的调用,实际上是对封装闭包的对象方法的调用</span></span></div>
<div><br></div>
<div>
<pre name="code" class="java">def closure = {it*it}
println closure(2)
// ||
println closure.call(2)</pre>
</div>
<div> </div>
<div>闭包无疑是从FP中引入的概念(计算机领域)</div>
<div>一种编程语言引入它 是因为它的轻巧,简洁。</div>
<div>我想不是因为它具有OO特性吧</div>
<div><br></div>
<div><br></div>
<div><br></div>
没有什么单纯或不单纯的闭包之说,那些东西完全取决于某种语言如何实现闭包,而不取决于闭包本身的概念。
OO从来没有规定函数不能成为一等公民,也没有规定函数一定不能是对象,事实上早在70年代,函数和类在smalltalk中都是对象。说闭包不是对象或函数不能是对象完全没有道理。
赞同这个说法。能不能给闭包自定义属性和方法,能不能继承、多态,取决于这个语言想不想支持,而不是能不能做到的问题。
看ruby的:
# 用变量closure接收一个闭包 def hello(&closure) closure.instance_eval do # 给它设置属性 @var = "hello" # 给它添加方法 def x @var + " " + self.call end end # 调用这个闭包上新加的方法 closure.x end # 向hello传入一个闭包{"world"} puts hello{ "world" }
看你贴过groovy的代码,仔细研究一下groovy,应该能得到相同的结论(通过metaclass等)。closure作为一等公民,可以被一个普通的变量引用、传递。在ruby里意味着它是Proc的一个对象(实例),自然可以调用Proc的方法(比如call)。以java的视角,类是用来组织数据的,不是描述行为。而对于ruby,行为也是数据,也可以用类描述,类也是对象,类的类还是对象,这才是真正的Everything is Object。楼主受java和java所谓的OO的影响太深,评判这些问题时,应该眼光往外多看看,避免思维定势。尤其应该深入学习一门带闭包的语言,看看它到底是怎么用的。
你主贴的第三点:“易理解吗?” 因为举的例子没有什么业务含义,我觉得两个都不易理解。
但你看,java代码里多出来的ResourceUser类、use方法,使它的代码变得冗长,同时,使用者还要多记忆两个名词。相比groovy代码,这两个名词分明是多余的。重复了!坏味道。重构-消除重复。使用闭包可以做到。
如果不在语法级修改,能消除重复也行,问题是,你后面这段代码灵光吗?
new ResourceHandler(){ protected void handle(Resource resource){ //doSomething .... resource.doSomething(); //doSomething .... } }.handle(request);
不想重复了
每个人脑子里都有一个闭包,闭包在不同的地方似乎也有不同的定义
我认为 的 闭包在前面陈述过了
不过欢迎大家 把自己脑子里的闭包 陈述出来
把它与 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特性的人可以把理由说出来。
首先幸存者同学没有说闭包就是对象, 只是说这两个概念并不冲突。 是你把问题引到这里的。
再次引用wikipedia中对于闭包的定义
In computer science, a closure is a first-class function with free variables.
按照这个定义 只要有个东西不管它是什么东西只要满足这几个条件 都可以称作闭包。
那么对象可以满足这几个条件么 当然可以。 对象可以当作参数或返回值 对象可以是函数(例如python中的函数) 也可以拥有free variables. 所以对象也可以作为闭包的一种具体存在方式.
你可以定义闭包的方法吗,你可以定义闭包的属性吗?
为什么不可以呢. 幸存者同学不是已经给出例子了么.
早都说过对象是状态和行为的封装
闭包是封装状态的行为
什么意思 请给出具体解释或示例
函数和类在smalltalk中都是对象
那是经过对象封装了
不讨论这句话的对错. 假设是对的那有怎么样.
你可以定义闭包的方法吗,你可以定义闭包的属性吗?
早都说过对象是状态和行为的封装
闭包是封装状态的行为
函数和类在smalltalk中都是对象
那是经过对象封装了
闭包的核心概念就两个:一等函数(即可以作为参数的函数)和可使用外部变量。
没有什么单纯或不单纯的闭包之说,那些东西完全取决于某种语言如何实现闭包,而不取决于闭包本身的概念。
OO从来没有规定函数不能成为一等公民,也没有规定函数一定不能是对象,事实上早在70年代,函数和类在smalltalk中都是对象。说闭包不是对象或函数不能是对象完全没有道理。
发表评论
-
设计模式
2009-07-13 13:01 1139一些总结,一些质疑 1,要让你的程序尽可能地重用(质疑 ... -
callback 的 java实现
2009-06-15 17:31 2036下面是一个JS的callback实现 var ... -
反射 与 自省
2009-06-14 19:44 2969反射 与 自省 都是 ... -
JAVA 需要引入闭包吗
2009-06-10 20:29 5960最近有很多人 呼吁 要 ... -
JAVA 注解示例 详解
2009-06-02 10:14 8589注解(Annotation) 为我们在代码中天界信息提 ... -
Commons JEXL 示例详解
2009-06-01 14:41 22371Jexl 是一个 Expression Language 的解 ... -
猜猜它的输出是什么(关于java内部类)
2009-05-31 18:53 1163下面是一段JAVA程序,猜 ... -
java中的Class.getResource()方法
2009-05-30 14:51 8947当你想要在java类包中某 ...
相关推荐
综上所述,文章中的内容涉及到抽象代数、格论、范畴论等多个数学领域的知识,对于理解有限集合上的闭包系统、闭包算子以及有限原子格的表示提供了深刻的见解。这些概念在数学理论研究以及逻辑电路设计等领域有着广泛...
本文研究的目的是在完备剩余格上利用蕴涵运算定义蕴涵闭包算子,并给出其等价刻画和表示定理。 首先,让我们探讨闭包算子(Closure Operators)的基础知识。闭包算子是在偏序集中定义的一个映射,它满足增值性、保...
论文研究-基于网络闭包理论的交易型社区网络演化研究.pdf, 随着社会化商务时代的到来,交易型社区的发展越来越成为解决社会化商务中经济性与社会性矛盾的关键.但交易型...
闭包运算作为离散数学中的核心概念,广泛应用于图论、集合论、逻辑学等多个领域。在此,我们将深入探讨闭包运算的类型,以及如何通过算法实现它们。 1. **闭包运算**:闭包运算是一种在集合上定义的操作,它将一个...
基于对闭包运算的性质研究,引入了闭包算子空间及其之间的连续映射概念,证明了闭包算子空间(对象)及其之间的连续映射(态射)构成范畴(闭包算子范畴)。证明了闭包算子空间范畴中(有限)积和(有限)余积的存在...
在经典集合论中,闭包指的是包含给定集合的所有闭集的交集,而内部则是由包含于给定集合的所有开集的并集构成。在模糊逻辑和模糊集的背景下,这些概念需要扩展以适应连续性和隶属度的模糊特性。 在韩元良的研究中,...
传递闭包(Transitive Closure)是集合论中的一个概念,指的是在集合\(X\)上的一类特殊的二元关系。具体来说,如果在集合\(X\)上有一个二元关系\(R\),那么\(R\)的传递闭包是指包含\(R\)的、\(X\)上最小的传递关系。...
在一般拓扑学中,拓扑结构可以通过一系列基本概念来刻画,如邻域、内部、闭包以及滤子(网)的收敛等。这些概念的经典定义依赖于特定的公理系统,例如闭包算子的定义通常依赖于下面的公理:(C1)对于任意子集A和B,...
对称闭包是离散数学中的一个重要概念,它在图论、集合论和关系理论中有广泛的应用。本文将深入探讨对称闭包的概念,并通过C++编程实现来帮助理解。 对称闭包指的是一个关系R在其自身的对称操作下所形成的最小关系,...
自反闭包是图论和集合论中的一个概念,它在关系理论中尤其重要。本话题聚焦于如何使用C++编程语言来实现求解自反闭包的程序。 首先,我们来理解自反闭包的概念。在集合论中,一个关系R定义在集合A上,如果对于集合A...
在离散数学中,二元关系是集合论和图论中的基本概念,它描述了集合内的元素如何相互关联。本主题主要关注如何判断一个关系的性质以及如何计算其闭包。我们将深入探讨自反性、对称性和传递性的概念,并学习如何通过...
在完备剩余格上引入蕴涵闭包系统的概念,是将逻辑学中的蕴涵关系与抽象代数的闭包系统概念相结合的尝试。为了深入理解这些概念及其性质,我们首先要回顾一些基本定义。 首先,闭包系统是完备格理论中的一个基本概念...
研究[n]维空间中[m]个点的最小闭包球(MEB)问题。通过结合确定并删除内部点的技术到序列最小最优化(SMO)方法中,提出一种近似求解MEB问题的改进的SMO-型算法。证明了该算法具有线性收敛性。数值结果表明对于一些...
在计算机科学中,集合论和离散数学是基础理论,其中关系的闭包和等价关系是重要概念。本文将详细阐述这些概念及其应用。 首先,我们关注“关系的闭包”。关系闭包是指在给定集合A上的一个关系R,通过某种运算扩展R...
区别于传统的聚类方法,提出了以类为起点,通过构造闭包进行聚类的新方法,并建立了聚类判别模型,此模型给出了对于闭包间的交叉区域的检验点的判别准则。然后针对二维的聚类问题,提出了以最小圆为闭包的聚类判别...
其中,关系的闭包是一个核心概念,它涉及到集合论、二元关系和函数等多个领域。 首先,我们要理解集合论的基本概念。集合是由特定对象组成的整体,可以进行并集、交集、差集等基本运算。在有穷集合中,我们还可以...
编程题目:基于关系的矩阵表示,实现关系的自反闭包、对称闭包、传递闭包运算,并计算A上的关系R={,b>,,a>,,c>,,d>}的自反闭包、对称闭包、传递闭包,其中A={a,b,c,d}. 编程内容及要求: 编写程序,基于关系的矩阵...
代数闭包和向量闭包是凸分析领域中两个重要的概念,分别对应于线性空间中的特定类型集合的闭包。在凸分析中,闭包通常指的是某种极限过程下集合的最小闭集合,它能够包含原集合以及所有可能的极限点。在凸分析中,对...