質問: インデントにタブを使うことのデメリットはありますか? タブを使うことのメリット・半角空白を使うことのデメリットとしては ・半角空白を複数で1インデントとすることにより、少ない文字数で表現でき、ファイルサイズが小さくなる ・1インデントが正しく構成されているか一目でわかる →例えば半角空白4つで1インデントとするルールで、3インデントのはずの個所で半角空白11個とか13個で書かれているケースをしばしば見かけるが、ぱっと見ただけでは正しいインデントなのか判別しにくい ・タブならエディタの設定で、自分の見やすい表示幅に調節できる(ことが多い。エディタによるが) ・インデント中をカーソルで移動する際やインデントを削除する際に、少ないキー押下回数で済み楽に操作できる ・エディタの表示設定で、半角空白・全角空白・タブを表示するようにしたときに、半角空白でインデントをしているとうっとうしい →「半角空白・タブの混在」や「全角空白の混入」を避けるために、非表示文字も見分けがつく設定にしておくべきだと思う ・半角空白でインデントを表現する場合、2個派と4個派とその他派で対立が起こる が挙げられ、一言で言えばタブを使うことは、メリットが多くデメリットは無く、合理的だと思っています。 ところが、以前先輩と話したときに「タブは制御文字だから問題が起きることがある」というようなことをいわれたことがあります。そのときに明確に確認できず、またもう話す機会が無いので確かめられません。 それが正しいかどうかは別とし... (1)インデントにタブを使うことにデメリットはあるか (2)インデントに半角空白を使うことにメリットはあるか (3)現実問題として問題が発生することはあるか。あるなら具体的に。 についてご意見ください。 プラットフォーム特有・言語特有の場合には、その旨を明記していただきたいです。 よろしくお願いします。 ※ここで言う**「インデント」**とは、**「ネストの階層構造を表現するために行頭に非表示文字を挿入し字下げすること」**とします。**行中の位置揃えや装飾を「インデント」と呼ぶ人もいるようなのですが、本質問では無関係**とさせてください。 ※また、スペース派の方は「タブ幅が8文字になっていたとき」を引き合いに出す人がなぜか多いのですが、**本質問は「文字数の比較」では無く「タブとスペースの比較」**です。ので、「タブ幅が8文字になっていたとき」を引き合いに出すのならば**「タブ幅が8文字になっていたときは問題が起きるが、タブ1文字を半角8文字に置き換えたら問題は起きない」ことを前提条件**として考えていただきたいです。 ※プロジェクトの方針等でルールが定められていた場合に、ルールに従うのは当たり前の話です。ので、そのようなケースはここでは考えません。単独のプロジェクト等で、方針を決める際の選定理由などと考えていただければいいと思います ※一応、最近私が扱う言語は、PHP, Java, JavaScript, HTML, CSS、開発対象はWebシステム, Webサイト, Androidアプリ, Chrome拡張です。一応このあたりをターゲットとしていただきたいですが、上記以外でも「この言語ではタブではエラーになる」 等の情報がありましたら教えていただきたいです。 ※インデントにタブとスペースを混在させることは、少なくとも私にとってはありえないことで、必ずどちらかに統一すべきだと思います。なので基本的には議論の対象から外したいのですが、「混在も許すべき」「場合によっては役に立つ・必要」「混在も選択肢に入れるべき」などというご意見をお持ちの方は、そのお考えを教えていただきたいです。 この議論でよくつかわれる画像を添付しておきます。 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/9c8d2ed514b5c2268698792bee28fe2c.png)
回答: 並び順が回答の都合上悪いのであべこべに回答しますよ。 あと、全部のレスをさっと読んで、感覚的な話だなと思ったので感覚的なことを書きます。 **私はタブインデントが大嫌いですからその理由を感情的に書きます。** コメント上の貴方はかなり情熱的な感じなんで、その方がなんか貴方と話し合える気がしたからです。 (3)現実問題として問題が発生することはあるか。あるなら具体的に。 ================================= この話はインデントそのものとは関係ないことに注意してください。 まず、単純にタブ文字そのものに困ったことが私はあります。 成熟していない米国の開発環境のエディタが2バイト文字に対応しておらず、日本語の右にタブを入れるとインデントがズレてしまうというのに遭遇したことがあります。 これには困りました。 ``` ShowDialog( "確認", // タイトル "CSVを出力します。"); // 本文 ``` これ、自分にとっては「タブの本質的な問題」そのものなんですよ。 エディタが悪いっていうかもしれないけど。 複数人で作業するだけでなく、エディタも含めて読み手側に制御をゆだねるような作りが私は好きじゃありません。 タブ文字っていうのは、マジックナンバーと同じで、正当な扱いを書手と読者両方に求めてる奴です。 プログラミングを初めて1年の間は好んでタブ文字を使っていました。しかし、私個人はこの経験を経てタブ文字そのものがノイズであるという認識に変わりました。 (1)インデントにタブを使うことにデメリットはあるか ========================== まずタブ文字が「画一的でない。状態が固定されていない。」というデメリットを持っています。 「読者が好きに幅を設定できる」はメリットではありません。 タブ文字を使うことによる、動作上のデメリットは今となってはほとんどありません。 エディタから見ればタブも空白もただの文字です。 しかも、タブ文字の利用が貴方の内容なら相当限定されている。 この限定条件下でインデントそのものがタブかどうかははっきり言ってほとんどの読者には関係ありません。 貴方のやり方なら人間の目から見て即座にタブとスペースの互換に問題も起きないでしょう。 しかし。ですよ。 だからこそタブでインデントしたらデメリットがあるかと言われれば、私は「ある」とはっきり言いましょう。 **なんでそこまできっちりこだわったのに、インデントが「可変長」なのかがまったく理解できません。** 可変長インデントじゃなくて、固定長インデントでソースコードは共有してほしいんですよ。 プログラマーはどうしたら読みやすいかについて頭をひねってコーディングします。 重要なのはインデント幅から受ける書き手としての感覚的な影響です。 タブ文字で整形をしてしまうと、「組んだ誰かにとって最適であったような状態」が読む環境でブレてしまいます。これはね、「2/4/8文字タブスペースの問題」とかじゃまったくないんです。 「こいつは...タブ幅2文字だったのか?4文字だったのか?」この悩み自体がナンセンスです。 2幅で書いたソースは2幅で最初から見えているべきなんですよ。 タブは言わば、ソースコードの共有時に紛れ込む唯一の脆弱性です。 受け手によって見た目が変わるなんて存在そのものが不合理です。 タブ文化っていうのは、それ全てが言わば書き手と読み手の蜜結合です。 これが私には、酷く醜いものに見えます。 (2)インデントに半角空白を使うことにメリットはあるか =========================== 私たちは皆物書きです。最高の見た目でコーディングします。 そこで「タブ幅の自由」みたいな話題を読者側の私に振るなと。 むしろ自由なんだ。好きに設定してくれ。必要であればインデント幅なんていくらでも改変してコードは読む。 だから、書き手のお前が2幅が良いと思ったなら2幅で見えるようなものを提出しろと。 最初の一歩として、私は貴方が書いた時に見ていたものをそのまま見たいわけです。 少なくとも、空白埋めにはそういうブレの入り込む隙がありません。 終わりに ==== といっても、まあ実のところタブ文字で提出されて困ることはほとんどないはずです。 貴方ぐらい神経質に拘って書いてるなら特に問題は起きないはずです。 それが読みやすいかどうかは、ソース見なきゃわかんないもん、文句のつけようもありません。 確かなのは、タブってのは曖昧ってことです。 むしろ貴方ぐらいちゃっかりかっちりを求めているのに、なんでタブはOKなんだって疑問で私はいっぱいです。