2012年02月26日

タブ文字の幅を変えても崩れないソースコードの書き方

Linux のリーナスは、タブ文字の幅を8にするように強制しています。 Python は、タブ文字を使わないで、4つの空白文字を使うように推奨しています。

ベストなタブ幅はいくつでしょうか。

それはソフトウェアの種類や、プログラマーの慣れや気分によって変わります。

タブ幅が8ではないと、インデントが見にくいといった主張や、タブ幅が2ではクレイジーだ(リーナス)とか、タブ幅が8では1行に書ける文字数が少なくなるから2が良いとか、4ぐらいが丁度いいとか、理由は様々です。

インデントを深しなければタブ幅が8でも十分だとか、インデントを深くしなくて済むタイプのソフトウェアではないとか、別の方向に議論が発散する危険もあります。

結論としては、絶対的なベストなタブ幅は無いということでしょう。

そんな気まぐれなプログラマーに応えるタブ文字の記述方法があります。

まず、
★(1) インデントに使う文字は、空白文字ではなくタブ文字にします。

インデントの幅を、テキスト・エディターのタブ文字の幅に設定しても、インデントの幅が変わらなくなってしまうからです。

もう1つは、
★(2) 行頭以外にタブ文字を使わないで空白文字を使うことです。

行頭以外にタブ文字を使うと、次のように列をそろえたとき、タブ文字の幅の設定が異なるテキスト・エディターを使うと、列が揃わなくなります。

タブ幅8で、列(paramX)をそろえたとき、
^_______int^____param1`=`10;
^_______short^__param2`=`1000;


タブ幅4で、表示させると、列(paramX)が揃いません。
^___int^param1`=```10;
^___short^__param2`=`1000;


( ^ はタブ文字、_ はタブ文字による余白、` は空白文字です)

行頭以外にタブ文字を使わないで空白文字を使えば、

タブ幅8で、列(paramX)をそろえたとき、
^_______int`````param1`=```10;
^_______short```param2`=`1000;


タブ幅4で、表示させても、列(paramX)は揃います。
^___int`````param1`=```10;
^___short```param2`=`1000;


ただし、
★(3) 行の途中からタブ文字から空白文字に変えなければならないことがあります。

タブ幅8で、列(1と4)をそろえたとき、
^_______int``array[]`=`{`1,`2,`3,
^_______^_______^_______`4,`5,`6 };


タブ幅4で、表示させると、列(1と4)が揃いません。
^___int``array[]`=`{`1,`2,`3,
^___^___^___`4,`5,`6 };


行の途中からタブ文字を使わないで空白文字を使えば、

タブ幅8で、列をそろえたとき、
^_______int``array[]`=`{`1,`2,`3,
^_______`````````````````4,`5,`6 };


タブ幅4で、表示させても、列は揃います。
^___int``array[]`=`{`1,`2,`3,
^___`````````````````4,`5,`6 };


最後に、
★ コーディング・ルールは、強制してはいけません。

上記の3つのルールも強制してはいけません。推奨です。

コーディング・ルールの強制は、開発効率を落とす原因となります。 例外の無いルールは無いという法則が、コーディング・ルールにはよくあてはまるからです。 そもそも読みやすいコードは、文章と同じで、簡単にルール化できるものではありません。 簡単なルール(低コスト)だから少しでもルールを使った方がいいだろうという考えは間違いです。 弊害が出るのです。 文章家が規制によって、自由を奪われそうになったときによく主張される弊害が、そのままあてはまります。 Linux が共産主義と同じように、良かれと思ってトップが指導したことが、自由を奪うのは偶然でしょうか。

どうしてもコーディング・ルールが強制されるときは、変換ツールを使いましょう。 開発中の vbslib4 には、タブ文字と空白文字を変換するコマンドを用意しています。 列が崩れることが無いように、タブ文字の位置によって空白文字の数を変えています。 上記(3)のケースは、機械的に判断できないため、列が揃わなくなりますが、幸い列をそろえることまで強制しているところは少なそうです。

sage_p at 22:51│Comments(0)TrackBack(0)プログラミング 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