技術メモ

後で同じ状況が起こった時に思い出せるように技術的なちょっとしたことをメモする。
同じカテゴリーの他の記事を表示
全記事を表示



ソースコードのインデントはスペースを使うべき


エディター(vim/emacs)紛争, C/C++における無限ループ(for(;;)/while(1))紛争など、プログラマー同士の紛争は日々絶えない。
その紛争の1つがソースコードのインデントをタブ文字(\t)で行う(ハードタブと呼ばれる)かスペースで行う(ソフトタブと呼ばれる)かである。

この問題は比較的深刻で、特に複数人で開発を行う時にこれらの2つのタイプが混ざってしまうと、ソースコードが非常に見づらく、バグの原因になってしまう。
また、Pythonなどのインデントをブロックの単位とするような言語だと、エラーにより動作しなくなってしまうことも十分考えられる。
そのため、タブ文字かスペース、どちらかに統一するべきであるが、それぞれ一長一短のため、プログラマー同士で揉めてしまうことが多い。

このページでは、それぞれの立場から見たメリットを考えてみる。





 

スペースを用いるべき理由 (ソフトタブ派)

  • どの環境からでも同じように見える(出力される)。

    タブ文字(\t)の幅は環境(OSやエディター)によって異なるため、他人の環境(PC)などで表示した時に自分の表示と異なる事がある。いつもと異なるインデント幅での開発は効率の低下やバグの原因になりかねない。それに対してスペースはそのようなことがなく、どの環境でも見慣れた表示にすることが出来る。

  • どの環境からでも入力が可能。

    開発は常に物理的なキーボードで行うとは限らない。高性能なタブレットやスマートフォンの普及で、これらで開発(ソースコードの記述)をしたり、ちょっとしたプログラムの手直しをしたりすることは出てくる。しかし、ソフトウェアキーボードにはタブ文字(\t)を入力するTabキーが無いことも多々ある。こういった環境ではタブ文字(\t)を入力するのが困難だったり、非常に面倒くさかったりして、開発効率が非常に下がってしまう。それに対してスペースキーは基本的にどのキーボードでも打つことが出来るため、どんな環境でもコーディングが出来る。

  • タブ文字の場合、ブラウザ上でファイルを編集するときなど、Tabキーを押した時にタブ文字(\t)が挿入されるわけではなく、フォーカスが次の要素に合ってしまい入力できないことがある。

    テキストエディターやIDEではタブ文字(\t)はTabキーを押すことで入力が可能だが、ブラウザ上でオンラインでコードを修正するときなど、タブキーはタブ文字(\t)を入力する機能ではなく、フォーカスを次の要素に移動させる機能としてマッピングされていることも多く、そのような環境下ではタブ文字(\t)を入力するのが困難だったり、非常に面倒くさかったりして、開発効率が非常に下がってしまう。それに対してスペースを入力するのに使うスペースキーはこのような問題が起こらない。





 

タブ文字(\t)を用いるべき理由 (ハードタブ派)

  • スペースに対してキーを押す回数が少ない。

    例えばインデントをスペース4個分に割り当てた場合、単純なテキストエディターで1つのインデントを作るのに、スペースキーだと4回キーを打つ必要があるが、Tabキーだと1回で済み、キー押下回数が少なくて済む。これにより、単純なテキストエディターでは開発の効率が少し良い。

  • ファイルサイズが小さくなる。

    例えばインデントをスペース4個分に割り当てた場合、ASCIIコードの場合だと1つのインデントをスペース(1byte)だと4文字分の4bytesの容量であるが、タブ文字(\t)だと1byteで表現できるため、ソースファイルのディスクの消費量が小さくなる。ファイルサイズが小さくなることでソースファイルの読み込みやコンパイルなどが多少早くなるかもしれない。

  • エディターの設定で各自好きなインデント幅を設定できる。(2022/5/31追記)

    スペースだと1つのインデント幅をいくつにするかで揉めることがあったり自分の好みではない幅がコーディング規約に設定される可能性があるがタブにしておけばエディターやIDEの設定からそれぞれが好きな幅で設定できるので、複数人開発をしていてもそれぞれが好きなインデント幅で作業できる。





 

結論としてはスペースの方がメリットが大きい

