インデントスタイル — タブ vs スペースとインデントサイズ

インデントスタイル(タブ vs スペース、2スペース vs 4スペース)、ファイルサイズへの影響、圧縮ツールと整形ツールがインデント変換を処理する方法を解説。チーム設定のヒントも含みます。

Techniques

詳細な説明

コードのインデントスタイル

インデントスタイル — タブかスペースか、レベルごとのスペース数 — はソフトウェア開発で最も議論されるトピックの1つです。圧縮の観点からは、インデントはプロダクションコードから完全に削除される純粋なオーバーヘッドです。

タブ vs. スペース

タブ(\t):

  • 視覚的な幅に関係なく、インデントレベルごとに1文字
  • 視覚的な幅はエディタごとに設定可能(2、4、8カラム)
  • スペースよりわずかに小さいファイルサイズ(インデントごとに1バイト vs 2-4バイト)
  • アクセシブル — ユーザーが好みの視覚的な幅を設定可能

スペース:

  • すべてのエディタとビューアで一貫した視覚的な表示
  • Web開発でより一般的(JavaScript、CSS、HTMLコミュニティはスペースを好む)
  • 2スペースインデントがJavaScriptエコシステムで最も人気
  • 4スペースインデントはPython、Java、C#で一般的

ファイルサイズへの影響

インデントはソースファイルの驚くほど大きな割合を占めることがあります:

ファイル: app.js(500行、平均3インデントレベル)

2スペースインデント: 約3,000バイトのインデント
4スペースインデント: 約6,000バイトのインデント
タブインデント:     約1,500バイトのインデント

数百のファイルを持つプロジェクトでは、この差は積み重なりますが、minificationによって完全に排除され、gzip圧縮によっても十分に処理されます。

圧縮ツールのインデント処理

圧縮ツールは、ソースがタブを使用しているかスペースを使用しているかに関係なく、すべてのインデントを削除します:

// 4スペースインデントのソース
function calculate(items) {
    let total = 0;
    for (const item of items) {
        total += item.price;
    }
    return total;
}

// 圧縮後の出力(入力のインデントに関係なく同じ)
function calculate(t){let e=0;for(const l of t)e+=l.price;return e}

整形ツールのインデント処理

整形ツールは出力のインデントスタイルを選択できます。つまり:

  1. チームの好みのスタイルでコードを書く(2スペース、4スペース、またはタブ)
  2. プロダクション用にminifyする(インデントが除去)
  3. デバッグ用にbeautifyする(好みのインデントスタイルで)

チーム設定

.editorconfigを使用してチーム全体で一貫したインデントを強制します:

[*]
indent_style = space
indent_size = 2

[*.py]
indent_size = 4

[Makefile]
indent_style = tab

PrettierやESLintの自動フォーマットと組み合わせることで、インデントの議論を完全に排除できます。

ユースケース

インデントスタイルの理解は、整形ツールの設定、チームのコーディング規約の策定、そしてminificationがファイルサイズの議論を完全に排除する理由をステークホルダーに説明する際に重要です。異なるスタイル規約間でコードベースを移行する際に特に関連します。

試してみる — Code Minifier

フルツールを開く