網(wǎng)站首頁(yè)被掛黑鏈百度網(wǎng)盤(pán)會(huì)員
8.1 搬移函數(shù)
? ? ? ? 模塊化是優(yōu)秀軟件設(shè)計(jì)的核心所在,好的模塊化能夠讓我在修改程序時(shí)只需理解程序的一小部分。為了設(shè)計(jì)出高度模塊化的程序,我得保證互相關(guān)聯(lián)的軟件要素都能集中到一塊,并確保塊與塊之間的聯(lián)系易于查找、直觀易懂。同時(shí),我對(duì)模塊設(shè)計(jì)的理解并不是一成不變的,隨著我對(duì)代碼的理解加深,我會(huì)知道那些軟件要素如何組織最為恰當(dāng)。要將這種理解反映到代碼上,就得不斷地搬移這些元素。
? ? ? ?任何函數(shù)都需要具備上下文環(huán)境才能存活。這個(gè)上下文可以是全局的,但它更多時(shí)候是由某種形式的模塊所提供的。對(duì)一個(gè)面向?qū)ο蟮某绦蚨?#xff0c;類作為最主要的模塊化手段,其本身就能充當(dāng)函數(shù)的上下文;通過(guò)嵌套的方式,外層函數(shù)也能為內(nèi)層函數(shù)提供一個(gè)上下文。不同的語(yǔ)言提供的模塊化機(jī)制各不相同,但這些模塊的共同點(diǎn)是,它們都能為函數(shù)提供一個(gè)賴以存活的上下文環(huán)境。
? ? ? ?搬移函數(shù)最直接的一個(gè)動(dòng)因是,它頻繁引用其他上下文中的元素,而對(duì)自身上下文中的元素卻關(guān)心甚少。此時(shí),讓它去與那些更親密的元素相會(huì),通常能取得更好的封裝效果,因?yàn)橄到y(tǒng)別處就可以減少對(duì)當(dāng)前模塊的依賴。
? ? ? ? 同樣,如果我在整理代碼時(shí),發(fā)現(xiàn)需要頻繁調(diào)用一個(gè)別處的函數(shù),我也會(huì)考慮搬移這個(gè)函數(shù)。有時(shí)你在函數(shù)內(nèi)部定義了一個(gè)幫助函數(shù),而該幫助函數(shù)可能在別的地方也有用處,此時(shí)就可以將它搬移到某些更通用的地方。同理,定義在一個(gè)類上的函數(shù),可能挪到另一個(gè)類中去更方便我們調(diào)用。
決定越難做,通常說(shuō)明“搬移這個(gè)函數(shù)與否”的重要性也越低。
8.6 移動(dòng)語(yǔ)句?
? ? ? ? 讓存在關(guān)聯(lián)的東西一起出現(xiàn),可以使代碼更容易理解。如果有幾行代碼取用了同一個(gè)數(shù)據(jù)結(jié)構(gòu),那么最好是讓它們?cè)谝黄鸪霈F(xiàn),而不是夾雜在取用其他數(shù)據(jù)結(jié)構(gòu)的代碼中間。最簡(jiǎn)單的情況下,我只需使用移動(dòng)語(yǔ)句就可以讓它們聚集起來(lái)。此外還有一種常見(jiàn)的“關(guān)聯(lián)”,就是關(guān)于變量的聲明和使用。有人喜歡在函數(shù)頂部一口氣聲明函數(shù)用到的所有變量,我個(gè)人則喜歡在第一次需要使用變量的地方再聲明它。
? ? ? ? 通常來(lái)說(shuō),把相關(guān)代碼搜集到一處,往往是另一項(xiàng)重構(gòu)(通常是在提煉函數(shù)(106))開(kāi)始之前的準(zhǔn)備工作。相比于僅僅把幾行相關(guān)的代碼移動(dòng)到一起,將它們提煉到獨(dú)立的函數(shù)往往能起到更好的抽象效果。但如果起先存在關(guān)聯(lián)的代碼就沒(méi)有彼此在一起,那么我也很難應(yīng)用提煉函數(shù)(106)的手法。
?