簡體   English   中英

確定在 Java 中將哪個動詞用於方法名稱

[英]determining which verb to use for method names in Java

我知道命名約定很重要,原因有很多,主要是為了讓你的代碼更易讀,更容易集成到更大的項目中,等等。在 Java 中,大多數約定要求方法名稱必須以動詞的lowerCamelCase開頭。

我的問題是:我如何選擇動詞來開始方法名稱?

為了使這個問題不那么含糊,我經常遇到這樣的情況,即我的方法名稱的首選是描述輸出的名詞。 在這些情況下,我通常會在名詞字體中附加通用動詞(例如getgeneratecalculate等)以符合動詞規則之間感到糾結。 是否有關於何時使用哪個的一般准則?

這是一個例子。 我有一個方法,它采用double[] array和一個int k並返回double[] newArray ,它是array的長度k移動平均值,即newArray[i] = (array[i-k+1]+...+array[i])/k進行一些捏造以使newArray的長度與array相同。 我傾向於調用這個方法movingAverage ,因為這是它返回的內容,但由於它不是以動詞開頭,所以不適用。 我應該將此方法getMovingAveragegenerateMovingAveragecalculateMovingAverage還是無關緊要?

我通常會問自己:

這個方法在做什么?

答案決定了應該調用什么方法。 當然,它完全獨立於程序員。

注意:如果你不能簡潔地描述這個方法在做什么,它可能做的太多了,應該分開。

選擇方法的動詞:

  • 執行計算:計算
  • 檢索數據:獲取檢索
  • 變異數據:設置更改
  • 刪除數據:刪除移除
  • 轉換:轉換
  • 啟動一個動作:開始啟動
  • 停止動作:停止取消

現在,並非所有方法都以動詞開頭。 但他們真的不需要。 如果您閱讀:

... myString.length();

或者

... myArray.size();

你確切地知道發生了什么——不需要動詞。 對於 Java 層次結構中更高層的許多類方法都是如此。 集合、數學等。只要名稱准確地傳達了方法的作用,就可以了。

不要忘記對布爾方法使用這個動詞“is、has 或 can”,例如: is On()、 is Full() 等。

關於僅對屬性訪問器使用getset方法:信息隱藏的全部意義在於 API 的用戶(即調用代碼)不需要知道或依賴於屬性是動態存儲還是計算的. 只要 API 保持不變,實現應該可以隨時更改。

實際上有一個清單:

Verb        Group
----        -----
Exit        Common
Enter       Common
Find        Common
Pop         Common
Remove      Common
Rename      Common
Push        Common
Redo        Common
Format      Common
Move        Common
New         Common
Join        Common
Lock        Common
Optimize    Common
Get         Common
Hide        Common
Open        Common
Reset       Common
Close       Common
Clear       Common
Skip        Common
Split       Common
Step        Common
Unlock      Common
Watch       Common
Switch      Common
Undo        Common
Add         Common
Copy        Common
Resize      Common
Search      Common
Select      Common
Show        Common
Set         Common
Write       Communications
Send        Communications
Read        Communications
Receive     Communications
Connect     Communications
Disconnect  Communications
Restore     Data
ConvertTo   Data
Backup      Data
Edit        Data
Dismount    Data
Unpublish   Data
Compress    Data
Compare     Data
Checkpoint  Data
Sync        Data
Save        Data
ConvertFrom Data
Convert     Data
Update      Data
Import      Data
Initialize  Data
Export      Data
Group       Data
Limit       Data
Out         Data
Mount       Data
Merge       Data
Expand      Data
Publish     Data
Test        Diagnostic
Ping        Diagnostic
Debug       Diagnostic
Measure     Diagnostic
Repair      Diagnostic
Resolve     Diagnostic
Trace       Diagnostic
Suspend     Lifecycle
Wait        Lifecycle
Uninstall   Lifecycle
Submit      Lifecycle
Unregister  Lifecycle
Assert      Lifecycle
Invoke      Lifecycle
Approve     Lifecycle
Stop        Lifecycle
Deny        Lifecycle
Request     Lifecycle
Restart     Lifecycle
Disable     Lifecycle
Install     Lifecycle
Enable      Lifecycle
Register    Lifecycle
Complete    Lifecycle
Confirm     Lifecycle
Start       Lifecycle
Resume      Lifecycle
Use         Other
Grant       Security
Unblock     Security
Protect     Security
Revoke      Security
Unprotect   Security
Block       Security

我不認為 java 方法名稱應該“以動詞開頭”,我認為它們應該描述動作。 這通常需要一個動詞,因為動詞描述了動作。 通常,它們是描述的重要部分(getVar 和 setVar 的含義完全不同)。 有時,它們不會在描述中添加任何內容(您能想到除了 get/calculate/generate 之外的任何可以在movingAverage 上操作的東西嗎?)並且應該被刪除。

我的觀點)如果對象沒有狀態,則方法名稱中不需要動詞,例如數學庫。 比較computeSquareRoot (x) 和getJoin (listOfStrings) 與squareRoot (x) 和join (listOfStrings)。

正如您所說,正如我們在答案中看到的那樣,方法名稱開頭使用的動詞幾乎是相同的動詞。 我認為,如果花費相同的精力來編寫相關文檔,方法就會變得更容易理解和集成:)

讀完這個問題我也意識到,我寫的大多數方法都是從getretrievecreate開始的。 因此,動詞選擇似乎並沒有那么重要。

最好的

我認為要找到任何可能成為問題“解決方案”的東西,我們應該首先提取在選擇名稱方面發揮任何作用的標准,例如:

  • 可讀性(瑣碎:getValue 而不是 transferValueFromThisObjectToYou)
  • 方便(瑣碎:getCoordValue 而不是)
  • 方法的語義(get 與 calculate 不同)
  • 使用上下文(在 IDE 中,我通常鍵入 aaa.get_ 並按 Ctrl+Space 來檢查我可以從對象中得到什么)
  • 代碼指南(或其他“指南”,例如強制您使用某些名稱的 Java Bean 約定)

...

但是,正如 suat 所說 - 最好在您的方法的文檔上花費一些精力。

我們將方法名稱用作命題(例如加號、減號)而不是動詞(例如加號、減號)。 這強調了這些方法(命題)不會改變對象的價值這一事實。

BigIntegerBigDecimal類不遵守此命名約定,並導致許多使用錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM