日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
C語(yǔ)言的面向?qū)ο笫街貥?gòu)

重構(gòu)(Refactoring)就是在不改變軟件現(xiàn)有功能的基礎(chǔ)上,通過(guò)調(diào)整程序代碼改善軟件的質(zhì)量、性能,使其程序的設(shè)計(jì)模式和架構(gòu)更趨合理,提高軟件的擴(kuò)展性和維護(hù)性。

在越來(lái)越多的方便實(shí)用的語(yǔ)言曾不出窮的今天,c語(yǔ)言作為編程語(yǔ)言的常青樹(shù),在用戶數(shù)方面仍然占據(jù)著老大的地位。當(dāng)然,這與C語(yǔ)言的使用環(huán)境有很大關(guān)系,諸多的嵌入式和底層代碼仍然離不開(kāi)這個(gè)經(jīng)典的語(yǔ)言。

最近工作有了個(gè)空,如何使自己寫(xiě)的C代碼容易閱讀,便于維護(hù),成為近期我思考的主要問(wèn)題。

于是,我找到了Martin Fowler寫(xiě)的《重構(gòu)》。這本書(shū)從Martin的經(jīng)驗(yàn)出發(fā),結(jié)合代碼中出現(xiàn)的各種“臭味”,提出了重構(gòu)的思路、指導(dǎo)思想和重構(gòu)步驟,從而使得代碼不斷的得到進(jìn)化,從而使得代碼越來(lái)越優(yōu)美,越來(lái)越適應(yīng)于變化,越來(lái)越便于維護(hù)。這本書(shū)雖然是針對(duì)Java語(yǔ)言寫(xiě)的,但是大量的重構(gòu)思路都是語(yǔ)言無(wú)關(guān)的,我們?cè)谌魏握Z(yǔ)言中都可能遇到Martin大師描述的問(wèn)題,并能夠利用Martin的解決思路來(lái)改正問(wèn)題?,F(xiàn)在,就把我看這本書(shū)的一些想法、思路記錄下來(lái),也算是一個(gè)讀書(shū)筆記吧。

一、函數(shù)的改進(jìn)

過(guò)程化語(yǔ)言直接面對(duì)的是要解決問(wèn)題的系統(tǒng)責(zé)任,也就是系統(tǒng)的功能域。要實(shí)現(xiàn)什么樣的功能,采用什么樣的流程來(lái)解決,這些內(nèi)容的實(shí)現(xiàn)都是由函數(shù)來(lái)完成的。因此,函數(shù)的重新構(gòu)建成為C語(yǔ)言重構(gòu)的最重要的一環(huán)。

1、重新命名函數(shù)

代碼首先是為人寫(xiě)的,其次才是為機(jī)器寫(xiě)的。函數(shù)的名稱(chēng)應(yīng)該準(zhǔn)確表達(dá)出它的用途。當(dāng)我們維護(hù)代碼時(shí),通過(guò)名稱(chēng)猜出這個(gè)函數(shù)的用途可以節(jié)省大量的時(shí)間。想想自己的一些經(jīng)歷,通過(guò)費(fèi)力的閱讀代碼才能明白,哦,它原來(lái)是干這個(gè)的!如果有個(gè)好的名稱(chēng)該多好,看看名字,就能大概得到這個(gè)函數(shù)的用途,有了這個(gè)大概情況,再去閱讀代碼,是那么的輕松、愉快。

有些人會(huì)想,我寫(xiě)的是C程序,不是Java語(yǔ)言。C語(yǔ)言要求的是簡(jiǎn)潔的名稱(chēng),而不是Java那樣,恨不能名字比實(shí)現(xiàn)的代碼還長(zhǎng)。我覺(jué)得,簡(jiǎn)潔不代表含糊不清。我們都有默許的規(guī)范,read就是代表讀,取一個(gè)名字叫rfile(),我就會(huì)猜它是讀文件;要是叫sfile(),誰(shuí)知道它是什么?

2、提煉函數(shù)

