从OO到10000英尺的功能编程

时间:2009-09-22 14:52:25

标签: haskell f# functional-programming

我一直在使用f#和Haskell来学习函数式编程。直到我能在我们公司获得f#批准,我仍然必须使用c#。我仍然在努力保持功能风格,因为我注意到了几个好处。

这是一个典型的问题。

  1. 中有一个键集表 数据库有3个密钥(650万 行)
  2. 另外还有4个支持 中小型桌子。
  3. 基于几个输入有复杂的公式。
  4. 我必须使用上述所有数据来计算一个值,并将其与每个键集行相关联,然后将其发送回数据库。其他4个表有很多查找。出于性能考虑,这一切都是在内存中完成的。

    我确切地知道如何使用静态字典,对象模型,策略模式等在OO中进行操作,但是在功能性方面我无法摆脱使用这些结构的难闻气味。

    我目前正在为功能性解决方案做出以下假设。

    1. 静态词典很糟糕。看起来这个功能可能有副作用。

    2. 我需要一个Calculate函数,它接受一个不可变对象,并返回一个带有三个键和计算值的不可变对象。在这个函数里面可能有同样风格的另一个函数。

    3. 传统的OO模式可能不起作用。

    4. 你会如何在高水平上设计它?

      我错了吗?我错过了什么吗?

4 个答案:

答案 0 :(得分:6)

不,你没错。 OOP和函数式编程都有其优点和缺点。

开发人员需要知道如何以及何时使用每种开发风格。幸运的是,C#支持两种开发方式。

在我看来,我每天都使用函数式和oop编程样式,oop在处理复杂的交互和各种抽象工件(实体,名词等)之间的相互依赖性时最好。在处理算法,数据转换等时,最好使用函数式编程。解决特定问题所需的语句复杂性很大的情况。

我通常在我的域(实体,聚合,值对象,存储库和事件)上使用面向对象编程,并为我的服务对象保留函数式编程。

大多数情况下,它会产生气味或感觉最好,因为在软件开发过程中,无论是哪种方式都不是明确的案例,而经验和实践往往是给定选择的最佳判断。

答案 1 :(得分:2)

如果您正在寻找速度,您可能需要考虑使用的基础数据结构。字典<>在C#中是一个哈希表,而SortedDictionary<>在C#中是一个二叉搜索树。

F#和Haskell都很好地表示了树数据结构。您可能需要考虑使用比C#提供的默认数据结构更具体的数据结构。

在高级别,我会找出你的公式显示的性能特征,并将它们与不同的数据结构进行比较(如果你需要复习,维基百科是一个很好的来源)。一旦你弄清楚要使用哪些数据结构,我就会担心要使用哪些实现。

答案 2 :(得分:1)

  

你会如何在高水平上设计它?

基本上,您使用高阶函数将工作分解为具有较低语法开销的可重用组件。然后,您可能希望从命令式数据结构迁移到纯功能数据结构(纯粹的功能计算包含在IO的副作用中,如数据库写入)。最后,您甚至可以跟踪副作用(完全纯粹的功能)。

作为一个粗略的指南,这三个完全纯度的等级首先在Lisp(很大程度上不纯),标准ML(纯粹使用纯功能数据结构)和Haskell(完全纯度)中看到。

在不知道确切问题的情况下,我无法提供更多具体信息,但您可以放心,现在很多人每天都这样做,而且效果非常好。

答案 3 :(得分:0)

OO语言中的函数式编程往往是错误的。它产生过于冗长的代码,这些代码表现不佳并且更容易出错(例如用不支持尾调用的语言编写深度递归函数。)

  

Blockquote 1.静态词典很糟糕。看起来这个功能可能有副作用。

它是否有副作用。静态字典可以是用OO语言实现memoization的好方法。

  

Blockquote 3.传统的OO模式可能不起作用。

OO模式在OO语言中运行良好,试图将角斗FP技术转换为OO语言将产生冗长和脆弱的代码。这有点像尝试使用锤子技术的螺丝刀确定它会产生结果,但有更好的方法。尽可能以最佳方式使用您的工具。某些FP技术可能很有用,但完全忽略该语言不会产生高质量的代码。