私のメソッド名の名付け方

[PONOS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ponos)の19日目の記事です。
昨日は、@nisei275さんの「[RustのゲームエンジンBevyでスプライトアニメーションをしてみた](https://qiita.com/nisei275/items/c0c9aaf097a53ac3cf02)」でした。

# はじめに

皆さんは、プログラミングに対してどのようなこだわりをお持ちですか？

私は特に**メソッドや変数の命名**についてこだわることが多く、自身が納得がいく名前になるまで時間をかけて考えるようにしています。

良いメソッド名は以下のようなメリットを与えてくれます。

* 名前からメソッドの目的や振る舞いを理解しやすくなり、他のエンジニアのコード理解を助ける
* そのメソッドがやるべき責任の範囲が明確になり、「やらなくてよい / やるべきではない」処理が混入しづらくなるので、処理の肥大化を抑制できる

そんなこだわりを持っているので、チーム内でプルリクエストのレビューをする際にも命名について指摘・提案する機会が多いのですが、「その時たまたま上手く命名できなかった」のではなく、そもそも「命名があまり得意でない人」が存在しているように感じています。

そこで、この記事では、そうした「命名があまり得意でない人」に向けて、普段から命名にこだわりをもっている自分がどういったフローで名付けをしているのかを紹介させていただきます。
あくまで、私が日頃から実践しているやり方になりますので、多くの人に参考にしていただけるような内容ではないかもしれませんが、何か改善のキッカケになれれば幸いです。

## この記事における「命名があまり得意でない人」の定義について

なお、「命名があまり得意でない人」と一言で言っても、原因は一つではないと考えています。

1. どんな名前をつけても成果物の質は変わらないと考え、命名にあまり重要性を感じていない
2. 自分は良いと思って名付けているのだが他の人から分かりづらいと言われることが多い
3. 適切な命名の手法がわからないので、命名時の納得感が薄い

この記事では、特に2・3の原因で命名を苦手とされている方に情報を届けられたらと考えています。（1に関してはまたの機会に…）

# 私のメソッド名の名付け方

## 1. どんなメソッドになってほしいか想像する

非常に抽象的なアクションですが、まずは作成するメソッドを「どんなメソッドにしたいのか」を想像するところから始めます。

「利用者からどう呼び出してほしいのか」
「クラスにとってのどんな振る舞いを表現したいのか」
などの観点でイメージを作成します。

このとき、「どんなメソッドにしたいのか」をなるべく短文で説明できるようにすることが大切です。
長い文章になってしまう場合、複数の責務や振る舞いを表現しようとしている可能性があります。
複数の役割を持つメソッドは適切な文字数で命名することが難しく、またメソッド内のロジックも複雑化しやすいため、なるべく短い文章で表現できるくらいの大きさまでメソッドの分割を検討しましょう。

また、「驚き最小の原則」を意識して、利用者側がメソッド名から受ける印象と、実際のメソッドの処理とが乖離しないように（実際の動きを見て驚かれないように）しましょう。

https://ja.wikipedia.org/wiki/%E9%A9%9A%E3%81%8D%E6%9C%80%E5%B0%8F%E3%81%AE%E5%8E%9F%E5%89%87

「どんなメソッドにしたいのか」のイメージが固まったら、そこから付けるべき名前を考えていきます。

## 2. 一般的な命名の手法を参考にして名前を決める

コーディング本でよく書かれていることですが、以下のようなルールを意識して名前を決めます。

* メソッド名は「動詞」から始め、動詞 + 目的語の形にする
* 真偽値を返すメソッドについては`Is~`、`Can~`などの単語からはじめ、Yes/Noで回答できるような内容にする
* 省略語を用いない

などなど。

有名なコーディング本をいずれか読んで、一般的な命名の手法を学んでおくと良いでしょう。

https://www.oreilly.co.jp/books/9784873115658/

https://gihyo.jp/book/2022/978-4-297-12783-1

これらのルールに沿って命名をすることで、最低限の読みやすさを担保した名前が決定できます。

## 3. 名前に使っている英語が適切かチェックする

一旦名前を決定したら、そのメソッド名に使用している英語が「適切かどうか / さらに適切な英語表現がないか」を、いくつかの方法を用いてチェックしてみましょう。

### プロジェクトで既に使用されている英語が無いかをチェックする

命名しようとしているメソッドの振る舞いに対して、プロジェクトで既に使われている英語表現がないかを確認します。

一つの振る舞いを指す英語表現がプロジェクトに複数存在してしまう環境では、英語表現の違いから「振る舞いの違い」を意識されやすく、全体的な可読性の低下やメソッドの責務の具体性の低下に繋がってしまうなどのデメリットが懸念されます。

既に使用されている英語があればそちらを採用し、表現が分散しないようにしましょう。

### Google翻訳を使ってチェックする

逆翻訳を駆使してイメージした文章に近い英語を見つけます。

https://translate.google.co.jp/?hl=ja

まずは、メソッド名として名付けた英語を単語ごとに半角スペースで区切り、英語→日本語の翻訳に掛けてみます。
翻訳した結果の日本語が、1でイメージした「どんなメソッドにしたいのか」の説明に近くなっていれば良いのですが、大体の場合は1回では思ったような結果は得られません。（ほぼ、よくわからない日本語になります）
そうしたら、今度は翻訳結果の英語と日本語とを入れ替え、日本語→英語の逆翻訳を掛けてみます。
日本語側の文章を1のイメージに向けて少しずつ変更してみて、翻訳結果の英語の文章を命名に反映します。

### codicを使ってチェックする

https://codic.jp/

前項のGoogle翻訳と似た方法になりますが、codicであればよりプログラム向けの英単語を提案してくれます。

1でイメージした「どんなメソッドにしたいのか」の説明を翻訳元の日本語として入力し、そこから翻訳された英語の文章が、現在名前に使用している英語と近いかをチェックし、必要に応じて命名に反映します。

### 書籍やWeb記事を参考にしてチェックする

そもそも、プログラムに用いるのに適した英語とはどういったものがあるのか、が知りたい場合は書籍やWeb記事から情報を得ます。
なるべく、これらの内容で紹介された英単語を使用するように命名へ反映しましょう。

書籍であれば、「アプリケーションをつくる英語」を始めとした命名に用いる英単語が掲載されたものを参考にします。これらの書籍は辞書的に使用すると便利です。

https://tatsu-zine.com/books/english4app

また、Qiitaの記事の中にも命名に関するものがいくつかありますので、そちらで紹介されている英単語を参考にするのも良いと思います。

https://qiita.com/KeithYokoma/items/2193cf79ba76563e3db6

https://qiita.com/rokumura7/items/cb6302102f5805996ef9

https://qiita.com/Koki_jp/items/f3d3e824f98d182d4100#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E5%90%8D%E3%81%AF%E5%8B%95%E8%A9%9E%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B

## 4. メソッドを呼び出す時の文脈が自然かチェックする

最後に、メソッドの呼び出しをする部分のコードを確認することを推奨します。

`オブジェクト名(クラス名).メソッド名`の記述で呼び出している箇所について英語の文法的に違和感があれば、メソッド名やメソッドの定義を再考してみると良いかもしれません。

# まとめ

以上、私が普段実施している名付け方についての紹介でした。
「命名があまり得意でない人」にとって、何か参考になれば幸いです。

明日は@tequila0725さんです！