匿名方法/功能:基本功能还是违反OO原则?

时间:2009-09-18 14:13:36

标签: c# java perl anonymous-methods anonymous-function

最近主流语言(如perl和C#)对匿名方法/功能的转变是重要的,还是违反OO原则的奇怪功能?

最新版本的英特尔线程构建模块和微软PPL和Linq的最新版本是否依赖于这些东西是好事还是不是?

当前拒绝匿名方法/功能的语言(如Java)在坚持使用纯粹的OO模型时做出明智的选择,还是由于缺乏基本的编程功能而落后?

8 个答案:

答案 0 :(得分:18)

lambda表达式的表达能力与流畅的API(如LINQ)相结合远远超过任何被认为违反纯OO原则的行为。

答案 1 :(得分:13)

面向对象是一种设计哲学,而不是石碑上的一套诫命。

由于lambda函数将语言的功能/表达力提高了许多倍,仅仅依靠“它违反纯OO模型”而拒绝它们是相当自我毁灭的:总体目标是设计好的软件,而不是设计OO代码。

另外,我不太确定正确编写的lambda函数本身是“违反OO模型”。更像是在模特之外。

答案 2 :(得分:3)

无论如何都没有内在违反OO代名词......不是我能看到......

封装,继承和多态是规范列表,AM与三者中的任何一个都不矛盾......它们是一个方法,而不是一个类型......所以就像一个方法委托的完整.Net 1.1表示,他们可以被编写使用或滥用三个OO原则中的任何一个。

答案 3 :(得分:1)

C#总是有代表;它总是有事件处理。 CLR 2.0(和C#2.0)引入了匿名委托的概念,以满足各种OO技术中可能通过设计模式解决的各种需求。他们刚才官方认为这些技术中的功能是“一流的对象”。

我敢说,像C#这样的技术中的功能和对象功能的混合已经变得如此有用,以至于很难想象编写应用程序而没有两个世界的好处。

答案 4 :(得分:1)

Java不是“坚持纯粹的OO模型”的原则; Java社区无法就该语言的功能添加内容达成一致,或者它们是否值得在语法中增加复杂性。 James Gosling说:

  

闭包不在Java之外   最初更多是因为时间   压力比什么都重要。在里面   早期的Java缺乏   关闭非常痛苦,等等   内心阶级诞生了:一个   不舒服的妥协   试图避免一些努力   的问题。但正如许多人一样正常   设计问题,简化   他们并没有真正解决任何问题   只是感动了它们。

(摘自“Understanding the closures debate”,这是对去年夏天Java社区中函数式编程辩论状况的一个非常好的概述。目前看来已经达成共识。)

答案 5 :(得分:0)

Python总是拥有它们。

函数是一类具有非常窄的接口且属性不多的对象。

Python函数对象具有许多内置属性,如果需要,您可以随时添加更多属性。

答案 6 :(得分:0)

回调是OO的基本组成部分。对单方法回调对象的常见情况有良好的语法支持是有意义的。具体如何实现是另一回事。

答案 7 :(得分:0)

它会如何违反OO原则?

它不违反封装:类仍然可以完全控制哪些函数可以访问其私有成员。

它也不会干扰遗传或多态性。

如果您是Java程序员并且将“OO原则定义为”可以用Java实现,那么它只违反OO原则“

幸运的是,Java之外没有人曾经使用过这样的OOP定义。

可以说违反了Java的理念,我认为这是一件好事,因为Java的理念基本上是“从OOP的破坏版本开始,留在那里,没有不断增加或以任何有意义的方式发展它“。这不是一种值得保持不变的哲学。

但它并没有违反OOP的原则。