NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

適切な命名とは

本記事は  執筆デビューWeek  最終日の記事です。
✨  12日目  ▶▶ 本記事

はじめに

3年目エンジニアの八谷です。8月に中途入社し、Webアプリの開発を行っています。

NRIネットコムに入社してチームメンバのコードレビューをする・してもらう機会ができたのですが、前職ではそういった機会がほとんどなかったため焦り、先日リーダブルコードを読みました。 新卒のときに先輩に薦められ購入したものの少し読んで飽きてしまい、本棚の肥やしになっていました。

書籍の中で特に印象に残ったのが、「適切な命名の大切さ」。今までのプロジェクトではコードレビューの文化があまりなかったため、変数名などをつける際に自分がわかればいいやと直感的に付けていました。

何事も名前には由来や理由があることがほとんどだと思います。
例えば、私の家で初めて飼った犬は、「イチゴ」と名付けました。家族全員好きな食べものが苺だったからです。
初めて飼った猫は「ラム」でした。拾い猫だったのですが、あまりにもミャーミャーうるさかったため、うる●やつらの「ラム」から名前をいただきました。
このように、ペットや人、地名など何にでも名前に由来があることが多いです。(もちろん、直感的に付けられたものもあると思いますが)

少し脱線しましたが、この記事ではリーダブルコードの中でも、印象に残ったものをピックアップしてまとめようと思います。

名前に情報を詰め込む

明確な単語を選ぶ

例えば以下のようなメソッドは、ページをどこから取ってくるのかがわかりません。どこから取ってくるかによってメソッド名を工夫するべきです。

 // どこからページを取ってくる?
 getPage(url){ };
 // インターネットから取ってくる場合
 fetchPage(url){ };
 downloadPage(url){ };

私は今までgetを乱用していたので気を付けるようになりました。
値をどこかから取ってくるのではなく、取ってきた値を利用して別の変数を作り出す場合はcreate〇〇、複数ある値から特定の値を見つける場合はfind〇〇など、命名する前にメソッドで何をしているのかを少し考えることで可読性はぐっと上がります。
また、以下は書中から引用したよく使われる単語とその代替案です。
状況に合わせて様々な単語を選べるとより良いと書いてあります。

単語 代替案
send deliver, dispatch, announce, distribute, route
find search, extract, locate, recover
start launch, create, begin, open
make create, set up, build, generate, compose, add, new

汎用的な名前を避ける

tmpやfoo、hogeなど意味のない命名は、理由がない限り避けるべきです。
個人的にあまり意識していなかったのがfor文などで一時的に使用する名前です。

for(int i = 0; i < classList.length; i++){
    for(int j=0 ; j < nameList.length; j++){
        for(int k = 0; k < detailList.length; k++){
        }
    }
}

これでも特に問題はないのですが、中の処理を書いていった場合にバグが見つけにくいです。
少し手間ではありますが、以下のように書くことでi、j、kが何を指すのか一目でわかりますね。

for(int class_i = 0; class_i < classList.length; class_i++){
    for(int name_j=0 ; name_j < nameList.length; name_j++){
        for(int detail_k = 0; detail_k < detailList.length; detail_k++){
        }
    }
}

名前に情報を追加する

命名をおろそかにすると以下のような間違いが起こることがあります。

let start_time = (new Date()).getTime();
let elapsed_time = (new Date()).getTime() - start_time;
alert('読み込み時間 : ', elapsed_time, '秒');
// elapsed_timeはミリ秒なので×

間違いを回避するには

start_time → start_time_ms

elapsed_time → elapsed_time_ms

にすれば間違いに気づきやすくなります。

let start_time_ms = (new Date()).getTime();
let elapsed_time_ms = (new Date()).getTime() - start_time_ms;
alert('読み込み時間 : ', elapsed_time_ms/1000, '秒');

過去にこのような工夫がされていないプログラムがあり、「これはミリ秒?秒?」と混乱した経験があるのを思い出しました。 名前が多少長くなってもわかりやすいほうが大切です。

名前のフォーマットで情報を伝える

フォーマットを使い分けることも大切です。例えば、
関数名に使われるキャメルケース(camelCase)や変数名に使われるスネークケース(snake_case)があります。
クラス名やコンストラクタではパスカルケース(PascalCase)が使われます。
他にもjQueryのライブラリ関数を呼び出すときや、RxJSのObservableを使うときには「$」を使用します。

// jQuery
let $all_images = $("img");
// RxJS
nameList$ = service.getNameList$();

※書中ではキャメルケースとパスカルケースを区別していません

新卒で初めてjQueryを触ったときに「$」を見て意味が分からず、jQueryの参考書を読み漁ったことがあります。
飽きずにリーダブルコードをキチンと読んでいればそんなことをしなくて済んだのにと少し後悔です。

おわりに

以上がリーダブルコードを読んでみて、「適切な命名の大切さ」を学んだ感想とまとめです。
「適切に命名する」ことで、自分で後からコードを読んだ際に混乱することが防げますし、他人からもわかりやすく、バグを起こしにくい・起きても原因がわかりやすいコードになります。
基本的なことかもしれませんが、この記事を読んで今日コーディングをする際に改めて一度立ち止まってその命名がわかりやすいかを考えてみていただけると幸いです。

執筆者:八谷紗樹 Webアプリエンジニア