シンボル名の省略についての考え方

変数、関数などのシンボル名の命名に悩むことはよくあると思います。

言わずとしれた名著「リーダブルコード」においても名前付けは1章割かれるぐらい大切で難しいテーマですが、今回は省略についての私の考えを述べたいと思います。

シンボル名をつける場合、長過ぎる場合には省略した名前付けをする場合がありますが、省略は適切に行われないと可読性に大きな影響を及ぼすため、慎重になる必要があります。

迷ったら省略しない

当然ながらシンボル名というのはどう付けようがコードは動きます。ただコードを読む側の立場に立った時、私の経験では省略が多用されたコードは読みにくいと感じる場面が多かったです。

例え適切な省略であっても、省略元の意味を推測するのには少なからず時間がかかるため、省略が多用されているコードを読むのはやはり時間的コストがかかってきます。

基本的に他人の書いたコードの理解というのは難しいもので、であればコードにはなるべく理解を助ける情報を多く残した方がいいというのが私の基本的な考え方です。

迷ったなら無理に省略せず、多少冗長と感じるぐらいでも大きな問題となる例は少ない(むしろ読むうえでメリットの方が大きい)ように思います。

長過ぎる名前を後から短くすることは容易ですが、短すぎて意味が推測できないシンボルに適切な名前を与えるのは難しいです。

長い場合のデメリットとしてはまず入力が煩雑になるということが考えられますが、現代のエディタは補完が優秀なのでそこまで手間ではないと思いますし、入力の手間を惜しんで可読性を落とすことの方が後々への影響は大きいです。

もちろん競技プログラミングなど、時間が非常に大切な場面もあるでしょうが、一般的な製品のコードでは「長すぎる」ぐらいでも構わないと私は思います。

もう1つ大きなデメリットとしてコードの量が増えるということが考えられ、例えばシンボル名が長いせいで1行の長さが長くなり逆に可読性が落ちる、という場合にはうまい省略の方法を考えていく必要があります。

シンボル名のスコープで考える

例えば関数内のローカル変数のようにスコープが短い場合、ある程度大きな省略も問題ないと思います。

以下はC++でファイルを読み込む処理を行おうとする例ですが、読み込み用クラス名のifstreamからインスタンスをifsなどと省略するのはよく見られる省略法です。

C++
#include <iostream>
#include <fstream>

void read_data()
{
    ifstream ifs("hoge.csv");  // ifstreamクラスのインスタンスをifsと省略
    // 以下データ読み込み処理
}

この省略は定義さえ見れば内容が推測できますし、1関数であれば長さもそこまで長くないでしょうから「あれ、この変数何だっけ」と何度も確認するということになりにくいからです。(もし関数の長さが数千行とかになっているなら、それはまた別の問題)

逆に言うとスコープが広いもの、クラス名やインターフェイス(特にアクセスレベルが広いもの)は省略すべきではないと考えます。

クラス内のprivateなメンバであっても、クラスの実装が大きくなっていくうちにスコープは広くなることが多いため、基本的には必要に迫られなければ省略しない方がわかりやすいと思います。

一般的な省略語は用いても問題ない

informationをinfoと省略するなど、プログラミングに限らず一般的に使われる省略語は使っても問題ないと思います。

ただ省略した場合に他の単語と見分けがつかなくなるような場合には注意が必要です。

省略の方が一般的な場合にはむしろ省略を行う

例えばPythonにおいて、numpyやmatplotlibはasを使って省略したパッケージ名が与えられるのが一般的です。

Python
import numpy as np
import matplotlib.pyplot as plt

もはやこれは省略というよりこうするのが常識というぐらいで、逆に省略されていないコードをあまり見たことがないレベルです。このような場合にはむしろ常識に合わせるべきだと思います。

コメント

タイトルとURLをコピーしました