最近主流语言(如perl和C#)对匿名方法/功能的转变是重要的,还是违反OO原则的奇怪功能?
最新版本的英特尔线程构建模块和微软PPL和Linq的最新版本是否依赖于这些东西是好事还是不是?
当前拒绝匿名方法/功能的语言(如Java)在坚持使用纯粹的OO模型时做出明智的选择,还是由于缺乏基本的编程功能而落后?
答案 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的原则。