你的編程語言可以這樣做嗎?
2024-09-06 12:44:58
供稿:網友
有一天,你在瀏覽自己的代碼,發現有兩大段代碼幾乎一樣。實際上,它們確實是一樣的——除了一個關于意大利面(Spaghetti)而另一個關于巧克力慕思(Chocolate Moose)。
// 一個小例子:
alert("偶要吃意大利面!");
alert("偶要吃巧克力慕思!");
嗯,這個例子碰巧是用javascript寫的,不過你就算不懂JavaScript,應該也能明白它在干什么。
拷貝代碼不好。于是,你創建了個函數
function SwedishChef( food ){
alert("偶要吃" + food + "!");
}
SwedishChef("意大利面");
SwedishChef("巧克力慕思");
Ok,這只是一個很小很小的例子而已,相信你能想像到個更實際一點的例子。這段代碼有很多優點,你全都聽過幾萬次了:可維護性、可讀性、抽象性 = 好!
現在你留意到有另外兩段代碼幾乎跟它們一模一樣,除了一個反復調用一個叫BoomBoom的函數,另一個反復調用一個叫PutInPot的。除此之外,這兩段代碼簡直沒什么兩樣:
alert("拿龍蝦");
PutInPot("龍蝦");
PutInPot("水");
alert("拿雞肉");
BoomBoom("雞肉");
BoomBoom("椰子醬");
現在要想個辦法,使得你可以將一個函數用作另一個函數的參數。這是個重要的能力,因為你更容易將框架代碼寫成一個函數(emu注:還記得template method模式吧?)。
function Cook( i1, i2, f ){
alert("拿" + i1);
f(i1);
f(i2);
}
Cook( "龍蝦", "水", PutInPot );
Cook( "雞肉", "椰子醬", BoomBoom );
看看,我們居然把函數當成調用參數傳遞了!
你的編程語言能辦到嗎?
等等……假如我們已經有了PutInPot和BoomBoom這些函數的具體實現代碼(而且又不需要在別的地方重用它們),那么用內聯語法把它們寫進函數調用里面不是比顯式的聲明這兩個函數更漂亮嗎?
Cook( "龍蝦",
"水",
function(x) { alert("pot " + x); } );
Cook( "雞肉",
"椰子醬",
function(x) { alert("boom " + x); } );
耶,真方便!請注意我只是隨手創建了個函數,甚至不用考慮怎么為它起名,只要拎著它的耳朵把它往一個函數里頭一丟就可以了。