2009-10-01 45 views
3

我一直在編寫和關閉我的整個生活。我主要編碼Perl,但也有一些Java,PHP,C,C++。我甚至刺穿了Emacs Lisp,而且我偶爾做了shell腳本。然而,我從來沒有真正從事這個主題獲得任何專業知識 - 其他事情對我來說有更高的優先權。我不認爲自己真的能夠熟練使用任何語言,除了Perl之外,現在我還要學習Haskell。關於變量/函數命名約定的思考

最近,我一直在想我的編碼風格。不是實際代碼的風格;作爲一個CS學生,我只做有趣或學校的項目,這使我能夠寫出我認爲幾乎總是美麗的代碼。特別是有一個問題令我煩惱。這是一件頗爲奇怪的事情,但我仍然希望聽到其他意見。

這是事情:我發現自己花了相當長的時間將我的函數和變量命名爲我可能想到的最容易理解的名稱。有時候這個任務可能非常單調乏味,即使沒有考慮到找到一個表達代碼片段含義的變量名稱的困難。例如,現在我正在製作一個看起來像這樣的函數。

這是Haskell代碼,但含義應該很清楚。 (所以如果你想要,只跳過代碼和閱讀它的確切含義並不重要。)

-- return the row with least number of Nothing values 
bestRow :: [[Maybe Int]] -> Int -> Maybe (Int,Int) 
bestRow [] _ = Nothing 
bestRow (row:rows) thisIndex 
    | nextRow == Nothing && thisFilled > 8 = Nothing 
    | nextRow == Nothing  = Just (thisIndex,thisFilled) 
    | thisFilled >= nextFilled = Just (thisIndex,thisFilled) 
    | thisFilled < nextFilled = nextRow 
    where thisFilled    = length $ filter (/= Nothing) row 
      nextRow    = bestRow rows (thisIndex + 1) 
      (nextIndex,nextFilled) = fromMaybe (-1,-1) nextRow 

我不能在變量名決定。這個功能做得很好,但沒有那麼清晰。一旦我解決了一個解決方案,我花了15分鐘命名和重命名這些變量。我應該使用curIndex,nextIndex ||索引,nextIndex || ind,indN等?在我決定完成15分鐘後,我意識到這個功能並不需要:我找到了一個更好的解決方案來解決我的問題。 BOOM我已經浪費了很多時間來簡單地清理代碼,對任何人都沒有用,尤其是對我來說。或者至少有這種感覺。

這是發生在我身上的事情,不止一次,而且非常令人沮喪,主要是因爲它讓我感到無聊。你對這個問題有什麼想法?這是你經歷過的事情嗎,我做事的方式有什麼問題,或者是一些不可避免的事情?

是否存在「完美」的變量名稱,或者如果它們至少不會混淆你的代碼,那麼它是「好的」?

感謝,

斯特凡卡加斯

+2

您可能會損失較少的時間清理不良代碼,然後丟棄它,而不是清理並保留它。我希望我和你一起工作的人擔心變量命名。 – 2009-10-01 20:08:19

回答

5

由羅伯特C.馬丁讀過書的清潔守則

一件事,他進入細節上命名。變量和函數名稱應儘可能精確。如果您需要評論來描述它,則該功能要麼做得太多,要麼名稱可以更清晰。

目標是讓代碼看起來像故事。如果需要實現此目標,請更改變量和函數名稱並將其分解爲若干函數或變量。

偉大的書,值得每一分錢

+1

+1 - 變量和函數名稱應該是註釋本身。也就是說,有一些毫無意義但命名完善的命名實踐(比如控制循環的'i','j','k'),因爲這個領域的每個人都希望事情已經被命名。 – 2009-10-01 19:25:49

+1

一般而言,從書中來看,變量的範圍越短,其名稱就越短。因此,循環中的控制變量可以是1個字符......並且這是一個完善的實踐,這是預期的。 – CaffGeek 2009-10-01 19:46:42

0

變量和函數的名字很好,讓理解的代碼。好的名字應該描述變量或函數的意圖和用法。當需要進行更改時,錯誤的名稱會混淆其他編碼器。

清晰度良好的代碼。

0

我認爲它的心理,我總是覺得我的變量等是無法讀取到任何人,但我,儘管我始終放在評論在我的代碼。

每當我不得不經過別人的代碼時,我很驚訝我如何輕鬆閱讀他們的代碼而不必閱讀每一條評論,當他們閱讀我的代碼的時候會發生完全相同的事情,所以我正在做一個好的工作;)

我認爲只要你的意見是有意義的,並且實際上描述了一種方法的作用,那麼你正在使用什麼變量應該沒問題。

一個提示是要始終確保您的意見是最新的。我看過很多次代碼的方法沒有改變,但方法代碼有.....它可能非常混亂!

+1

但是,如果您的變量事先具有描述性名稱,則這些註釋是不必要的。例如, 。如果你看到一個名爲「email」的變量,它是什麼?這是一個人的電子郵件地址嗎?或者它是否表示他們是否想接收電子郵件?或者是一個表示他們是否有電子郵件地址的布爾值。如果它被命名爲hasEmail或emailAddress,我們會更確定。即使你有評論,我真的不想滾動到定義來找到答案。 – CaffGeek 2009-10-01 19:50:11