如何建立一個子程序
首先我們要理解這里面的“子程序”指的是什么?在這里,“子程序”理解為一個函數(shù)比較合適,可以是一個執(zhí)行特定功能的全局函數(shù)、可以是一個類里面的成員函數(shù)(注:《代碼大全》里面之所以用“子程序”來表述,是因為它所講述的規(guī)則與方法是與語言無關(guān)的,我們應(yīng)該根據(jù)自己實際編程中所使用的語言來自行定義“子程序”),也可以這樣理解“子程序”,它是完成某一特定功能的一個小單元,其粒度比模塊要小,而比數(shù)據(jù)類型、結(jié)構(gòu)控制語句要大。
綜合《代碼大全》里面的介紹和自己的理解,將“如何建立一個子程序”分為三個步驟:1. 之間的準備工作;2. 建立操作;3. 檢查及測試。(其實這是放之四海而皆準的普遍規(guī)則,做任何事情只要遵守這三條都不會有太大問題的,在這里算是投機取巧了,主要是為了方便理解和記憶)
1. 之前的準備工作
問題引發(fā)設(shè)計,如果沒有需求我們就不需要去設(shè)計一個“子程序”啦。那么我們首先就要明確地定義出這個“問題”啦,一般情況下,這個“問題”在整個的程序框架中會有所提及,而如何那時問題定義比較清晰的話,我們的準備工作可以幾乎省去。不管怎么樣,我們都要明確幾個問題:
- 將要設(shè)計的“子程序”要完成什么任務(wù);
- “子程序”主要應(yīng)該在哪些場合,是為某個模塊定義的功能,還是適用于整個系統(tǒng);
- “子程序”的輸入、輸出分別是什么;
- 建立這個“子程序”需要與系統(tǒng)其他哪些部分發(fā)生關(guān)系,需要建立新的數(shù)據(jù)類型和算法么;
明確這些以后,我們的準備工作就做完了,那么最后為我們的“子程序”起一個清晰、直觀、簡介的名字吧!
2. 建立操作
建立操作的第一步,也是大部分程序員忽視的一個步驟(《代碼大全》里面這樣說的啊!)——使用PDL(program design language)語言來精確描述“子程序”所執(zhí)行的操作。
這一操作是相對于使用具體程序語言編寫“子程序”更抽象、更上一層的操作步驟,抽象并不意味著復雜,反而會更加簡單清晰,以便使后續(xù)的編碼、檢查、調(diào)試操作更容易。因為使用PDL語言會帶來以下好處:
- 使用自然語言而不是編程語言來描述“子程序”操作,使程序員不必受具體編程語言的語法約束,而將精力放在設(shè)計上;
- 容易查找錯誤,即使查找出錯誤,修改的代價也比較小;
- 如果PDL語言描述得比較得當,那么編碼工作就是一個簡單的翻譯工作;
- 維護起來比較方便,PDL語言為“子程序”提供了清晰的注釋信息;
確認PDL描述沒有問題后,可以著手編寫程序代碼了,如果PDL語言對于“子程序”描述的足夠準確并得當?shù)脑挘敲淳帉懘a的過程可能是一個簡單、機械的工作,程序員應(yīng)該很快能完成“子程序“設(shè)計。
但是,并不是說設(shè)計出一個行為良好的PDL描述就完事大吉了,有些情況下,PDL描述看似完美,但將它轉(zhuǎn)化為代碼時會出現(xiàn)很多錯誤,所以這是要不檢查是不是代碼本身出錯,或者是PDL語言描述還存在不足,如果是的話,重新用PDL語言描述。
3. 檢查及測試
在編譯“子程序”之前,程序員有必要進行一些檢查工作:
- “子程序”是不是按照最初的需求?
- 完成的任務(wù)是不是明確?
- 可以能現(xiàn)的意外情況?如何解決?
- “子程序”接口設(shè)計、實現(xiàn)得合適么?
- “子程序”會不會有明顯的語法錯誤?
確認檢查無誤以后,程序員可以對“子程序”實施測試了,《代碼大全》里面建議我們不要急于對“子程序”實施編譯,并試圖通過編譯來查找程序中的錯誤,如果某次編譯出現(xiàn)了錯誤,那么程序員往往急切萬分得修改以試下次編譯不要出錯,這并不是發(fā)現(xiàn)并排除錯誤的正確方法。《大碼大全》推薦我們這樣做:
- 自己在心里逐行執(zhí)行“子程序”,通過自己的“計算機系統(tǒng)”將程序執(zhí)行一下,試圖找出錯誤并更正;
- 編譯“子程序”,消除所有錯誤和警告;
- 逐行調(diào)試程序,監(jiān)視程序運行結(jié)果,必要情況下編寫一些輔助代碼幫助程序測試;
總結(jié):
閱讀《代碼大全》關(guān)于“子程序”建立這部分,確實對程序員的編程工作有一定啟發(fā),也確實指出了一些有效的方法和容易忽略的問題。下面結(jié)合書中介紹的內(nèi)容和自己的理解談一下自已的認識:
- 首先,我們應(yīng)該清楚地認識到,書中所談應(yīng)該是大而全的方法論,實際執(zhí)行的時候可以根據(jù)具體情況做酌情取舍。書中所列出的條條目目加起來總共得幾十條,如果我們所寫的“子程序”是一個功能簡單、邏輯清晰的操作,確實沒有必要按照書中所寫的來逐步進行,這樣反而會降低效率。
- 書中介紹使用PDL語言說要使用自然語言,避免設(shè)計具體編程語言的引入,這點我認為過于刻板,PDL語言之所以沒有確定語法格式,就是為了可以抽象地、明了地描述“子程序”操作,所以加入具體編程語言的風格、語法未嘗不可,畢竟最終我們是要使用具體的編程語言來實現(xiàn)功能,加入這些具體編程語言的語法、風格反而使描述效果更貼切。
浙公網(wǎng)安備 33010602011771號