好名字——能看出方法特徵的名字纔是好名字

無名天地之始,有名萬物之母——《道德經》 名字是一切的開始,名字是一個東西的縮影。在程序裏面,命名也總是一個難題。

 

數據來源: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複雜 相同條件得到的對象應該是同一個

錯誤的例子

  1. void getAllMatchedGeo()。沒有返回值

  2. 複雜邏輯放在get中,方法使用者可能會錯誤的使用這個方法影響效率。

    Country getCountry(String code) {
        ...
        return new Country(....);
    }

    建議修改名稱爲Country createCountry(String code)

  3. 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的邏輯複雜,可能耗時,可以多次調用

錯誤的例子

  1. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章