新聞中心
【精選譯文】編寫(xiě)代碼有許多方法。有時(shí)候,我們編寫(xiě)代碼盡可能簡(jiǎn)單,如直接使用內(nèi)聯(lián)運(yùn)算(inline calculations);有時(shí)我們卻會(huì)給代碼添加一些間接的層次。雖然這些間接的、抽象的層次使得我們?cè)诶斫獯a時(shí)更困難一些,但它卻增加了程序的靈活性和動(dòng)態(tài)性,這些特性對(duì)程序來(lái)說(shuō)是非常實(shí)用而且有益的。

創(chuàng)新互聯(lián)長(zhǎng)期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為汪清企業(yè)提供專業(yè)的網(wǎng)站制作、做網(wǎng)站,汪清網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
本文將向你介紹如何使用Lambda表達(dá)式來(lái)作為函數(shù)的參數(shù),從而支持動(dòng)態(tài)函數(shù)行為。如果你在程序的關(guān)鍵地方存在類似需求的話,那么使用這種方法你將創(chuàng)建一個(gè)更加靈活、功能強(qiáng)大的解決方案。
大多數(shù)情況
此時(shí),大量的代碼是用直接的方式進(jìn)行編寫(xiě)。假設(shè),你編寫(xiě)一個(gè)應(yīng)用程序來(lái)計(jì)算營(yíng)業(yè)稅,直接寫(xiě)出計(jì)算過(guò)程是合理的。例如,美國(guó)密歇根州目前的銷售稅為6%,要計(jì)算營(yíng)業(yè)稅的話,你可以這樣寫(xiě):
- Dim total as Double = value * (1 + .06)
如果把這種計(jì)算寫(xiě)成內(nèi)聯(lián)形式的話,那問(wèn)題很快就會(huì)解決掉,但它并不是一種靈活的、可重用的解決方案。下一步的改進(jìn)方案是定義一個(gè)函數(shù)來(lái)執(zhí)行計(jì)算,你可以為該函數(shù)提供可選參數(shù)。例如,你可以將計(jì)算表達(dá)式放到一個(gè)函數(shù)中去,使稅款總額成為一個(gè)可選項(xiàng),同時(shí)提供稅款最常見(jiàn)的默認(rèn)值。清單1顯示的的是將計(jì)算過(guò)程轉(zhuǎn)移到一個(gè)函數(shù)中的代碼。
清單1:帶有可選默認(rèn)值和常規(guī)函數(shù)的可重用代碼
- Function CalculateSalesTax(ByVal total As Double, _
- Optional ByVal tax As Double = 0.06) As Double
- Return total * (1 + tax)
- End Function
#T#所有能夠編寫(xiě)出類似清單1中帶有可選參數(shù)代碼的初級(jí)程序員最終都會(huì)被聘用。
清單1中的解決方案是實(shí)用的,它能夠滿足很多情況的需求。這種解決方案唯一的缺點(diǎn)是它不靈活。您可以將金錢(qián)總額和稅收數(shù)額一起傳遞,并且計(jì)算結(jié)果始終是相同的。此外,正如我之前所說(shuō)的那樣,對(duì)于定義函數(shù)解決方案而言,一個(gè)恰當(dāng)命名的函數(shù)是可重用的,并且可以進(jìn)行自我注釋的。然而有些時(shí)候,你需要編寫(xiě)一個(gè)更加靈活的解決方案。
個(gè)別情況
有時(shí),特別當(dāng)你正在編寫(xiě)一些將被別人使用的代碼時(shí),您需要編寫(xiě)得更加靈活。你可以通過(guò)加入更多的函數(shù)參數(shù)來(lái)使你的代碼更加靈活。函數(shù)參數(shù)的使用意味著該行為的一部分將以函數(shù)的形式進(jìn)行傳遞。一般情況下,如果你不關(guān)心函數(shù)必須支持的所有情況,那么你可以使用這種編程方式。
您可以使用多種方法來(lái)定義函數(shù)參數(shù)。您可以定義一個(gè)委托(delegate)或者是定義一個(gè)函數(shù)——把參數(shù)類型作為委托類型的參數(shù),也可以使用預(yù)先存在的泛型委托,例如Func。為了提供功能參數(shù),您可以添加一個(gè)現(xiàn)有的第二函數(shù)和AddressOf運(yùn)算符,您也可以傳遞一個(gè)Lambda表達(dá)式。清單2演示了如何定義一個(gè)使用了預(yù)定義Func泛型委托的函數(shù)參數(shù),并且滿足Lambda表達(dá)式的參數(shù)要求。
清單2:帶有滿足Lambda表達(dá)式參數(shù)的函數(shù)。
- Module Module1
- Sub Main()
- Dim total = CalculateSalesTax(100, 0.06, _
- Function(sale, tax) sale * (1 + tax))
- Console.WriteLine(total)
- Console.ReadLine()
- End Sub
- Function CalculateSalesTax(ByVal total As Double, _
- ByVal tax As Double, _
- ByVal calculator As Func(Of Double, Double, Double)) _
- As Double
- Return calculator(total, tax)
- End Function
- End Module
CalculateSalesTax把它所收到所有行為作為第三個(gè)參數(shù)。第三個(gè)參數(shù)定義為Func(Of Double, Double, Double),這是一個(gè)泛型委托。其他泛型委托分別為行動(dòng)(T)和謂詞(Of T)。
計(jì)算器參數(shù)可滿足任何函數(shù),它有兩個(gè)double參數(shù)和double返回類型。這可能是一個(gè)函數(shù)地址,或是一個(gè)分配給相同類型變量(Func(Of Double, Double, Double))的Lambda表達(dá)式,也可能就是一個(gè)Lambda表達(dá)式。
清單2中的計(jì)算參數(shù)滿足Lambda表達(dá)式
- Function(sale, tax) sale * (1 + tax)
Lambda表達(dá)式只是一個(gè)非常簡(jiǎn)單的函數(shù)。它使用函數(shù)的關(guān)鍵字,其參數(shù)名可以選擇帶或不帶參數(shù)類型,以及一些執(zhí)行工作的語(yǔ)句,其函數(shù)結(jié)尾、函數(shù)名稱,以及關(guān)鍵字return均不是必需的。
編寫(xiě)類似代碼使得消費(fèi)者(使用這些代碼的程序員)可以決定傳遞給函數(shù)的行為,比如說(shuō)CalculateSalesTax 的例子??梢钥聪逻@種情況,營(yíng)業(yè)稅的稅率是固定的,除非總金額高于5萬(wàn)元美元。雖然這些高價(jià)奢侈稅在美國(guó)一些州中是強(qiáng)行征收的,但是消費(fèi)者可以將奢侈稅納入另一個(gè)替代函數(shù)中。清單3顯示了一個(gè)替代的代碼(其中包括一個(gè)與奢侈稅有關(guān)的任意值)。
清單3: 在清單2的基礎(chǔ)上增加了額外功能的替代解決方案。
- Module Module1
- Sub Main()
- Dim calculator = Function(sale, tax) IIf(sale > 25000, _
- sale * (1 + tax + 0.02), sale * (1 + tax))
- Dim total = CalculateSalesTax(100000, 0.06, calculator)
- Console.WriteLine(total)
- Console.ReadLine()
- End Sub
- Function CalculateSalesTax(ByVal total As Double, _
- Optional ByVal tax As Double = 0.06) As Double
- Return total * (1 + tax)
- End Function
- Function CalculateSalesTax(ByVal total As Double, ByVal tax As Double, _
- ByVal calculator As Func(Of Double, Double, Double)) As Double
- Return calculator(total, tax)
- End Function
- End Module
請(qǐng)注意,在該解決方案中,一個(gè)新的Lambda表達(dá)式分配給了一個(gè)匿名變量。新的Lambda表達(dá)式使用IIf函數(shù)來(lái)判定銷售金額是否超過(guò)了25,000元;額外花費(fèi)的金額將被添加到征收奢侈稅的列表中。
總結(jié)
該解決方案中的代碼使用了一個(gè)Lambda表達(dá)式和一些函數(shù)參數(shù)。該解決方案可重復(fù)使用,非常靈活,因?yàn)槎x函數(shù)參數(shù)意味著以后的消費(fèi)者可以提供該解決方案中的一部分(參數(shù)部分)。
原文:Dynamic Programming with Lambda Expressions 作者:Paul Kimmel
分享標(biāo)題:Lambda表達(dá)式動(dòng)態(tài)函數(shù)編程:更加靈活強(qiáng)大
鏈接分享:http://fisionsoft.com.cn/article/coecceh.html


咨詢
建站咨詢
