到目前为止,我已经编写了至少5年的Java代码,我非常欣赏Java语言的工作原理。在查看新的JVM语言(例如Scala、Clojure)时,有一种趋势是采用更多的功能方式进行编码,这种方式有一些主要的优点。
无论如何,即使在使用Java或其他纯OOP时,也有模式可以实现更多的功能样式吗?这在Java中有意义吗?
发布于 2013-01-25 00:36:08
函数式编程有两个主要的特点来定义它-强调不变的数据和一流的函数。两者在Java中都是可以实现的--只要付出一定的努力并在合理的范围内。
您当然可以拥有不可变的对象。通过构造函数显式设置对象状态,不要公开设置器,并将final关键字应用于字段。每当有方法修改对象的内部状态时,让它返回一个带有更新状态的新实例。在实世界函数程序设计中提出了这样一种方法,这本书包含了F#中的函数式代码和C#中相应的代码的示例。虽然C#比Java更适合函数式编程,但类似的方法仍然可以应用于Java。
当涉及到一流的函数时,事情会变得更加棘手。目前,Java有一种使用匿名嵌套类模拟函数的笨拙而冗长的机制,对闭包的支持有限。虽然至少用函数式编写一些代码就足够了,但与使用适当的函数式语言相比,这将是一种平淡无奇的体验。有一些可用的Java库,特别是番石榴,它们将一些函数式编程概念引入到Java中,比如不变的集合和一些功能成语。这可能会使体验变得不那么可怕--然而,即使是番石榴的正式文件也指出,功能成语只能被谨慎地使用,因为它们常常导致代码比相应的命令式版本更冗长、更不清晰、效率更低。
据报道,随着SE 8的发布,Java的情况会变得更好。SE 8将包括适当的闭包和lambda表达式,从SE 7推迟。同时,您可以尝试JVM的几种功能语言之一,并在需要时与Java进行互操作。
发布于 2013-01-24 23:36:50
许多“四人帮”设计模式被认为是用面向对象语言实现功能概念。
功能设计模式是一个有用的读物。还有"功能思维“系列。都来自IBM。
在功能设计模式上的演示文稿(我还没有看过来验证)被总结为
Aino Vonge Corry回顾了许多著名的设计模式,表明它们在函数式语言中的实现更简单,因为这些语言有基于模式的构造。
在Java中,可以将闭包实现为方法中的本地类,并使其能够扩展到函数编程领域。Java 8用lambda扩展了这个功能。
因此,为了回答您的问题,许多设计模式已经实现了功能概念。在Java中它们是有意义的。
如果所有这些都失败了,那么我们总是可以调用格林斯夫第十法则来获取您所追求的任何功能模式。
发布于 2013-01-25 18:10:25
在函数式编程中,除了其他人已经说过的话外,还有一种驱动将产生/状态变化的代码从纯功能代码中分离出来,并使分离变得明确。这在例如Haskell中是通过使用IO和State Monad来实现的,在Clojure中是通过参考文献实现的。
在OOP中,状态和状态更改都封装在对象中,因此,除非您走不可变的对象路由,否则这可能会更加困难。
可能有帮助的是遵循命令/查询分离原则,它声明一个操作应该是一个命令并导致副作用,而不是返回任何东西,或者它应该是一个带有返回值的查询,不会造成任何副作用。就管理副作用而言,遵循这一原则可以帮助人们进入一种更有功能的思维方式。
编辑
我不知道为什么最初被否决了;还有关于C++中函数编程的一篇文章·约翰·卡马克(约翰),它的开头类似于我前面所说的(sans的C/Q分离部分) --这也很容易适用于Java。
https://softwareengineering.stackexchange.com/questions/184747
复制相似问题