無名天地之始,有名萬物之母——《道德經》 名字是一切的開始,名字是一個東西的縮影。在程序裏面,命名也總是一個難題。
數據來源:https://ubuntuforums.org/showthread.php?t=690304
我統計了一下項目代碼中方法都是用什麼開頭的,統計時僅包含Java代碼,不包括測試代碼
這裏統計了某產品的所有Java項目面代碼,不包括測試代碼,多數工程使用了lombok。
從上面的圖看,命名還是很多樣的。一般情況下命名挺簡單的,但是我還是看到了好多這樣的方法
-
void getAllMatchedGeo() // 得到的Geo信息在哪裏呀?
-
void setE2eRpk() // 我怎麼把Rpk的數據給你呀?
看似簡單的命名,還是出現了讓人困惑的東西。其實我們常用的get、set、from、to,其實都各自有個字的意思,這些詞和參數組合起來必須可以表達完整的意思,纔算是命名正確。下面是一些我對命名的想法:
按照場景分類
獲取信息類方法
獲取信息類方法一定有返回值
前綴 | 語義 | 例子 | 是否耗時 | 返回對象是否同一個 |
---|---|---|---|---|
get | 拿到一個已經存在的數據,如果沒有找到不拋出異常 | String getName() String getNameByCode(String code) |
不耗時,一般和屬性對應,直接讀取 | 相同條件得到的對象應該是同一個 |
create | 創建一個新的對象 | List<AbstractCriteria> createWeeklyCriteria(QueryContext context) | 有相對複雜的邏輯,耗時 | 每次返回的都是新對象 |
find | 在給定的列表中或者自身的數據中找到某個符合條件的對象,如果沒有找到不拋出異常 | String findLatestVersion(Set<String> versions) | 邏輯比get複雜 | 相同條件得到的對象應該是同一個 |
錯誤的例子
-
void getAllMatchedGeo()。沒有返回值
-
複雜邏輯放在get中,方法使用者可能會錯誤的使用這個方法影響效率。
Country getCountry(String code) { ... return new Country(....); }
建議修改名稱爲Country createCountry(String code)
-
Date getStartInWeek(Date date)
從一個日期計算這個日期所在的周,然後取這個周的第一天。這是一個複雜的邏輯,建議不使用get,改爲calculateStartInWeek
配置類方法
配置類方法一定會有輸入參數,可以有返回值,返回原來的值
前綴 | 語義 | 例子 | 是否耗時 |
---|---|---|---|
set | 設置參數 | void setName(String name) String setParam(String name, String value) |
不耗時,一般和屬性對應 |
init | 初始化某些信息,可以沒有參數 | void initIndex() void initParam(String name, String value) |
比set的邏輯複雜,可能耗時,一般只調用一次 |
config | 配置某些信息,一般有參數 | void configRequiredColumn(Collection<String> columns) | 比set的邏輯複雜,可能耗時,可以多次調用 |
錯誤的例子
-
void setE2eRpk()。讀者不知道set的數據是什麼,建議修改名稱爲initE2eRpk(),表示通過對象上的已有信息初始化或者直接進行無參數初始化。
轉換類方法
轉換類方法一定有返回值
前綴 | 語義 | 例子 | 是否耗時 | 返回對象是否同一個 |
---|---|---|---|---|
to | 將當前對象或者參數轉換爲其他類型,一般轉換前後對象具有相同含義,只是類型變了 | DateRange toDateRange() | 邏輯簡單,不耗時,不報錯 | 每次都新建一個對象 |
from | 將某個對象的信息轉換爲當前類型,一般轉換前後對象具有相同含義,或者具有組成關係 | WeeklyDTO from(Weekly data) | 邏輯簡單,不耗時,不報錯 | 每次都新建一個對象 |
parse | 從複雜的字符串或數據中解析出數據 | Map<String, Object> parseResponse(String responseJson) Object JSON.parseObject(String json) |
邏輯複雜,耗時,可能報錯,建議通過異常報錯 | 每次都新建一個對象 |
of | 一般在享元模式中,根據key值找到享元對象,是靜態方法 也用於表示在一個整體中取一部分 |
ZoneId of(String zoneId) Enum.valueOf(String name) SheetAgency of(Workbook workbook, String sheetName) |
可以只是檢索過程,也可以有初始化過程,初始化的結果會被緩存 | 相同的key會得到相同的結果 |
convert | 從一種表現形式轉換成另一種表現形式 | BigDecimal convertWeightToKg(String weightUnit, String weight) | 有點耗時 | 每次都新建一個對象 |
其他
-
load/save
成對出現,表示從IO讀取和寫入IO
-
read/write
成對出現,表示從IO讀取和寫入IO
-
方法名稱要精簡
類似方法名稱爲parseExcelAndCheck,其實解析Excel一定會檢測Excel格式是否有效,因此這裏的AndCheck很多餘,建議直接命名爲parseExcel