2009-11-17 56 views
6

最近我一直在閱讀代碼完整,基於許多參考文獻和一位朋友,並且有一個社區的命名問題。在確定事件是否成功的布爾方法上應該使用前綴「Is」?下面是我嘗試兩種不同的命名方案的一個代碼示例:驗證方法的方法名稱中的前綴「是」

migrationSuccessful = CopyData(); 
if (VerifyCopyData()) 
    migrationSuccessful = CleanupData(); 

對:

migrationSuccessful = CopyData(); 
if (IsDataCopied()) 
    migrationSuccessful = CleanupData(); 

通知VerifyCopyData和IsDataCopied之間的差異。對我來說,IsDataCopied更有意義,並使代碼流更具描述性。

感謝您的想法!

編輯:基於一些評論,我想我會澄清什麼是IsDataCopied方法。它通過幾個目錄和文件循環,並確保源目錄和目標文件匹配。

+0

只是一個小技巧,確保他們不聽起來像測試方法,VerifyObjectIsNotNull,我已經看到了這一點,並導致了一個模糊性 – Perpetualcoder

+0

一般觀察...這些問題吸引upvotes .. – sud03r

+6

事實,你必須澄清什麼該功能確實應該是你的紅旗。 ;) –

回答

5

我與馬修·瓊斯就是它最好命名方法IsDataCopied同意。我想補充一點,當命名與其他代碼元素相關的代碼元素時,我通常會發現將Is放在名稱內而不是前面會更好,因爲它在Intellisense中會更接近與其相關的元素(並因此更容易找到)。例如,在Winforms中,Form有一個HandleIsHandleCreated屬性。如果IsHandleCreated被命名爲HandleIsCreated,那麼它將接近Handle屬性,並且更易於查找(不會在Intellisense中隱藏下來)。

+0

好想法。我沒有想到這些,因爲我專注於代碼的外觀。這不僅會創建可讀代碼,而且會更容易維護代碼。 –

+0

我從來沒有考慮過這個想法......我非常喜歡它。然而,我擔心它與大多數人的期望不符,因爲它會使代碼難以使用/維護。 – rmeador

8

我同意你的意見。對我來說,IsDataCopied更可讀。

更一般地說,在我看來,VerifyCopyData對於它是嚴格意義上的驗證方法還是實際上是否做了某些事情是不明確的。 IsDataCopied非常清楚,它只檢查數據是否被複制。

1

「應該」是一個廣義術語。做對你有意義的事情。在很多情況下,使用「是」澄清,但並非總是如此。

再次,做什麼是有道理的。

+0

downvoted?真?哇人... – Jason

+0

@Jason這是一個串行驅動的downvoter。至少有一票的每個人都受到了打擊,包括我在內。 –

+0

@matt人們真的沒有更好的辦法,是嗎? – Jason

0

如果您的方法可以包含一個動詞,可以幫助描述該方法的功能,這很好。 VerifyCopyData聽起來像它驗證數據,而isDataCopied聽起來像它測試一些事實的存在。這是一個微妙的區別。 Nitpick:我會打電話給第一個方法VerifyCopiedData

1

我覺得「是」更清楚。名爲「VerifyCopyData()」的函數可能會在數據未被複制或發生副作用時引發異常。可能不會,但如果我讀了它,我不確定期望它做什麼。前綴爲Is的函數是明確的:該函數沒有副作用,只會將布爾答案返回給問題。

有一個動作動詞(驗證)意味着這個函數實際上做了一些事情。使用「Is」沒有動作動詞,因此它暗示該函數僅僅檢查狀態並且不做其他任何事情。

0

如果它本來是我想要的任何其他名稱,但VerifyCopyData肯定比isDataCopied可讀性差。

0

我同意。具有「Is」前綴使得它更清楚地表明這是一個布爾函數。它實際上是許多命名約定中的一個標準,它不僅爲方法,屬性和變量加上前綴。

驗證前綴不是很清楚,因爲它可能是一個無效函數或不返回任何內容的子例程。例如,驗證可能意味着它檢查了一些事情,並在出現問題時拋出異常。 Is前綴意味着你在問一個問題,因此將返回一個答案。

1

這絕對是主觀的,並且在不同的時間(使用不同的圖書館甚至不同的語言),我都使用這樣的前綴並且從來沒有使用過它們,因此混合這個約定並不使用它往往是一個錯誤。根據上下文確定哪一個最清楚,包括該項目/庫/等中已經完成的內容。

例如,obj.DataIsCopied()更適合英語爲母語的人,但您有!obj.DataIsCopied()(或not)。你必須面對你正在編寫代碼並需要約定,而這些約定會主觀地增加意義(在描述意義上)。

此外,我希望任何名爲Verify的方法來做一些「真實」的工作來驗證,而Is應該返回一個預先計算的/已經可用的值或者平凡地計算它。在你擁有屬性的語言中,這更容易表達,因爲你可以將那些「行爲」與不行爲分開。例如。使用if (obj.data_copied),無論是數據成員還是像IsDataCopied這樣的平凡函數,都是封裝的。

1

IsDataCopied由於該方法的意圖未知,可讀性較差。如果它只是簡單地返回一個布爾值而不做其他任何事情,那就沒問題。但是,如果它正在執行驗證,那麼在無辜的條件語句背後可能會隱藏很多代碼。

我的建議是:

bool isDataProperlyCopied = VerifyCopiedData(); 
if (isDataProperlyCopied) { 
    ... 
} 
+0

如果這是一種方法,爲什麼調用者不應該預期潛在的昂貴的副作用?如果沒有,這將是一個財產。 –

0

我喜歡Is當談到變量和屬性

if(o.IsDataCopied) 
{ 
} 

但是,在這種情況下,在方法調用我會選擇像

if(DataIsCopied()) 
{ 
} 
1

data.isCopied()

因爲英文不是VSO,而是SVO。