過(guò)長(zhǎng)的函數(shù)當(dāng)中,多半會(huì)有很多繁雜的過(guò)程包含在里面。當(dāng)我們需要不斷的上下翻頁(yè)來(lái)了解一個(gè)函數(shù)的功能時(shí),很快就會(huì)不可耐煩,并且喪失信心。因此要想讓函數(shù)變得容易讓人看懂,就得盡量讓函數(shù)簡(jiǎn)練。這就得把函數(shù)功能細(xì)化,不斷的提煉函數(shù)。每個(gè)函數(shù)都有其基本的功能,使得函數(shù)復(fù)用的機(jī)會(huì)很大,復(fù)雜函數(shù)就是這些小函數(shù)的組合,這樣復(fù)雜函數(shù)讀起來(lái)就像一系列注釋?zhuān)ㄋ滓锥?/p>

3、提煉判斷條件

有時(shí)候在判斷條件當(dāng)中,會(huì)遇到一個(gè)很長(zhǎng)的表達(dá)式表示一個(gè)條件分支,這個(gè)表達(dá)式有時(shí)不光包含了“與”、“或”、“非”,還有查詢(xún)函數(shù),大于小于等等。要看懂這么一個(gè)表達(dá)式,首先要做的是查清楚括號(hào)的對(duì)應(yīng)關(guān)系,然后查清楚各種運(yùn)算符的運(yùn)算優(yōu)先級(jí),最后在去考慮這個(gè)表達(dá)式代表的意思。

為了擺脫這種“與非”困境,我們要做的是把這個(gè)判斷條件提煉出來(lái),或者賦值給一個(gè)臨時(shí)變量,或者徹底提煉成一個(gè)函數(shù),變量或者函數(shù)的名字明確代表了判斷條件的意思,例如isEmpty等等。這樣在判斷語(yǔ)句中,就可以一眼看出來(lái)這個(gè)分支是怎么一回事了。如果真要考慮效率問(wèn)題,可以把提煉出來(lái)的函數(shù)作為inline函數(shù)??傊?,要寫(xiě)出給人類(lèi)看的代碼,這個(gè)工作是很值得使用的。

4、簡(jiǎn)化函數(shù)參數(shù)

使用C語(yǔ)言編程,缺少?gòu)?qiáng)大的自動(dòng)補(bǔ)齊工具(尤其是喜歡vi的人,雖然下面有補(bǔ)齊的插件,但是很少使用,也不大適應(yīng)),如果函數(shù)的參數(shù)太多,根本記不住應(yīng)該加的參數(shù),編寫(xiě)代碼時(shí)要不斷的去翻看,降低了效率,尤其在多個(gè)人合作編程時(shí),這種情況會(huì)尤為明顯。但是這在c語(yǔ)言中有時(shí)候是很難避免的事情,總不能為了數(shù)值傳遞設(shè)置大量的全局變量吧。

我的辦法是設(shè)置結(jié)構(gòu)體,把意思相近的參數(shù)合并成一個(gè)整體,然后為這個(gè)結(jié)構(gòu)體設(shè)置賦值函數(shù)。這樣在一定程度上簡(jiǎn)化了主要函數(shù)的參數(shù)個(gè)數(shù),便于記憶。

二、改進(jìn)代碼總體結(jié)構(gòu)

1、解除全局變量的噩夢(mèng)

在c語(yǔ)言編程中不可避免的要使用全局變量。傳遞數(shù)值、進(jìn)行條件判斷等等時(shí),全局變量給我們帶來(lái)了極大的方便,但同時(shí)也帶來(lái)了噩夢(mèng)。有時(shí),全局變量根本不是自己預(yù)想的數(shù)值,而是被哪個(gè)莫名的代碼悄悄修改了,要在那么多代碼中查找這個(gè)作祟者簡(jiǎn)直痛苦不堪。

