- ベストアンサー
インデントをスペースにするメリット
インデントには一般的にタブもしくはスペースが使われますが、これをタブにするメリットは、表示上のインデント幅を表示する人が自由に設定できることだと考えています。 一方でこれをスペースにするメリットは、いくらか調べてみましたが納得できるものが見つかりませんでした。 そこで、インデントをスペースにするメリットを教えてください。 多く見かけたのは「どの環境でも同じように見える」というものですが、その場合なぜ同じように見える必要があるのかを教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
引退したソフトウェア研究者です。 インデントにタブを使うか、スペースを使うかは、以下のような歴史的な経緯もあると思います。 その昔、ホストのCRT端末でTSSのエディタを使っていた頃、タブはハードウェアタブ(HT)しかなく、タブ幅は8キャラクタ(だったと思う)固定でした。で、端末のエディタの画面は72桁しか表示しませんからタブに8桁を設定すると、あっという間に右端に達してしまいます。また、一行に書けるソースがみるみる減ってしまいます。 当時の言語として、アセンブラやFORTRAN(66)は構造化記述をサポートしておらず、インデントを必要としませんが、COBOLの場合、インデントを使ってデータ構造を表現する必要があるし、プログラムとしても、IF~THEN構文がありましたから、インデントを使って構造化を表現することも出来ました。Wirth博士由来のALGOLなども同様です。 ただ、タブが8キャラクタというのは明らかに多すぎるので、COBOLのプログラマ達はスペースを使ってDATA DIVISIONやプログラム本体(PROCEDURE DIVISION)のインデントを記述していました。 なお、TABキーを押すと画面上は次のHT位置(8桁先)にカーソルが移動しますが、ソースとして保存されるときはスペースに変換されてしまいます。そういう意味で、この時代、ソースにTABコードが書かれることはありませんでした。 TSS以前のパンチカードや紙テープではインデントは必然的にスペースでした(東京重機のパンチマシンにはタブがセットできたが、カード上は空白になる)。私も初めてコンピュータを使った頃は、スペースバーをガチャンガチャンと押してインデントしていました。まあ、この世代のエンジニアが現場にどれくらい残っているかわかりませんが(上の方には残っているか)、こういう世代の場合、 Cが使われた初期のVT端末の仕様はわかりかねますが、おそらく、HTしか無かったと思いますから、事象は同じではなかったでしょうか、テクトロの蓄積管を使ったVT互換のグラフィック端末はHTだけだったようなほのかな記憶があります。 初期のPC用エディタも同様にタブ幅固定でしたから、こういう環境だと、一行の記述陵を増やそうとするとどうしてもインデントは半角スペースでということになります。 そういや、Mindなどの日本語記述できる言語は全角スペースもインデントに使えたんじゃなかったかな
その他の回答 (5)
>そこで、インデントをスペースにするメリットを教えてください。 スペースを利用している多くの人間は、「メリットがあるから」使っているわけではないように思う。おそらく「タブでもスペースでも、実用上、まったく違いがないから」使っているんじゃないだろうか。 現在、ほとんどのソースコードはエディタではなく統合開発環境の類いで書かれているんじゃないだろうか。そうしたものでは、スペースもタブも、ほぼ同じ感覚でインデントする。タブキーを押せば、自動的に半角スペース4つとかがぱっと書き出されるし、バックスペースを押せばタブ1つ分の半角スペースが一度にぱっと消える。というように、スペースもタブもまったく同じ感覚で扱えるようになっている開発ソフトは多い。 そして、そうしたものでは、デフォルトで半角スペースが設定されているものも多い。そうしたものを使っているために、自分ではまったく気がつかずに半角スペースをインデントに使っている、という人は多い気がする 統合開発環境の多くで、デフォルトにタブではなく半角スペースを採用しているのは、「半角スペースでないとインデントを正しく認識しない」ものがあるためだろう。たとえば、yamlでは、タブによるインデントは認識されない。またPythonでは、タブはすべて「半角スペース8文字」と認識して動くため、下手にタブを混在させるとインデントが崩れ、シンタックス自体がおかしくなることが多々ある。 統合開発環境でいろいろな言語に対応するものだと、最初から「全部半角スペースでインデント」としたほうが余計なトラブルを防げる、ということでないだろうか。どっちにしろ、こうした環境では、ユーザーは「タブも半角スペースもインデントとしてはまったく同じもの」なんだから、「どっちを使うべきか」という発想自体がそもそもないかもしれないな。
お礼
ご意見ありがとうございます。 タブにするかスペースにするかはコードを共有する人たちの間でルールが決まっていれば良いだけのことですが、最初にそのルールを決めるにあたってはメリット・デメリットを比較する必要もあるかと思います。 半角スペースでないとインデントを正しく認識しないエディタをサポートしようと思った場合は、比較をするまでもなくスペースを採用するしかないですね。これは比較的大人数で開発環境が把握できないプロジェクト等が当てはまるでしょうか。yamlを扱う場合も同様ですね。
- Gotthold
- ベストアンサー率47% (396/832)
int a; //コメント int xxxxxx; //コメント でタブ幅が変わると右のコメントがそろわないことがある。 int a; double b; 同じくaとbがそろわないかも。 (こんなのは無理にそろえることもないと個人的には思ったりするけど、好みの問題か。) 特定のタブ幅を前提に、 [Sp][Sp] [ タブ ] [ タブ ][Sp][Sp] [ タブ ][ タブ ] みたいに字下げを深くされてると、 タブ幅が変わると見苦しくなる。 これはタブが悪いというより タブとスペースを組み合わせてるのが悪いんだけど、 特定のタブ幅を前提として見た目を整えているコードは 残念ながらそれなりに見かけることがある。 そういえば、タブ字下げとスペース字下げが完全に混ざってるなんてのもあったなあ。 あれは酷かった。(迷わずコード整形したけど。) いろいろ書いたけど、まともに(タブ幅違う環境を意識して)書いてくれるなら どっちを使うかは好みの問題だと思う。 なお、私はたいていスペースで字下げしてます。 func(a, b, c); こんな感じの字下げしたい場合に、bやcの字下げの 後半部分だけスペースにするのをうっかり忘れるかもしれないので。 タブ幅が違う環境を意識するのが面倒だから全部スペースに統一してると言ってもいいかな。 あ、でもJavaScriptはタブ字下げで統一してた。 エディタの入力支援機能のデフォルトがタブ字下げだったから そのままタブを使うことにしたんだったか。
お礼
行の途中でのコメント等の頭揃えにも、スペースを使うべきですね。 > タブとスペースを(うっかり)組み合わせてしまう > 字下げの後半部分だけスペースにするのをうっかり忘れるかもしれないので これはエディタが自動的に修正・補完してくれない場合「人為的なうっかりミスを防止する」という意味でスペースでインデントするメリットと言えそうです。しかし逆に言えばうっかりタブを挿入してしまうことを防げるわけではないので、判断は難しいところですね。 このような決まりの下では、タブキーをキーボードから抜いてしまうのが最良の策かもしれません。 回答ありがとうございました。
- nag0720
- ベストアンサー率58% (1093/1860)
インデントを単に開始位置をずらすという意味で使うならタブで充分ですが、ソースコードをより分かりやすくするために各行の桁位置を合わせたい場合があります。 #1さんの例でいうと、=の位置を合わせる場合はスペースを使うしかありません。 エディタによってはスペースが使いやすい場合もありますし、タブが使えないものやタブの桁数が固定のものもあります。 ちなみに私はスペースを使っています。
補足
ご指摘の通り、ブロックの開始位置ではない場所での、変数や引数などの見た目の位置を揃えるための調整には、タブではなくスペースを用いるべきであると思います。 またスペースを使うメリットとは言えませんが、タブが使えないエディタを考慮すると、ファイル内に一切タブを挿入してはならないという決まり事も出てきますね。 nag0720さんは開始位置をずらすためのインデントの目的でもタブではなくスペースを使われているということでしょうか?もしそうでしたら、そのメリットをぜひ教えていただければと思います。 タブよりスペースが使いやすいエディタを使われているということであれば、具体的にどのように使いやすいのかもあわせて教えていただけると嬉しいです。
- sh_hirose
- ベストアンサー率66% (56/84)
No1です。 表示がつぶれちゃってますね(^^;) <Table border=”1” id=”table1” class=”table2”> と <Table border=”1” id=”table1” class=”table2”> です。
お礼
確かに、処理単位内(コードで言う行の途中)で改行が許される言語においては、そのような場所では見た目を揃えるためにタブではなくスペースを使うべきと言えますね。 回答ありがとうございます。
- sh_hirose
- ベストアンサー率66% (56/84)
作成者の好みで分かれるでしょう。 (私はタブが好きだが会社では半角スペース4文字にしています。) >そこで、インデントをスペースにするメリットを教えてください。 >多く見かけたのは「どの環境でも同じように見える」というものですが、その場合なぜ同じように見える必要があるのかを教えてください。 例えばHTMLで #<table border="1" id="table1" class="table2"> こんなものがあったとします。 これを #<html border="1" # id="table1" # class="table2"> このように書いたとします。 (まぁ短いので普通はこんな風に書きませんが・・・) これの半角スペース2つ分をタブとしている場合、 タブを半角スペース4つ分で設定している人には以下のように見えます。 #<html border="1" # id="table1" # class="table2"> 書いた人(ひとつのタブが半角スペース2つ分)にとっては見やすいですが、見た人(ひとつのタブが半角スペース4つ分)にとってはちょっと見づらいです。 見る人によって異なる表示は見栄えがかわってしまうのでどの環境でも同じように見えるように半角スペースで記述することを推しています。
お礼
大規模プロジェクトで採用されるコーディングスタイルのルールを見ると、比較的少ない数(2つ程度)のスペースによるインデント、比較的短い桁での改行を義務づけているものが多いような気がしますが、これはやはり大人数での開発において、千差万別の開発環境で困る人が出ないようにという配慮なのでしょうか。 詳しい解説をありがとうございました。 引き続きスペースを使うメリットを調べていて、ひとつ興味深いことがわかりました。 以下のようなケースです。 class MyClass { int num; : : int func() { return num; }; }; ここの先頭にpublic宣言を入れたい場合、もしタブでインデントしていたら、publicはインデントせず左側に書くか、メンバの記述に揃えて書くかのどちらかになってしまいます。 もしこれを「スペース2つ」でインデントしていた場合、publicの記述位置はクラス宣言より右でメンバより左の位置、つまり左からスペース1つ分空けた「半インデント」の位置を使うことができます。switch文でのcaseを書く位置でも、この半インデントが使える可能性があります。スペース4つでインデントしていれば、1/4インデントや3/4インデントなんてものもできたりします。 このように、言語によってはその特性上スペースによるインデントが便利に使えるものもあると感じました。