プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

コードの可読性は、名前の付け方でほとんど決まる

議論の中で私は、
コーディングで垂直方向にそろえるインデントをとるべきか
というささやか
な聖戦を仕掛けました。私は全面的に賛成です。理由を説明しましょう。

【翻訳】私がコーディングで垂直方向にそろえるインデントをとる理由 | POSTD

コードブロックのイン
デントを自動的にとるアイデア
は面白いね。こういうのがIDEで使えるんだ
ったら、垂直方向のインデントを取ることには賛成だな。個人的には、テーブル
のように表形式で見ることが望ましいと思える時はインデントを揃えるけど、

const table_t tables[] = {
    { 10,   "foo", },
    { 2,    "bob", },
    { 33,   "brah", },
    { 0,    NULL, }, // terminator
};

そうでない時には、基本的には揃えない。

foo()
{
    param_t p;

    p.size = sizeof p;
    p.horizontal = 0;
    p.vertical = 1;
    <...>
}

インデントを揃えるかどうかは、その労力に見合うだけのメリットがあるかどう
かで判断してる。

ところで

名前の付け方やスペースの入れ方、さらにキャピタライゼーションルールをよく
考えて適用することで、私たちのコードはかなり読みやすくなりました

コードの可読性は、この名前の付け方でほとんど決まる。プログラムは言ってみ
れば、名前の集合体だ。クラス名/メソッド名/関数名、一時変数に至るまで、そ
れが何を表しているのかが明確になっていれば、プログラムを読み解くのがとて
も楽になる。

意味のある名前にしよう

sub1(), sub2()なんてのは論外だよね(笑)1と2に分けた理由があるはずだ。も
し付ける名前に迷うようなら、命名対象が何をすべきか定義できてないんじゃな
いかな。そもそも何をするものだったのか、原点に戻って考えてみよう。

別にカッコいい名前を考える必要なんてないんだ。一生懸命、英和辞典を使って
意味を考えた名前が、後で見たら何のことか分からない、なんて経験はない!?
ボクの場合、最初に思いついた名前を使うことが多い。それが一番素直なネーミ
ングであることが多いから。

forループのインデックスとか、スコープが限定される場合はtempとかでもいい
と思う。やり過ぎないレベルで :)

抽象的な名前は避けよう

get_data()とか。データって何だよ(笑)突き詰めて考えると、それが何のオブ
ジェクトかは決まるはず。

命名規則を統一しよう

ある場所ではget_vertical_position, 他ではgetVerticalPositionとか、ちょっ
とモヤモヤするよね。プログラム全体で命名規則は統一した方が読む側も内容が
想像できる。同じ意味でコーディングスタイルも統一するといいよ。

一つの変数を別の意味で使うことは避ける

countやsizeを別の場所で違う意味で使うことは、なるべくしないようにする。
意味のある名前にすることが望ましいけど、そこまでこだわる必要がなければ、
スコープを限定するという方法もある。

foo()
{
    {
        int count;

        <...>
    }

    {
        int count;

        <...>
    }
}

これに限らず、名前のスコープを限定することは大事。オブジェクト思考言語だ
とやりやすいけど、意識をすることは必要。javaでいつの間にかシングルトンだ
らけだった、なんて経験はない!? :)

関数/メソッドの戻り値、例えばretなんかを使いまわす、なんてのは例外。

結論

コーディングは、自分自身の考えを表現する創造的な方法です。表現したアイデ
アを難しく見せてしまうようなツールであるのなら、インデントではなく、ツー
ル自体を改善すべきでしょう。

この結論には同意。コーディングは自己表現なんだ。せっかく作ったプログラム
だから、ぜひ主張しよう :)