2011-08-08 44 views

回答

2

lambda表達式正在積極在IoC容器和DI(例如模擬框架)目前使用

我可以看到以下在這方面的GOF模式:

Moq的使用Proxy圖案與活性使用lambda表達式;例如:

var mock = new Mock<IFoo>(); 
mock.Setup(foo => foo.DoSomething("ping")).Returns(true); 

您可以找到lambda表達式有助於實現IoC容器Singleton模式,例如autofac,不限制自己的可測性,像往常一樣單身的作用:

builder.Register(c => new MyClass()).SingleInstance(); 

而且通過Factory Method模式通過參數類型註冊驗證構造函數調用的方法:

builder 
    .Register(c => new ObjectContainer(ConnectionStrings.CustomerDB)) 
    .As<IObjectContainer>() 
    .Named("CustomerObjectContainer"); 

Expression <TDelegate>類也密切相關,Interpreter模式

+0

+1。我認爲代表團也是一種設計模式。 –

1

還有的地方我看到他們使用的公平位幾種情況:

原因之一,他們是偉大的高層次遍歷所有藏品。通常,我們只需要對列表或樹或其他東西應用某種變形。使用lambdas可以爲收集處理提供易於使用和簡潔的代碼。對於(使用LINQ在C#)隨機無意義例如:

var list = new List<int>(); 
//... 
list.Where(x => x < 10).Aggregate((current, total) => total + current * current); 

沒有lambda表達式,這種代碼將是可怕和不必要地大。

它們在使用圍繞回調的API時也很方便,因爲有很多次我們只需要使用一次回調。它不得不編寫一次性使用的完整函數,因爲這只是使命名空間混亂的額外代碼。

最後的設計模式來自JavaScript。我不確定這是否適用於一般的lambda表達式,因爲我不知道閉包是lambda表達式的必需組件。但是由於許多語言允許lambda關閉變量,所以我會提及它。

正如您可能或不知道的那樣,JavaScript通過基於原型的繼承可以實現面向對象的設計。但是一個缺點是它沒有數據抽象的概念。然而,後來發現lambda可以用來提供數據抽象。通過使用匿名函數的封閉件(這確實是lambda表達式),我們可以實現此目的:

function Rectangle(width, height) { 
    this.getWidth = function() { return width; } 
    this.getHeight = function() { return height; } 
} 

由於由getWidthgetHeight限定的封閉件包括widthheight參數,參數是仍然從方法中使用。但是它們不在其他地方維護,所以一旦構造函數退出,其他代碼就無法訪問它們。因此,widthheight現在爲Rectangle私有,並且只能通過提供的存取方法訪問。

除了那些,我會說lambda對他們有一個很好的理論感覺。支持他們的語言感覺更完整,限制更少,並且不那麼混亂。

相關問題