「行末改行って何で必要?」「インデントのタブとスペースってどっちがいいの?」

ATOMやSublimeTextなど、多くのエディタには便利な機能が備わっています。
「行末改行挿入」や「タブのスペース変換」などもその機能に該当します。

そんな便利機能を

「とりあえず捗るらしいから設定しておく」

という感じで設定している方もエンジニア初心者の方も少なくないと思います。

自分も最初は分からず設定していましたが、ちゃんとした理由があります。

今回は「何でこんな設定をしているのか?」という疑問を解消するべく調べてみました。

スポンサーリンク

インデントはタブかスペースか論争(2個?4個?)

自分は主に「SublimeText」使いなのですが、設定はこんな感じ。

"translate_tabs_to_spaces": true,
"tab_size": 2,

Preferences -> Settings から設定出来ます。
この設定で「Tab使用時」に、「スペース2個でインデント」が行われるよう変換してくれます。

また、言語や好みによってインデントのスペースは「2個派・4個派・8個派」などが存在します。
更に、文化によっては「スペースでのインデント」ではなく、「タブでインデント」する事もあるとのこと。

Rubyからプログラミングを始めた自分は、勧められるがまま「スペース2個のインデント」を使用していました。

実際にRubyのスタイルガイドではスペース2個のインデントが推奨されています。

fortissimo1997/ruby-style-guide

Rubyではスペース2個が主流ですが、だからと言って
「スペースが悪い、タブが悪い」
というものではなく「好みや言語の規約次第」という話に落ち着いたりしているのが結論です。

色々ありますが、一番やってはいけないのは「インデント方法を混同させる」ことです。
実際の自分が行うプロジェクトの規約に則って、統一しましょう。

参考

インデントにタブを使うことのデメリット

「teratail」の質問から。
回答が29も付いていて盛り上がってる議題

Rails coding standards – Why 2 space indentation? / StackOverflow

「Stack Overflow」の質問から
こちらでも慣習や規約の問題という回答あり。

行末の空白削除と改行

次は「行末の空白削除と改行」について

"ensure_newline_at_eof_on_save": true,
"trim_trailing_white_space_on_save": true,

SublimeTextで設定すると、この2行。

これで
「行末の不要なスペースがある場合削除」かつ「行末に改行を自動挿入」
されるようになります。

自分がプログラマーデビューした当初はよく行末改行を入れずにレビューで指摘もらいました。
手動で入れるのも手間なので、エディタ側で設定しておいたほうがいいですね。

しかし何で行末改行が必要なのか?と、疑問に思ったらこういうことらしいです。

なぜ最終行に改行を入れるのですか? / teratail

テキストファイルとは、いくつかの行の集合である。そして、行とは改行コードで区切られるまでの、一連のテキストデータの連続である。

この説明が一番しっくり来ました。

「行+改行」があって初めて「行」になるということ。

Stack Overflowにも同じような質問がありました。

Why should text files end with a newline? / StackOverflow

Because that’s how the POSIX standard defines a line:

それが「POSIX」という仕様に則った行の定義の仕方。

POSIXとは?
http://e-words.jp/w/POSIX.html

実際に「C, C++」では、改行なしのソースファイルだと未定義扱いになり誤作動を引き起こす、とのこと。

ちなみにRubyではそういった誤作動は起きませんが、慣習的に行末改行はしておきましょう。

参考

[迷信] ソースファイルの末尾に } / 株式会社きじねこ
CとC++の規格での行末改行の話

ファイル末尾の改行を自在にコントロールする / ザリガニが見ていた…。
実際に行末改行がなかった場合の不具合の例

Why does Ruby on Rails generate add a blank line to the end of a file? / StackOverflow

「何故rails g で作ったファイルに行末改行があるのか」

まとめ

チームで開発するのであれば必ずそのプロジェクトの規約に則ってコードを書こう。
足並みを揃えないと無駄なdiff発生やコンフリクトなど、開発に少なからず影響を与えます。

おわり