Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

Make each program do one thing well.

UNIX哲学の一つですね。僕のお気に入りの言葉の一つです。今回はプログラムの様々なところで使えるこの言葉について語りたいと思います。

一つのプログラムは一つのことをうまくやりなさい

プログラムを関数と置き換えて読むこともできます。 一つの関数が一つのことに専念することで結合性が下がりテストもしやすく、再利用性も高まります。

「一つの関数が一つのことに専念する」とは

例えば「ひらがなの文字列を受け取りローマ字に変換してスペースで区切り、区切ったそれぞれの頭文字を抜き取り返す」というイニシャルを生成する関数を考えます。

愚直に考えるとこのようなプログラムになります。

function takeInitialChar(string) {
    var roman;
    roman = string.replace(/[あいうえお]/g, function(a) {
        return 'aiueo'.split('')['あいうえお'.indexOf(a)];
    }).replace(/[かきくけこ]/g, function(a) {
        return 'k' + 'aiueo'.split('')['かきくけおこ'.indexOf(a)];
    }) // ...
    return roman.split(' ').map(function(s) {
        return s.charAt(0);
    });
}
このコードは

1. 文字列を受け取りローマ字に変換
1. スペースで区切る
1. 頭文字を取る

という処理に分割できます。つまり複数のことを行おうとしています。複数のことを行うときは、一つのことに専念する関数を組み合わせることで複数のことをできるようプログラムします。

こうすればどこの処理で問題が発生したのか分かりやすくまた、それぞれの処理でテストが書けますのでバグを減らすことができます。

#複数の関数に分ける

上の処理をそれぞれ関数に分割します。

1. ローマ字に変換する関数
1. スペースで区切る関数
1. 頭文字を取る関数

以上の関数をうまく定義できたとします。するとtakeInitialCharを以下のように簡潔に書き直せます。

function takeInitialChar(string) { return getRoman(string).split(' ').map(takeInitial); }

先のプログラムよりも分かりやすくテストもしやすく安全になりました。

#終わりに

本来はlsコマンドのようなモジュールを作る際の言葉でしたが、実はプログラミングではさらに重要な意味を持つ言葉だと理解してもらえたと思います。