加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何混合明显不兼容的范例:OOP和FP?

发布时间:2020-12-16 08:58:23 所属栏目:安全 来源:网络整理
导读:回读一些我的 Scala代码,我注意到它是功能性的或面向对象的. 实际上,我不知道如何调解不可变类型和纯函数隐含的无副作用规则以及OO的前提,其中方法就地修改实例状态,这显然是副作用. 我正在研究的一个解决方案是使所有方法返回具有适当状态修改的当前实例的
回读一些我的 Scala代码,我注意到它是功能性的或面向对象的.

实际上,我不知道如何调解不可变类型和纯函数隐含的无副作用规则以及OO的前提,其中方法就地修改实例状态,这显然是副作用.

我正在研究的一个解决方案是使所有方法返回具有适当状态修改的当前实例的克隆.似乎很渴望,但在我决定对代码进行并列化时可能会有所帮助,对吧?

混合这两种范式的最佳做法是什么?什么是平衡?

谢谢.

解决方法

我想我实际上对你构建这个问题的方式有疑问:

Indeed,I have no idea on how to conciliate the no-side effects rule implied by immutable types and pure functions and the premise of OO,where methods modify instance state in-place,which is obviously side-effects.

我不会说对象字段的变异操作是OO的核心“前提”.完全没有(尽管相反我认为不变性是FP的核心前提).对我而言,OO是一种比其他任何方式更多地考虑程序模块性的方法.

在我的(也许是扭曲的)思维模式中,即使是Haskell–一种主张经常以OO风格思维畏缩的语言 – 仍然体现了一些OO概念,从某种意义上说,它有一个模块系统,各种方式封装数据类型的实现细节,另一方面,虽然它非常笨拙和恶化,但我的Java代码往往会大量使用currying等基本功能概念.

换句话说,我认为这两种方法在某种意义上是互补的.

现在,在一个不那么理论化和更具螺栓的水平……让我们说你有类似的东西:

class Foo(val a : A,val b : B,val c : C) {
  def setB(newb : B) : Foo = new Foo(a,newb,c)
}

…所以你可以像你在原帖中所建议的那样说newFoo = foo.setB(b).我会说这是完全优秀的风格,而不是引起关注(关于性能或可读性或任何东西).你会在Scala库中看到大量的不可变集合类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读