[英]determining which verb to use for method names in Java
我知道命名約定很重要,原因有很多,主要是為了讓你的代碼更易讀,更容易集成到更大的項目中,等等。在 Java 中,大多數約定要求方法名稱必須以動詞的lowerCamelCase
開頭。
我的問題是:我如何選擇動詞來開始方法名稱?
為了使這個問題不那么含糊,我經常遇到這樣的情況,即我的方法名稱的首選是描述輸出的名詞。 在這些情況下,我通常會在名詞字體中附加通用動詞(例如get
、 generate
、 calculate
等)以符合動詞規則之間感到糾結。 是否有關於何時使用哪個的一般准則?
這是一個例子。 我有一個方法,它采用double[] array
和一個int k
並返回double[] newArray
,它是array
的長度k
移動平均值,即newArray[i] = (array[i-k+1]+...+array[i])/k
進行一些捏造以使newArray
的長度與array
相同。 我傾向於調用這個方法movingAverage
,因為這是它返回的內容,但由於它不是以動詞開頭,所以不適用。 我應該將此方法getMovingAverage
或generateMovingAverage
或calculateMovingAverage
還是無關緊要?
我通常會問自己:
這個方法在做什么?
答案決定了應該調用什么方法。 當然,它完全獨立於程序員。
注意:如果你不能簡潔地描述這個方法在做什么,它可能做的太多了,應該分開。
選擇方法的動詞:
現在,並非所有方法都以動詞開頭。 但他們真的不需要。 如果您閱讀:
... myString.length();
或者
... myArray.size();
你確切地知道發生了什么——不需要動詞。 對於 Java 層次結構中更高層的許多類方法都是如此。 集合、數學等。只要名稱准確地傳達了方法的作用,就可以了。
不要忘記對布爾方法使用這個動詞“is、has 或 can”,例如: is On()、 is Full() 等。
關於僅對屬性訪問器使用get
和set
方法:信息隱藏的全部意義在於 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)。
正如您所說,正如我們在答案中看到的那樣,方法名稱開頭使用的動詞幾乎是相同的動詞。 我認為,如果花費相同的精力來編寫相關文檔,方法就會變得更容易理解和集成:)
讀完這個問題我也意識到,我寫的大多數方法都是從get 、 retrieve 、 create開始的。 因此,動詞選擇似乎並沒有那么重要。
最好的
我認為要找到任何可能成為問題“解決方案”的東西,我們應該首先提取在選擇名稱方面發揮任何作用的標准,例如:
...
但是,正如 suat 所說 - 最好在您的方法的文檔上花費一些精力。
我們將方法名稱用作命題(例如加號、減號)而不是動詞(例如加號、減號)。 這強調了這些方法(命題)不會改變對象的價值這一事實。
BigInteger
和BigDecimal
類不遵守此命名約定,並導致許多使用錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.