好的做法是把全局變量設(shè)置成static,只能在本文件中看到,然后編寫(xiě)訪問(wèn)/設(shè)置函數(shù)來(lái)控制變量的訪問(wèn)入口。查找函數(shù)總比查找一個(gè)小小的賦值語(yǔ)句簡(jiǎn)單的多,起碼還有斷點(diǎn)可用。退一步講,如果使用多線程或者多進(jìn)程沒(méi)有斷點(diǎn)可用,那么好的做法是使用宏定義編寫(xiě)訪問(wèn)控制點(diǎn),在宏定義中可以加入打印,把這個(gè)語(yǔ)句在的文件和函數(shù)都打印出來(lái),我就不信,找不到它,哈哈哈。

2、避免函數(shù)傳遞中的隱形bug

c語(yǔ)言的參數(shù)傳遞其實(shí)就是傳遞的一塊內(nèi)存,在函數(shù)執(zhí)行時(shí),在這塊內(nèi)存中,根據(jù)參數(shù)類(lèi)型取得一塊塊相應(yīng)大小的數(shù)據(jù)。這樣就產(chǎn)生了隱形的bug。比方說(shuō),在沒(méi)有記住函數(shù)參數(shù)類(lèi)型的情況下,傳遞了一個(gè)結(jié)構(gòu)體給它,結(jié)果該函數(shù)只是幾個(gè)int類(lèi)型的參數(shù),這時(shí)編譯器也不會(huì)報(bào)錯(cuò)給你,更恐怖的是代碼照樣可以運(yùn)行,如果沒(méi)有測(cè)試充分,沒(méi)準(zhǔn)代碼還能正確運(yùn)行。

這樣一個(gè)隱形的bug會(huì)把你搞的很慘。要把它干掉,最簡(jiǎn)單的辦法就是加入函數(shù)聲明。靈活便利的c編譯器,在函數(shù)調(diào)用上,沒(méi)有強(qiáng)制要求加入函數(shù)聲明,而函數(shù)聲明尤其在調(diào)用另外文件的函數(shù)時(shí),很重要。如果調(diào)用與聲明的類(lèi)型不一致,編譯器會(huì)報(bào)錯(cuò)。這樣這個(gè)隱形bug就不會(huì)在騷擾你了。所以,不要圖省事,為了以后的和諧生活,聲明你要調(diào)用的每一個(gè)函數(shù)吧。

3、調(diào)整函數(shù)位置

在多文件程序當(dāng)中,函數(shù)的位置很重要,要根據(jù)每個(gè)文件完成的功能調(diào)整函數(shù)的位置,不能亂放。亂放的現(xiàn)象在那些臨時(shí)加的被調(diào)用函數(shù)身上表現(xiàn)的非常突出(我經(jīng)常就干這事)。亂放導(dǎo)致的后果就是,后面維護(hù)代碼時(shí),根據(jù)文件名去找相關(guān)的函數(shù),根本沒(méi)有,結(jié)果一搜發(fā)現(xiàn)它在一個(gè)內(nèi)容完全不相干的文件中。為了不打亂思路,臨時(shí)放就放吧,但是這個(gè)功能完了,一定要把這個(gè)函數(shù)重構(gòu)到它應(yīng)該在位置上。

對(duì)于重構(gòu)來(lái)講,想到的暫時(shí)就是這些,其實(shí)有一些是要開(kāi)始編寫(xiě)時(shí)就要注意的。這也應(yīng)了這么一句話:重構(gòu)本來(lái)就應(yīng)該是融入到日常的代碼編寫(xiě)中。最高境界就是手中無(wú)重構(gòu),心中也無(wú)重構(gòu)。

【編輯推薦】

  1. 數(shù)據(jù)庫(kù)在C++程序中使用方法
  2. 影響C++/C程序的幾大要素
  3. VC++獲得當(dāng)前系統(tǒng)時(shí)間的幾種方案
  4. 淺談C/C++中的static和extern關(guān)鍵字
  5. C++連接mysql數(shù)據(jù)庫(kù)的兩種方法

文章名稱(chēng):C語(yǔ)言的面向?qū)ο笫街貥?gòu)
URL分享:http://www.5511xx.com/article/cdcidip.html