はじめに
こんにちは、新卒のcrowd_kです。
今年の4月に入社をし、社会人になって約半年が経ちました。
入社するまでプログラミング未経験者だったので、日々の業務で新しい知識や様々な発見の連続に翻弄されながら、でもどこかで楽しみつつ学習をする毎日を過ごしています。
その中で1つ気になったことがありました。
それは、プログラム内のインデントを、タブ文字(\t)ではなくスペースで作成する方針になっていたことです。
プログラミング歴の浅い私は全く意識せず、使用しているEclipseの初期設定であるタブを用いていました。なので改行等をすると、作成されるインデントはタブで構成されていることになります。
しかし、コードのレビューを依頼した際に上記の方針(インデントはスペースで作成する)に引っ掛かり、コード内のタブをすべてスペースに置き換えるという作業を行いました。
最初はなにも疑わずに修正していましたが、後々考えてみるとなぜなんだろうと疑問を持ちました。
「タブを用いることで生じるバグなどがあったりするのか?」
考えてみても答えは出ないので、調べてみることにしました。
インデント
そもそもプログラミングにおけるインデントとは、一般的に
「プログラムのネスト構造を読み手にわかりやすく表現するために行頭の位置を変化させること」
だと思います。
if(a == b){ if(b == c){ System.out.println("aとbとcは全て同じ"); } System.out.println("aとbは同じ"); }else{ if(b != c){ System.out.println("bとcは同じ"); } System.out.println("aとbは同じではない"); }
上のコードのように行頭をそろえたほうが見やすくなります。プログラミング経験者なら誰でも行ったことがあるかと思います。
このインデントを作るための空欄を表現するためにタブを使っていたところ、「スペースに直せ」とはじかれたわけです。
調べてみると、「インデントをタブで行う人派」(以後タブ派)と「インデントをスペースで行う人派」(以後スペース派)で分かれよく論争が起きる、答えのない有名な議題の1つだということがわかりました。
以下に調べた結果をまとめていこうと思います。
タブ・スペース、それぞれの違い
結論から言うと タブを使用した結果、何かの不具合やバグが発生するなどといったデメリットは、ほぼ発生しないようです。
しかし、環境によってタブが半角スペース×4、または×2になってしまったり、単なる半角スペースに置換されてしまったりなどインデントの幅が変化し、見た目が変わってしまう事があるらしく、「ほぼ発生しない」という表現にしました。(逆に見た目を変化せることができるということです)
この、環境によって見た目が変わってしまう、または変えることができる特徴こそが、この論争の重要なポイントのようです。
流行りの歴史
まず最初に流行ったのは「タブ」だったそうです。
理由は単純でスペースでインデントを作るには、そのキーを何回も押すのが面倒な点と、文字数を減らすことができるのでファイルサイズも抑えることができる点、この2点が挙げられます。
しかし、先に述べたデメリットが発覚したことで、回避するためにスペース×4でインデントを作るのが主流になりました。
また、そこから派生してスペース×2をインデントとする人たちも現れたようです。これは、インデントの幅が大きくなった時、スペースの個数を間違えることが多く、その問題を改善するためにインデントに使うスペース数を減らした結果だそうです。
それぞれの長所短所を簡単にまとめると以下のようになります。
タブ | スペース | |
---|---|---|
メリット | 入力回数が少ない ファイルサイズを抑えることができる エディターによって自由にインデントの幅を設定することができる |
どの環境でも同じ見た目にすることができる (環境に依存しない) |
デメリット | 環境によって見た目が変化する | 打ち込む回数が多く手間になる 打ち込む回数にミスが生じた場合、見た目が悪くなる |
上に記した歴史は、あくまで流行りでありどの時代でもタブ派とスペース派は混在し、どちらを使うのが良いかという論争を繰り広げてきました。
両者にはそれぞれ長所と短所があるため、いつになってもこの論争は終わらないのです。
それぞれの派閥のエンジニアの意見を見ると以下のような意見がみられました。
タブ派
・ エディタ等の設定を変更すれば好きなように幅を変化っさせることができるので、相手にとって一番見やすい形に都度変更してもらうことができる
・ タブのほうが操作が簡単であり、事実上タブによるデメリットはないので効率を考えるとタブを使うべき
・スペースの数をそろえるのが面倒
・ インデントの幅が正しいのかを簡単に見分けることができる
...etcスペース派
・ コードを綺麗に見せるには自分が意図した通りに表示させる必要がある
・ 環境によって表示が変わってしまうのでは、相手に自分の伝えたいことが伝わらないかもしれない
・ エンジニアならファイルサイズが小さくなるメリットより見やすさを重視すべき
・ 全角スペースを探すために非表示文字を表示させる際に、スペース・タブが混在していると探すのが大変
...etc
コーディングのセンス次第
私は、両者の様々な意見をみて書き手の性質によるのではないかなと感じました。
コードを何かの芸術作品に例えて考えると、
自分が作り上げた作品を自分が一番綺麗だと思う見せ方で見せたいから、作品の置き方、見る角度、照明等をすべて指定するのがスペース派
作品を見せる際の照明等のこだわりはなく、見る人が一番だと思う方法で見てもらえるのが一番だと考えるのがタブ派
のどちらが良いかという話になるんじゃないかなと思います。
どちらも読み手にいかにプログラムコードを綺麗に見せるかに重点が置いてあり、それぞれがいいと思うものを使うのが一番かなと思いました。
しかし、1点だけ注意しなければならないことが。
複数人で開発を行う場合、それぞれが好みのインデントのルールで開発を行うと見た目がぐちゃぐちゃになり、非常に見づらいコードになってしまいます。
なので、その際はプロジェクトのルールに従う必要があります。(言うまでもないかもしれませんが...)
これを考えると、現在はスペース派が多数派になっているので、こだわりがないのならスペースに慣れたほうがいいかもしれません。
終わりに
調べた結果、タブを使用してもバグ等の原因になりえないことがわかりましたが、コーディングに関して深い理由があるんだなということに気づけました。
また、気になったことを記事にしていこうかなと思います。