良いコ-ドへの道―普通のプログラマのためのステップアップガイド

第2回 名前付け重要。または,良いコードは良い名前から生まれるんです。―その2 良い変数名

この記事を読むのに必要な時間:およそ 2 分

良い変数名

プログラムでは,名前を付ける場面が数多くあります。ここからは,個々の要素である変数名,メソッド名,クラス名,パッケージ/ネームスペース名の良い名前について見ていきます。まずは変数名です。

説明的な変数名

変数には値やオブジェクトが格納されています。変数名を見るだけで,何がどのような役割として格納されているのか明確なものが良い名前と言えます。

たとえば,

// ×何の数値?
int n;

// ×何の言語?
String[] languages = {"ja", "en"};

// ×何のフラグ?
boolean flg = false;

// ×何のユーザエージェント?
UserAgent userAgent;

のように「n」「languages」「flg」「userAgent」という変数名を付けられても,あとから見返したときに変数の役割がわかりません。

次のように「orderCount」「availableLanguages」「exists SameName」「unknownUserAgent」と具体的で明確な名前付けにしておけば,あとから見返したり,他人が見ても理解しやすいコードになります。

// ○オーダー数ということが明確
int orderCount;

// ○利用可能な言語
String[] availableLanguages = {"ja", "en"};

// ○同性同名が存在するか?(存在する場合=true)
boolean existsSameName = false;

// ○未知のユーザエージェント
UserAgent unknownUserAgent;

ただし変数は,変数の種類とその変数のスコープ注3によって求められる良い名前の性質が異なってきます。スコープが広いとさまざまな個所から参照されるので,影響範囲が大きいと言えます。よって,より具体的な名前付けが求められます。それでは以下,種類別に見てみましょう。

注3)
変数の値を参照できる範囲のこと。変数の宣言から始まり,変数の値が参照できなくなるまでの範囲。

フィールド変数,クラス変数

フィールド変数とはインスタンス変数のことです。フィールド変数,クラス変数はローカル変数などと比較すると変数のスコープが広いため,特にその変数の意味を正しく表現した名前が望ましいです。

メソッドのパラメータ

パラメータ名は,わかりやすくて簡潔な名前がよいでしょう。パラメータ名は利用者がAPIリファレンスで参照したり,Eclipseなどの統合開発環境から変数名の候補として利用されるので,極端に短い名前を付けるのは避けるべきです。

ローカル変数

メソッド内などで一時的に宣言される変数です。スコープは長いものもあれば,for文で使用するiなどのループカウンタのように短いものもあります。

スコープが長いものは,フィールド変数と同様,変数の意味を正しく表現する具体的な名前を付けてください。

スコープの短いものに関しては,以降で説明するような使い分けを適宜行ってください。

イディオムに従う/従わない

配列の中身を逐次処理するループカウンタ変数(i,j,k)などのように,よく使われる慣習的な変数名は,そのままイディオムに従ったほうがわかりやすいコードになります。

// ×ループカウンタの変数名が慣習的ではなく長過ぎる
for (int empCounter = 0; empCounter < employes.size;
        empCounter++) {
    Employee emp = employees[employeeCounter];
    ...
}

// ○ループカウンタの名前が慣習的で短く,可読性が高い
for (int i = 0; i < employes.size; i++) {
    Employee emp = employees[i];
    ...
}

ただし例外的な場合もあります。具体的な名前を変数名にしたほうがわかりやすい場合はそうします。たとえば座標系を扱う場合などです。

// ×i,jのどちらがx座標,y座標なのかわからなくなる
for (int i = 0; i < width; i++) {
    for (int j = 0; j < height; j+) {
        int color = getColor(i, j);
        ...
    }
}

// ○変数名をx,yとしたので,わかりやすい
for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y+) {
        int color = getColor(x, y);
        ...
    }
}
変数名が短くしたほうが可読性が向上する場合もある

十分に見通せる範囲で一目瞭然の場合,一時的な変数は短くてもかまいません。特に,ループ内の変数や短いメソッド内の変数では,短くしたほうが逆に可読性が向上する場合があります。

// ×変数名siteContactChangelogは長過ぎる
for (int i = 0; i < siteContactChangelogs.length; i++) {
    SiteContactChangelog siteContactChangelog
        = siteContactChangelog[i];
    siteNames[i] =
        siteContactChangelog.getSiteName();
    siteTitles[i] =
        siteContactChangelog.getSiteTitle();
    sitePicIds[i] =
        siteContactChangelog.getPicId();
    sitePicNames[i] =
        siteContactChangelog.getPicName();
}

// ○変数名logで十分意味は理解でき,可読性も向上する
for (int i = 0; i < siteContactChangelog.length; i++) {
    SiteContactChangelog log
        = siteContactChangelog[i];
    siteNames[i] = log.getSiteName();
    siteTitles[i] = log.getSiteTitle();
    sitePicIds[i] = log.getPicId();
    sitePicNames[i] = log.getPicName();
}

著者プロフィール

縣俊貴(あがたとしたか)

学生時代にMSXで制限された環境でのプログラミングの楽しさを学ぶ。以来,オープンソースのWiki実装「MobWiki」の開発や受託開発などを経て,現在はプロジェクト管理ツール「Backlog」,ドローツール「Cacoo」など,コラボレーション型のWebサービスの企画と製品開発を行う。また,Webアプリケーションフレームワーク「Cubby」のコミッタを務める。福岡在住。株式会社ヌーラボ所属。

ブログ :http://d.hatena.ne.jp/agt

Twitter:@agata

コメント

コメントの記入