您发现哪些设计模式适用于lambda表达式/函数?
答案 0 :(得分:2)
现在,Lambda已广泛用于IoC容器和DI(例如模拟框架)
我可以在这个区域看到以下GoF模式:
Moq正在使用Proxy
模式并积极使用lambdas;例如:
var mock = new Mock<IFoo>();
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
你可以发现lambdas有助于在IoC容器中实现Singleton
模式,例如autofac,而不像通常的Singleton那样限制自己的可测试性:
builder.Register(c => new MyClass()).SingleInstance();
和Factory Method
模式通过使用参数作为类型注册来证明构造函数调用:
builder
.Register(c => new ObjectContainer(ConnectionStrings.CustomerDB))
.As<IObjectContainer>()
.Named("CustomerObjectContainer");
另外
Expression <TDelegate>
类也与Interpreter
模式
答案 1 :(得分:1)
在某些情况下,我看到他们使用了一点点:
首先,它们非常适合对集合进行高级迭代。通常,我们只需要将某种转换应用于列表或树或其他东西。使用lambdas可以使收集处理的代码易于使用和紧凑。对于一个随机无意义的例子(在使用LINQ的C#中):
var list = new List<int>();
//...
list.Where(x => x < 10).Aggregate( (current, total) => total + current * current );
如果没有lambdas,这种代码将会非常隐蔽且不必要地大。
当使用围绕回调的API时,它们也很方便,因为很多时候我们只需要使用一次回调。它不得不编写用于一次性使用的完整函数,因为这只是使命名空间混乱的额外代码。
最后一个设计模式来自JavaScript。我不确定这是否适用于一般的lambdas,因为我不知道闭包是否是lambdas的必需组件。但是由于许多语言允许lambdas关闭变量,所以无论如何我都会提到它。
您可能知道或不知道,JavaScript能够通过基于原型的继承进行面向对象的设计。但缺点是它没有数据抽象的概念。然而,不久前发现lambda实际上可以用来提供数据抽象。通过使用匿名函数(实际上是lambdas)的闭包,我们可以实现这一点:
function Rectangle(width, height) {
this.getWidth = function() { return width; }
this.getHeight = function() { return height; }
}
由于getWidth
和getHeight
定义的闭包包含width
和height
参数,因此参数仍然可以从这些方法中使用。但是它们不会在其他任何地方维护,因此一旦Rectangle
构造函数退出,其他代码就无法访问它们。因此,width
和height
现在是Rectangle
的私有,只能通过提供的访问者方法访问。
除此之外,我会说lambdas对他们有一个很好的理论感受。支持他们的语言感觉更完整,限制更少,更少杂乱。
答案 2 :(得分:0)
Monadic模式完全基于lambda,只能在使用lambda时实现。 C#中monad的解释: http://ericlippert.com/category/monads/
C ++中的Monads: http://bartoszmilewski.com/2011/07/11/monads-in-c/
的Python: http://www.valuedlessons.com/2008/01/monads-in-python-with-nice-syntax.html