2009/10/11

複製而來的程式錯誤

不是每個程式設計師都擁有超強的記憶力; 或許你在電視或電影中看到的程式設計師, 好像都運指如飛似的快速寫著程式,其實那和現實的差異也未免太遠了。

除非某段程式已經寫得很熟了,否則我們多半會拿寫好的程式片段來修改。在 VS2005 之後,甚至提供了蠻好用的 Code Snippet 功能,提供程式設計師以簡單方便的方法把舊程式片段拿來塞進新程式裡面。

不過問題也常常出現在這裡。當你把舊程式拿來重新使用時,你確定每個地方都改了嗎?我自己就時常遇到這個錯誤,而且最難除錯、最容易發生盲點的地方也都出在這個地方。例如,我習慣把 DataReader 物件都取名為 dr,所以當然我的 Code Snippet 也都把 DataReader 都取名為 dr;但是萬一在某個地方,我已經把它另外取名了(例如叫做 dr1),然後我循序去把所有的 dr 都改為 dr1,但偏偏有幾個地方忘了呢?

呵呵,這種問題是最難除錯的!因為當我快速把程式碼掃描過去時,我實在不容易發現 dr 這個變數名稱其實是錯的。也許你會說,如果 dr 沒有宣告的話,VS2005 不是會給你警告嗎?會!但萬一你在程式其它地方確實有宣告過 dr 呢?

這種問題最難除錯,因為不管是在 Compile 或是執行時,它表面上都看不出有什麼問題。但是等你深入進行測試時,就會開始發現問題了。此外,有時程式會發生錯誤,但是 Compiler 告訴你的錯誤訊息,偏偏不是真正出問題的所在。我今天就又發生了一次這種問題,因為在拷貝其它程式時,沒有把所有的變數全部修改正確,結果在某種情況之下,怎麼讀取 DataReader 都出現 OutOfIndex 的問題,可是偏偏 DataReader 的 HasRows 屬性是 True 呀!真是遇到鬼了。

查了好久,甚至已經做了很多虛功之後,最後才發現原來只是讀到了另一個 DataReader 的資料,呵呵,實在寃枉無處訴。

像這種問題,可能連 Peer Review 都沒有辦法克服(同一個 Team 的 Convension 應該也都一樣吧)。所以誰說測試工程師不重要呢?

Technorati 的標籤:,,,,,

沒有留言:

張貼留言