函数式编程如何影响您的编码风格?

时间:2009-07-09 13:09:34

标签: functional-programming

现在大多数程序员都使用OOPS概念进行软件开发。

但是他们中的一些人也接触过函数式编程。

函数式编程如何影响您的编码风格?

10 个答案:

答案 0 :(得分:6)

主要用途是将函数传递给高阶函数,如过滤器和映射(在.Net中的Where和Select)这实际上是最大的影响,允许你像set动作一样写东西,然后就是或修改集。

这样的东西
var SquareOfEvenIntegers = MyListOfInts
    .Where(i=>even(i))
    .Select(i=>i*i);

而不是

List<int> SquareOfEvenIntegers = new List<int>()
foreach(int i in MyListOfInts)
{
    if (even(i))
    {
        SquareOfEvenIntegers.Add(i*i);            
    }
}

答案 1 :(得分:5)

我发现现在编写多线程代码要容易得多。

我倾向于拥有比以前更少的班级变量。

我也倾向于拥有功能独立的接口......再次说到多线程有很大的好处,因为它可以大大减少所需的对象锁定量,前提是你的线程在功能上也是独立的。

我也倾向于做关于追逐括号的噩梦。

答案 2 :(得分:4)

我想到的两件事源于我正在采用的函数式编程:

  • 更改将类变量更改为返回值的方法的void方法
  • 使类不可变,而不是使用setter(JavaBeans antipattern)

答案 3 :(得分:3)

编写了一大块Haskell意味着我在C#代码中使用Linq to SQL要容易得多。

我现在非常倾向于编写获取结果并返回结果的代码,而不是将变量修改为副作用。

我已经编写了大量的过程代码和功能代码,这使我更容易将代码分解为更小的一个样式或另一个样式。当我只知道程序/ oop编程时,我的心理工具箱中的工具较少。

在Haskell中读取库源已经教会了我如何更好地将代码简化为将抽象与实际任务分开。

我从写Haskell中获得了很多!

答案 4 :(得分:2)

在某种程度上,我发现它在我无意识地使用功能样式编程方面有多么惊人,并没有认识到它是什么。

例如,在Java中,我大量使用Commons Collections中的构造,例如Transformer和Predicate,它们本质上是闭包,但是实现为Java接口。然后,您可以使用提供的实用程序函数来转换和过滤集合中的元素。这违背了用Java做这种事情的“标准”命令式方法。

这些当然是香草功能图和过滤操作,但我本能地使用它们而没有意识到它是什么。这向我表明,功能风格在很大程度上是直观的,即使你没有被告知它。

答案 5 :(得分:1)

闭包的事件处理程序;

button.OnClick += (sender, args) => MessageBox.Show("we captured " + someCapturedVariable);

答案 6 :(得分:1)

我发现Python 3.x转向迭代器对我来说非常自然,因为它让我想起了Haskell的懒惰评估。

真的,无论是使用Python 2.x还是Python 3.x,list comprehensionsmapitertoolsoperator和(稍微延伸一点){{ 3}},是我的朋友们!

答案 7 :(得分:1)

由于函数式编程与OOP正交,因此我真正开始关注如何构造类。

  • 我倾向于拥有更有意义的接口,类似于概念。
  • 我的代码更好地解耦,我有更小的有意义的类。我很少创建一个类来实现模式。
  • 我创建更少的setter而不是调用不同的成员函数来计算我想要的值并将其传递给单个setter。
  • 在进行函数式编程之前,我绝不会想到在尝试解决问题时将函数作为参数传递给解决方案。现在这个解决方案刚刚出现在我脑海中,真的对DRY有帮助。
  • 我的代码包含更多表达式而不是语句。
  • 如果解决方案允许,我倾向于懒惰的评估。

答案 8 :(得分:0)

功能编程和OO不是不相交的概念。我看到的函数式语言的一个缺点是缺乏ADT表达能力。我在OO语言中看到的函数式编程最接近的是Eiffel。通过约定函数是引用透明的,如果强制执行它将是理想的。

答案 9 :(得分:0)

我在

中写了一些相关内容

How does functional programming affect the structure of your code?

有些是F#特定的,但那里有很多一般观察。