インデント
コードの階層構造を視覚的に表現するための字下げ
インデントとは
インデント (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 個 | Python、Java で主流 |
| タブ | 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 では幅の議論が起きない。
フォーマッタによる自動整形
手動でインデントを揃えるのは手間がかかり、ミスも起きやすい。フォーマッタを使えば、保存時に自動でインデントが整う。
| ツール | 対象言語 |
|---|---|
| Prettier | JavaScript, TypeScript, CSS, HTML |
| Black | Python |
| gofmt | Go |
| rustfmt | Rust |
フォーマッタの既定値は一律ではない。Prettier はインデント幅 (Tab Width) の既定が 2 スペースで、タブを使う設定 (Use Tabs) は既定で無効である。一方 gofmt は既定でタブを出力する。設定を書かなければこの既定がそのまま適用されるため、既存コードと幅が違うと初回の整形で全行が差分になる。既存プロジェクトへ後から導入するときは、整形だけの commit を単独で分けておくと後の履歴が追える。
EditorConfig (.editorconfig) を使えば、エディタを問わずインデント設定を統一できる。Prettier は .editorconfig の indent_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 行も動かないまま構文解析の段階で弾かれる。他の言語では動いてしまう分だけ厄介で、差分を見ても空白文字は区別が付かない。エディタで空白文字を可視化しておくと発見が早い。
コードの可読性とインデントの考え方は関連書籍に詳しい。
この記事は役に立ちましたか?
関連用語
リンター (Linter) とは - 静的解析ツールの役割と導入方法
リンターはソースコードを静的解析してバグやスタイル違反を検出するツール。ESLint / Biome / Ruff など言語ごとのリンターの比較と CI への組み込み方を解説
フォーマッター
ソースコードのスタイル (インデント、改行、スペース) を自動的に統一するツール
コードの不吉な匂い
リファクタリングが必要であることを示唆するコード上の兆候や構造的な問題のパターン
ページネーションとは - API のカーソル方式とオフセット方式の比較
ページネーションは大量データを分割して返す手法。オフセット方式とカーソル方式の違い、パフォーマンス特性、REST/GraphQL での実装パターンを解説
データベースインデックス
検索クエリの高速化のためにデータベースが維持する補助的なデータ構造
エンディアン
2 バイト以上のデータをメモリやファイルに格納する際の、バイトの並び順を定める規約
関連する記事
Python 本の選び方 - 独学の最初の 1 冊から実務品質まで
Python 本の選び方を「動機」から逆算して整理。プログラミング未経験の最初の 1 冊、業務自動化に直結する本、型ヒントとコード品質で実務水準へ進む本まで、2026 年 8 月時点の定番を独学ルートに沿って解説します。
本の選び方に正解はない
どの本を選べばいいか迷って決められない。同じテーマの入門書は扱う基礎が大きく重なるため、どれからでも学べます。確認すべき 1 点と、迷いを終わらせる決め方を解説します。
写経を超える - 技術書のコードを自分のプロジェクトに応用する方法
技術書のサンプルコードを写経するだけでは実力は伸びません。書籍のコードを自分のプロジェクトに応用し、実務で使える力に変える 5 つのステップを解説します。