このサイトでは、結論としては、インデントにはタブ文字(\t)ではなくスペースを使うべき(ソフトタブ)と主張する。
なぜならば、”タブ文字はスペースに対してキーを押す回数が少ない”という問題については、エディターのオートインデントの機能によって自動的にインデントを掛けたり、Tabキーでのインデントをスペースに置き換える機能など、一般的な開発用のエディターに付いている機能を用いれば、キー押下回数に関してはタブ文字を使った際と全く同じ回数にすることが可能であるからである。
また、ファイルサイズに関しても、現在の潤沢な容量を持つストレージにおいて数バイトをケチる必要性はほぼ無いと考えられる。ソースファイル全体に占めるインデントのためのファイルサイズはそこまで大きいとは考えにくい。
これらの理由から、様々な環境で対応可能なスペースの方がメリットが大きいと考えられる。ただこれはあくまでサイト管理者の主観のため、開発チームで統一すればどちらでも良いという実情であると思う。





 

インデントの幅=2を推奨

スペースによるインデントの場合、どのインデントの幅(スペース何個分か)が適切であるかという議論が起こる。
色んな人のコードを読んでいると、幅を4にしている人が1番多いように感じる。2番目は多いのはおそらく幅を2にする人だ。
幅を4にしている人が多い理由はおそらくデフォルトのエディターの設定が4になっていることが多く、それを変更せずに使っているという一因があるのではと考える。
このサイトでは、インデント幅=2を推奨する。
インデントはソースコードを読みやすくするためにある(Pythonを除く)ため、確かに幅が大きい方が、インデントが強調され、ブロックが分かりやすいかもしれない。
しかし、大規模なプログラムになったとき、匿名クラスを用いたときなど、ブロックが何重にも入れ子になってしまったときに、インデント幅が大きいと、横スクロールが必要になってくる可能性が高くなる。特にタブレットやスマートフォン, 画面の小さいノートPCや4:3ディスプレイを用いている場合などにそれが顕著になる。
ソースコードを読む際に横スクロールが入ると効率が非常に下がってしまう。
かと言って折り返すようにすると、横スクロールの代わりに縦スクロールが必要になる。
コードを読む際にはなるべくスクロールはしたくないし、一度に画面に表示される情報量は多くしたいという人は多いのではないか。
そうした時に、インデント幅はなるべく小さくするのが妥当である。
そう考えた時に個人的にはインデント幅=2が、インデントと簡単に認識できる最小の幅だと思う。(幅が1だと流石にわかりにくい)
こういった経緯があり、このサイトはインデント幅=2を推奨している。





 

タブ派の人がスムーズにスペースに乗り換える方法

スペースキーを押すのに慣れない人はエディターの「タブを押した時にスペースに置き換える機能」を有効化すれば今までと同じ使い勝手でスペースを入力できる。
ここではいくつかのエディターでの設定方法を示す。

Visual Studio

ツール > オプション > テキストエディター > 全ての言語 > タブ でタブのサイズ, インデントの幅の設定が出来、空白の挿入を選択する。

Gedit

設定 > エディター でタブの幅を変更でき, 「タブの代わりにスペースを挿入する」にチェックを入れる。

Vim

vimrcでset etでタブ文字の代わりにスペースを入力でき、set sts=2でタブ幅を2に, set ts=2でタブ表示幅を2に出来る。

その他のエディター

以下のサイトを参照してください。

その他、ここに載っていないエディターでも大体の場合設定にそのような項目はあるはずです。
調べれば出てくると思います。





 



同じカテゴリー(技術メモ)の他の記事を表示

全記事を表示



タグ:
投稿日: 2017年7月30日
最終更新日:





コメント (2)

  1. 双方が主張する理由がまとまっていてわかりやすかったです。

    追加ですが、タブ派の理由として
    スペース派の人はインデントがスペース2つと4つとで揉めることがあるので、
    それならソースコードはタブにして、エンジニアなら各自使うツールのタブストップをスペース2つ分や4つ分に設定して
    各自好きな見た目でやればいいじゃんというのがあります。

    また、IDE上で何かしらショートカットでコメントアウトするときに、左端に//が入ってもタブでタブストップが4つであればインデントがズレないので見やすいというのもあります。

    当然ですがインデント以外にタブを使う人はタブ派から見ても無しです。

    1. コメントありがとうございます。
      タブ派の1つ目の理由、納得したので、記事内に追記させていただきました!

コメントを残す

回答をお約束することは出来ませんので予めご了承ください。
コメントは承認されると表示されるようになります。
コメントを送信する前に「私はロボットではありません」にチェックを入れて下さい。