你的編程語(yǔ)言可以這樣做嗎?(map/reduce的js示范)
有一天,你在瀏覽自己的代碼,發(fā)現(xiàn)有兩大段代碼幾乎一樣。實(shí)際上,它們確實(shí)是一樣的——除了一個(gè)關(guān)于意大利面(Spaghetti)而另一個(gè)關(guān)于巧克力慕思(Chocolate Moose)。
// 一個(gè)小例子: alert("偶要吃意大利面!"); alert("偶要吃巧克力慕思!");
嗯,這個(gè)例子碰巧是用javascript寫(xiě)的,不過(guò)你就算不懂JavaScript,應(yīng)該也能明白它在干什么。
拷貝代碼不好。于是,你創(chuàng)建了個(gè)函數(shù)
function SwedishChef( food ){ alert("偶要吃" + food + "!"); }
SwedishChef("意大利面"); SwedishChef("巧克力慕思");
Ok,這只是一個(gè)很小很小的例子而已,相信你能想像到個(gè)更實(shí)際一點(diǎn)的例子。這段代碼有很多優(yōu)點(diǎn),你全都聽(tīng)過(guò)幾萬(wàn)次了:可維護(hù)性、可讀性、抽象性 = 好!
現(xiàn)在你留意到有另外兩段代碼幾乎跟它們一模一樣,除了一個(gè)反復(fù)調(diào)用一個(gè)叫BoomBoom的函數(shù),另一個(gè)反復(fù)調(diào)用一個(gè)叫PutInPot的。除此之外,這兩段代碼簡(jiǎn)直沒(méi)什么兩樣:
alert("拿龍蝦"); PutInPot("龍蝦"); PutInPot("水");
alert("拿雞肉"); BoomBoom("雞肉"); BoomBoom("椰子醬");
現(xiàn)在要想個(gè)辦法,使得你可以將一個(gè)函數(shù)用作另一個(gè)函數(shù)的參數(shù)。這是個(gè)重要的能力,因?yàn)槟愀菀讓⒖蚣艽a寫(xiě)成一個(gè)函數(shù)(emu注:還記得template method模式吧?)。
function Cook( i1, i2, f ){ alert("拿" + i1); f(i1); f(i2); }
Cook( "龍蝦", "水", PutInPot ); Cook( "雞肉", "椰子醬", BoomBoom );
看看,我們居然把函數(shù)當(dāng)成調(diào)用參數(shù)傳遞了!
你的編程語(yǔ)言能辦到嗎?
等等……假如我們已經(jīng)有了PutInPot和BoomBoom這些函數(shù)的具體實(shí)現(xiàn)代碼(而且又不需要在別的地方重用它們),那么用內(nèi)聯(lián)語(yǔ)法把它們寫(xiě)進(jìn)函數(shù)調(diào)用里面不是比顯式的聲明這兩個(gè)函數(shù)更漂亮嗎?
Cook( "龍蝦", "水", function(x) { alert("pot " + x); } ); Cook( "雞肉", "椰子醬", function(x) { alert("boom " + x); } );
耶,真方便!請(qǐng)注意我只是隨手創(chuàng)建了個(gè)函數(shù),甚至不用考慮怎么為它起名,只要拎著它的耳朵把它往一個(gè)函數(shù)里頭一丟就可以了。
出處:joelonsoftware.com
責(zé)任編輯:moby
上一頁(yè) 下一頁(yè) 你的編程語(yǔ)言可以這樣做嗎? [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|