インデント

コードの階層構造を視覚的に表現するための字下げ

プログラミング基礎

インデントとは

インデント (Indent) は、コードの行頭に空白を入れて階層構造を視覚的に表現する手法である。関数の中身、条件分岐のブロック、ループの本体など、コードの入れ子構造をインデントで示すことで、可読性が大きく向上する。

インデントの効果

// ❌ インデントなし
function process(items: string[]) {
for (const item of items) {
if (item.length > 0) {
console.log(item);
}
}
}

// ✅ インデントあり
function process(items: string[]) {
  for (const item of items) {
    if (item.length > 0) {
      console.log(item);
    }
  }
}

インデントがないコードは、どの行がどのブロックに属するのか判別できない。インデントがあれば、コードの構造が一目でわかる。

スペース vs タブ

インデントにはスペースとタブの 2 種類がある。

方式特徴
スペース 2 個JavaScript / TypeScript で主流
スペース 4 個PythonJava で主流
タブGo で標準、アクセシビリティに有利

タブがアクセシビリティに有利とされるのは、1 文字分の表示幅を読み手がエディタ側の設定で変えられるためである。スペースは書いた側の桁位置がどの環境でも同じに見える代わりに、読み手が幅を選べない。

プロジェクト内で統一されていることが重要であり、どちらが正しいという絶対的な答えはない。チームやプロジェクトの規約に従う。ただし言語側に公式の規約があるもの (後述の Python と Go) は、そちらに合わせた方が標準のツールや公開されているサンプルコードと衝突しない。

言語ごとの慣習

言語標準的なインデント
TypeScript / JavaScriptスペース 2 個
Pythonスペース 4 個 (構文上必須)
Goタブ (gofmt で強制)
Rustスペース 4 個 (rustfmt で強制)
Javaスペース 4 個

Python ではインデントが構文の一部であり、インデントの誤りは IndentationError になる。他の言語ではインデントは見た目の問題だが、Python では正しく動作するために必須である。幅 4 スペースという慣習は PEP 8 が 1 段あたり 4 個のスペースを使うと定めたもので、同文書はスペースを推奨し、タブは既にタブでインデントされているコードとの整合を保つ場合にだけ使うとしている。

Go でタブが標準とされる根拠も、言語仕様ではなく規約側にある。Effective Go はインデントにタブを使うと述べ、gofmt が既定でタブを出力する。コードをフォーマッタに通す運用そのものが標準を担保している形であり、Go では幅の議論が起きない。

フォーマッタによる自動整形

手動でインデントを揃えるのは手間がかかり、ミスも起きやすい。フォーマッタを使えば、保存時に自動でインデントが整う。

ツール対象言語
PrettierJavaScript, TypeScript, CSS, HTML
BlackPython
gofmtGo
rustfmtRust

フォーマッタの既定値は一律ではない。Prettier はインデント幅 (Tab Width) の既定が 2 スペースで、タブを使う設定 (Use Tabs) は既定で無効である。一方 gofmt は既定でタブを出力する。設定を書かなければこの既定がそのまま適用されるため、既存コードと幅が違うと初回の整形で全行が差分になる。既存プロジェクトへ後から導入するときは、整形だけの commit を単独で分けておくと後の履歴が追える。

EditorConfig (.editorconfig) を使えば、エディタを問わずインデント設定を統一できる。Prettier は .editorconfigindent_size (または tab_width) を自身のインデント幅として、indent_style をタブ使用の有無として読むため、エディタとフォーマッタの設定を 1 か所に寄せられる。

# .editorconfig
root = true

[*]
indent_style = space
indent_size = 2

ネストが深いときの対処

インデントが深くなりすぎるのは、コードの構造に問題がある兆候である。

// ❌ ネストが深い
function handle(req: Request) {
  if (req.method === "POST") {
    if (req.body) {
      if (req.body.name) {
        if (req.body.name.length > 0) {
          // 処理
        }
      }
    }
  }
}

// ✅ 早期リターンで平坦に
function handle(req: Request) {
  if (req.method !== "POST") return;
  if (!req.body?.name?.length) return;
  // 処理
}

目安として、インデントが 4 段以上になったら構造の見直しを検討する。

よくある間違い

間違い問題対策
スペースとタブの混在表示が崩れる、Python では実行できないフォーマッタで統一
インデント幅の不統一可読性の低下EditorConfig を設定
深すぎるネスト構造が追えない早期リターン、関数分割

スペースとタブの混在は見た目が崩れるだけの問題として語られがちだが、Python では実行そのものが止まる。PEP 8 は Python がインデントでのタブとスペースの混在を許さないと明記しており、混在したファイルを実行すると TabError になる。これは IndentationError のサブクラスで、IndentationError 自体も SyntaxError のサブクラスであるため、1 行も動かないまま構文解析の段階で弾かれる。他の言語では動いてしまう分だけ厄介で、差分を見ても空白文字は区別が付かない。エディタで空白文字を可視化しておくと発見が早い。

コードの可読性とインデントの考え方は関連書籍に詳しい。

この記事は役に立ちましたか?

関連用語

関連する記事