こんにちは、まいむです!
この記事はフィヨルドブートキャンプ Part 1 Advent Calendar 2022 - Adventarの10日目の記事です。
Part 1、Part 2のアドベントカレンダーが用意されているので、毎日更新される記事を楽しみながら読んでいます。
フィヨルドブートキャンプ Part 1 Advent Calendar 2022 - Adventar
フィヨルドブートキャンプ Part 2 Advent Calendar 2022 - Adventar
私は「【名前重要】と向き合っている話」というテーマでブログを書きたいと思います。 このテーマを選んだ理由は、現在フィヨルドブートキャンプの課題でオブジェクト指向版lsコマンドの課題に取り組んでいるのですが、クラス名、メソッド名、変数名に至るまで自分の名前の付け方がまだまだ未熟だな・・・と感じる部分が多々あり、今回改めてまとめてみることにしました。
なぜ「名前」が重要なのか
「名前重要」という言葉は至る所で耳にしますが、なぜ重要なのでしょうか? 私はまだまだできているとは言えず、日々意識しながらではありますが、以下がその本質かなと思っています。
- 良い名前はコードの理解を助ける
- 再利用がやりやすくなり、生産性が上がる
コードを書くのは各開発担当者一人であっても、後からそのコードを読み返したり修正や拡張をするのはその人自身であるとは限りません。 そんな時にコードの意図を的確に表した名前で実装がされていたら、仕様の理解やどう手を入れていけばいいかなどの判断が格段にやりやすくなると思います。
良い名前とは?
それでは良い名前とはどんなものなのかというと「説明的で意味・意図が伝わる」ことと参考書籍や記事には書いてあります。 ただ、私の場合は「説明的」ってそもそも何?!となってしまい、単純にメソッドや変数に長々と処理を英語化した読みにくい名前をつけてしまうことが多々ありました・・・。
dividing_books_to_three_array = books.each_slice(split_num).to_a
上記は本の名前が入った配列をさらに3分割する処理を変数に格納したものなのですが、やっていることは配列を分割することなため「説明的」では?と過去の自分は思っていました。
ただ、後から読み直した際に「なんで3分割しているのかが分からない」 ということに気がつきました。 (自分で気がついたのではなくメンターさんにレビューしていただいてなるほど!となりました)
そのため、「説明的」というのはどちらかというと最終的に「振る舞い」を正しく説明できているかに繋がるのかなと今は考えています。
「振る舞い」はメソッドの役割になるため、変数名はその振る舞いのパーツと考えるとどんな名前がよいのかが以前よりは考えやすくなった気がします。
先ほどの良くない変数名は配列を3分割する説明が大事なのではなく、その後に続く処理の一環として3分割が必要という状況でした。 そこで変数名は以下に見直して修正しました。
nested_book_names = books.each_slice(split_num).to_a
先ほどの変数名よりもこちらの方が簡潔で、その後に続く処理のためにネストした配列を作っているんだなということが伝わりやすくなったのではないかと思います。
良い名前をつけるには英語の力も必要
良い名前を考える際に大切だなと感じているのが英語力です。 私は決して英語が苦手なわけではないのですが、いざコードを書くと文法的におかしい英語で名前をつけているということが度々あって恥ずかしくなることが未だにあります・・・!
most_long_name = names.map(&:size).max
long
の最上級はlongest
ですね(涙)
こういった大切な点に意識が及ばず、処理を通すことに必死になってしまうため、リファクタリングの段階で名前に使用した英語の文法的な部分はおかしくないかということも自分のチェックリストに追加しています。
終わりに
私は現在進行形で「名前重要」と向き合う日々で、最近ようやく上に書いたようなことを考えながらコードが書けるようになってきました。 良い名前を考えることは、意識的な面もありつつ、先輩方のコードをたくさん読むことも成長につながると感じています。 フィヨルドブートキャンプでは課題に対してメンターさんが実装されたコード例が解説されていることがあるのですが、それを読むと良い名前の宝庫です。
他にも技術書のサンプルコードや実際のサービスのコードなど「名前」に触れる機会はとてもたくさんあるため、自分の中に自然と良い名前を考えられる意識の土台を作っていけるように研究していきたいなと思っています。