如何理解Lambda表達(dá)式和依賴倒置,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
創(chuàng)新互聯(lián)建站致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷,提供網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營(yíng)銷、小程序設(shè)計(jì)、公眾號(hào)商城、等建站開發(fā),創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。
Lambda表達(dá)式、依賴倒置
依賴倒置原則的實(shí)現(xiàn)也會(huì)在最后來(lái)粗略的講解一下。 沒(méi)有核心的主題,如果說(shuō)要強(qiáng)制定義的話就是這些內(nèi)容都是基礎(chǔ)知識(shí),是為了后續(xù)學(xué)習(xí)MVC框架做鋪墊。
Lambda表達(dá)式在日常的開發(fā)中很常見(jiàn),使用Lambda表達(dá)式可以自由的定義函數(shù)體并且精簡(jiǎn)代碼量,那么Lambda表達(dá)式是什么呢?
Lambda表達(dá)式是匿名函數(shù),而匿名函數(shù)又是委托,所以lambda表達(dá)式就是委托。(編譯成中間語(yǔ)言后有一點(diǎn)小小的區(qū)別,不過(guò)大致是一樣的)
1.1 Lambda的定義
既然說(shuō)到Lambda是委托了,那就的有個(gè)類型,這里我們使用的是.NET給我們提供的Fun
1.2 相互認(rèn)識(shí)
示例代碼1.1-1
1 private bool Comparison(int num1, int num2) 2 { 3 if (num1 > num2) 4 { 5 return true; 6 } 7 else 8 { 9 return false; 10 } 11 }
1 FuncComparisonNum = new Func (Comparison); 2 Comparison(5, 3);//return true
上面的示例中明顯,很簡(jiǎn)單的定義了Func
示例代碼1.1-2
1 FuncComparisonNum= 2 delegate(int num1,int num2) 3 { 4 if (num1 > num2) 5 { 6 return true; 7 } 8 else 9 { 10 return false; 11 } 12 };
1 ComparisonNum(3, 5);//return false
從代碼1.1-2中可以看出,使用匿名委托和上面的那個(gè)1.1-1沒(méi)有什么大大的區(qū)別,只不過(guò)匿名委托簡(jiǎn)便了一點(diǎn)。下面再來(lái)看使用Lambda表達(dá)式的示例。
示例代碼1.1-3
1 FuncComparisonNum = (num1, num2) => { return num1 > num2; };
1.1-3代碼中在=>左邊的"(num1,num2)"是要使用的參數(shù),根據(jù)Func
示例代碼1.1-4
1 FuncComparisonNum = (int num1,int num2) => { return num1 > num2; };
1.1-3使用的是簡(jiǎn)便的寫法,因?yàn)橛蠽S這么強(qiáng)大環(huán)境的支持,可以根據(jù)前面變量定義的委托類型,自動(dòng)的設(shè)置為L(zhǎng)ambda表達(dá)式參數(shù)類型,以求符合前面類型的定義,而=>的右邊則是Lambda表達(dá)式的函數(shù)主體,同匿名委托一個(gè)道理。這一小節(jié)對(duì)Lambda只是作了很簡(jiǎn)單的一個(gè)示例,意在讓讀者基礎(chǔ)的了解到這方面的內(nèi)容,篇幅的原因就不多說(shuō)了。
設(shè)計(jì)原則是在設(shè)計(jì)模式或者是框架設(shè)計(jì)中都有遵循著的。這一節(jié)就講解一下依賴倒置原則的實(shí)現(xiàn)之一依賴注入。
在工作中學(xué)習(xí)中,面向抽象編程、依賴于抽象不依賴于具體這些話語(yǔ)是經(jīng)常性的見(jiàn)到,本節(jié)中的示例都會(huì)涉及到這些概念,很簡(jiǎn)單的一個(gè)示例讓大家有個(gè)了解。
1 public class Entity 2 { 3 }
這里先定義了一個(gè)實(shí)體類,只是用作演示,沒(méi)有什么具體功能,
1 public class ObjectFactory 2 { 3 public Entity CreateObject() 4 { 5 return new Entity(); 6 } 7 }
然后又定義一個(gè)工廠,用作獲取到Entity類型的實(shí)例,
1 public class IocController 2 { 3 public static Entity GetEntity() 4 { 5 ObjectFactory entityFactory = new ObjectFactory(); 6 return entityFactory.CreateObject(); 7 } 8 }
這是一個(gè)控制器,客戶端在獲得Entity類型的唯一依賴,在客戶端只會(huì)IocController.GetEntity();這樣來(lái)獲得Entity實(shí)例。而我們要做的就是降低IocController和ObjectFactory的耦合度,其它的都不需要管了。
如圖1
這時(shí)候的依賴關(guān)系正如上圖所示的這樣,那就要靠依賴抽象去解耦了。
1 public interface IObjectFactory 2 { 3 Entity CreateObject(); 4 } 5 public class ObjectFactory:IObjectFactory 6 { 7 public Entity CreateObject() 8 { 9 return new Entity(); 10 } 11 }
是的,對(duì)ObjectFactory類型進(jìn)行了抽象,有了IObjectFactory接口類型。
圖2
這個(gè)時(shí)候在腦海中的圖形是不是應(yīng)該是如圖2所示的那樣,想象確實(shí)是美好的,但是現(xiàn)實(shí)卻不是這樣。
1 public class IocController 2 { 3 public static Entity GetEntity() 4 { 5 IObjectFactory entityFactory = new ObjectFactory(); 6 return entityFactory.CreateObject(); 7 } 8 }
這時(shí)候的依賴關(guān)系應(yīng)該是像圖3這樣,
圖3
感覺(jué)是不是很糟糕,沒(méi)關(guān)系,稍作修改,讓依賴合理的注入就可以完成解耦,
1 public class IocController 2 { 3 private static IObjectFactory objectFactory; 4 5 public static void SetObjectFactory(IObjectFactory objectfactory) 6 { 7 objectFactory=objectfactory; 8 } 9 10 public static Entity GetEntity() 11 { 12 return objectFactory.CreateObject(); 13 } 14 }
這個(gè)時(shí)候的關(guān)系依賴圖就像圖2所示的那樣了。 這里要說(shuō)的就是在IocController中私有的靜態(tài)字段和靜態(tài)函數(shù)都可以轉(zhuǎn)為實(shí)例的,在IocController中定義一個(gè)靜態(tài)的IocController類型來(lái)實(shí)現(xiàn)自身的一個(gè)單例模式,然后調(diào)用實(shí)例方法。 因?yàn)槭莻€(gè)示例,著重于依賴注入的解釋就不完善這個(gè)類型了,就用語(yǔ)言描述一下, 這樣的設(shè)計(jì)的思路就類似于ASP.NETMVC中ControllerBuilder的樣子,也就是構(gòu)造函數(shù)注入。
看完上述內(nèi)容,你們掌握如何理解Lambda表達(dá)式和依賴倒置的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!