🍣

Getで始まる名前を関数につける前に読む記事

2023/01/14に公開

今すぐ名前を考え直してほしい。参考までに、自分が普段使っている単語を列挙しておく。経験上、これぐらいあればどれかが当てはまるだろう。

関数の性質 候補
外部のサービスを呼び出す fetch, retrieve
dictionaryやmapから読み出す lookup
簡単な計算をする calculate
複雑な計算をする compute
探索または検索をする find, search
(引数やフィールドから)新しいもの(文字列、URLなど)を作る build, compose, craft
privateなフィールドをほぼそのまま返す get

自分は英語ネイティブではないので、ニュアンスが若干間違っているかもしれない。致命的な間違いがあれば指摘していただけるとありがたい。

なぜGetで始まる名前をつけてはいけないのか

コードを読む人にほぼ何も情報をしないからだ。さらに悪いことに、getterと混同させてしまうおそれもある。

例えば、商品のIDを受け取って、商品名を返す関数 getItemName(int id) があったとしよう。次のコードはどれぐらい時間がかかるだろうか。

for (int i = 0; i < 100; i++) {
    getItemName(i);
}

当然、getItemNameの速さによって実行時間は変わる。getItemNameがハッシュマップから名前を読み出しているだけであれば一瞬で終わる。しかし、REST APIなどを呼んでいて1回あたり100ミリ秒程度がかかるのであれば10秒ほどかかる。

もし、上のコードが

for (int i = 0; i < 100; i++) {
    fetchItemName(i);
}

であったならば、経験を積んだプログラマーであればすぐに「怪しいな」と思うだろう。fetchには取りに行くという意味がありネットワーク通信を行う有名なAPIの名前にもなっている。

Discussion