那些爛代碼教給我的事_資料結構
來源:互聯網
上載者:User
(以前的博文,轉到csdn上來) 如果作為一個程式員,你對我寫的東西不感興趣,可以直接跳到最後一句。
這周三的時候,我還是跟往常一樣在做我的事,偷偷摸摸學點兒ror。一個老師讓一個同學叫我過去幫忙看程式,說是程式編譯不通過。。。 先說明,這個項目組的項目是一個地質相關的繪圖軟體,大部分的程式設計到石油資料,和一些電腦圖形學的東西,是跟中石油合作的,有大概8、9年的樣子了,無測試。幾十萬行代碼應該是有的。
我看了下編譯出現的狀況:omg。。。幾百個編譯錯誤。旁邊的同學倒是很淡定,熟練的注釋掉了幾個看樣子是新寫的檔案。。。 恩,這下子好點兒了,說是有兩個類型重複定義了:
我:如果沒有測試,再怎麼也應該添一個檔案就編譯一次吧。 老師:這個不是關鍵,關鍵是這個重複定義的資料,搞得很老火阿。
好吧
大概是這樣的代碼出現了問題(我精簡了):
DataTypeA和DataTypeB是定義在兩個不同的標頭檔中的enum類型,代表同樣的物理意義的資料。。。有一些檔案會同時包含這兩個標頭檔
我:為什麼有兩個不同類型的資料表示了同一個東西。 老師:A是在原來的程式裡面定義的資料結構,B是我們新寫的庫,我們不希望新的庫依賴於老的程式。。。這樣我們可以不斷的添加新的庫實現新的功能。。。 我(心中OS):真的就不依賴了嗎。
才開始我沒有注意到一個命名是DataTypeA,另一個是DataTypeB。我以為都是A,就隨便加了個ifndef,期待速度解決問題。。。結果是,,,不行。。。holy shit。。。。
怎麼A中的VERTICAL會根B中VERTICLAL衝突呢。
這項目真心太大了,編譯都要好久,我就寫了個小demo,來速度驗證這個文法問題。恩。還是不行,看來是文法問題。。。
後面通過查資料,我才知道enum屬於POD(plain old data)。。。enum的類型名稱是沒有名字空間的。。。
好吧,問題找到了。。。
為什麼會叫壞代碼教給我的事呢。因為我覺得正常情況下,我是不會用enum的。為什麼。
我問了那個同學一個很簡單的問題:你們會不會在某個地方判斷enum類型的值是VERTICAL還是HORIZON,然後再根據判斷的結果,進行不同方法的計算。 同學:會啊 我:會不會這樣的判斷不止一處。 同學:恩,是的。 我:有沒有針對VERTICAL或者HORIZON的一些演算法改變。 同學:有 我:你有沒有覺得你改的時候很苦B。
同學:有有有。。。同學恍惚遇到知音了。。。
為什麼不用enum的原因我也就差不多解釋了一半了。 最重要的一點:
好的代碼鍛煉人的思考,壞的代碼鍛煉人的文法