成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C語(yǔ)言的面向?qū)ο笫街貥?gòu)

開發(fā) 后端
從Martin Fowler最早提出重構(gòu)的概念開始,到現(xiàn)在已經(jīng)有很長(zhǎng)時(shí)間了,重構(gòu)已經(jīng)是深入忍心了。與其說(shuō)它是一種方法,不如說(shuō)是一種思想、一種習(xí)慣。本文主要介紹C語(yǔ)言的面向?qū)ο笫街貥?gòu),希望對(duì)你有幫助,一起來(lái)看。

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

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

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

于是,我找到了Martin Fowler寫的《重構(gòu)》。這本書從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ù)。這本書雖然是針對(duì)Java語(yǔ)言寫的,但是大量的重構(gòu)思路都是語(yǔ)言無(wú)關(guān)的,我們?cè)谌魏握Z(yǔ)言中都可能遇到Martin大師描述的問(wèn)題,并能夠利用Martin的解決思路來(lái)改正問(wèn)題。現(xiàn)在,就把我看這本書的一些想法、思路記錄下來(lái),也算是一個(gè)讀書筆記吧。

一、函數(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ù)

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

有些人會(huì)想,我寫的是C程序,不是Java語(yǔ)言。C語(yǔ)言要求的是簡(jiǎn)潔的名稱,而不是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)就像一系列注釋,通俗易懂。

3、提煉判斷條件

有時(shí)候在判斷條件當(dāng)中,會(huì)遇到一個(gè)很長(zhǎng)的表達(dá)式表示一個(gè)條件分支,這個(gè)表達(dá)式有時(shí)不光包含了“與”、“或”、“非”,還有查詢函數(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ù)??傊獙懗鼋o人類看的代碼,這個(gè)工作是很值得使用的。

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

使用C語(yǔ)言編程,缺少?gòu)?qiáng)大的自動(dòng)補(bǔ)齊工具(尤其是喜歡vi的人,雖然下面有補(bǔ)齊的插件,但是很少使用,也不大適應(yīng)),如果函數(shù)的參數(shù)太多,根本記不住應(yīng)該加的參數(shù),編寫代碼時(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,只能在本文件中看到,然后編寫訪問(wèn)/設(shè)置函數(shù)來(lái)控制變量的訪問(wèn)入口。查找函數(shù)總比查找一個(gè)小小的賦值語(yǔ)句簡(jiǎn)單的多,起碼還有斷點(diǎn)可用。退一步講,如果使用多線程或者多進(jìn)程沒(méi)有斷點(diǎn)可用,那么好的做法是使用宏定義編寫訪問(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ù)類型取得一塊塊相應(yīng)大小的數(shù)據(jù)。這樣就產(chǎn)生了隱形的bug。比方說(shuō),在沒(méi)有記住函數(shù)參數(shù)類型的情況下,傳遞了一個(gè)結(jié)構(gòu)體給它,結(jié)果該函數(shù)只是幾個(gè)int類型的參數(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)用與聲明的類型不一致,編譯器會(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í)有一些是要開始編寫時(shí)就要注意的。這也應(yīng)了這么一句話:重構(gòu)本來(lái)就應(yīng)該是融入到日常的代碼編寫中。最高境界就是手中無(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ù)的兩種方法
責(zé)任編輯:于鐵 來(lái)源: 百度空間
相關(guān)推薦

2010-08-24 16:00:43

C語(yǔ)言

2022-10-21 09:01:41

StudentC++類型

2010-01-22 10:26:40

C++語(yǔ)言

2010-01-13 14:05:55

C++語(yǔ)言

2020-04-15 11:07:31

C語(yǔ)言對(duì)象思想

2010-03-01 17:47:53

Python語(yǔ)言

2024-04-02 07:32:58

Go語(yǔ)言接口

2009-07-14 16:51:50

Jython中的對(duì)象

2022-10-12 08:38:51

C語(yǔ)言classC++

2022-08-27 10:53:15

C語(yǔ)言Linux內(nèi)核

2010-02-02 13:22:06

Python面向?qū)ο?/a>

2020-07-24 09:40:04

C語(yǔ)言OOP代碼

2024-01-08 07:02:48

數(shù)據(jù)設(shè)計(jì)模式

2010-01-20 09:48:44

面向?qū)ο?/a>

2021-05-28 05:34:06

Golang語(yǔ)言編程

2010-03-01 17:40:29

Python面向?qū)ο笳Z(yǔ)

2023-01-10 09:38:09

面向對(duì)象系統(tǒng)

2009-09-27 15:29:00

Scala講座面向?qū)ο?/a>Scala

2009-07-08 16:10:24

Scala簡(jiǎn)介面向?qū)ο?/a>函數(shù)式

2011-06-17 17:27:29

Objective-CCocoa蘋果
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一级视频黄色 | 伊人网99| www.日韩| 狠狠爱综合网 | 欧美婷婷| 三级黄色片在线观看 | 欧美三区在线观看 | 国产精品久久久久久久久久三级 | 卡通动漫第一页 | 国产美女黄色片 | 国产美女久久久 | 韩日在线视频 | 国产成人黄色 | 9191在线观看 | 99视频免费看 | 高清亚洲 | 日韩av第一页 | 国产视频久久 | 国产ts人妖一区二区三区 | zzzwww在线看片免费 | eeuss国产一区二区三区四区 | 午夜激情影院 | 亚洲成人久久久 | 国产特级毛片 | 色播视频在线观看 | 四虎影视在线 | 精品一二区 | 亚洲欧美日韩精品久久亚洲区 | 久久精品国产久精国产 | 日韩一区二区在线视频 | 色必久久 | 国内精品久久久久 | 免费人成在线观看网站 | 在线免费观看黄a | 午夜精品一区二区三区在线观看 | 亚洲网址在线观看 | 久草.com | 999视频在线播放 | 欧美日韩一区二区在线 | 天堂中文资源在线 | 免费观看成人av |