typescript-clean-code について
typescript-clean-code は、Robert C. Martin の Clean Code 原則を TypeScript に適用するためのリファレンススキルです。コメント、関数、設計、命名、テストの指針に加え、TypeScript 固有のルールと AI によるレビュー・編集方針をまとめています。
主な機能
- 01TypeScript に Clean Code ルールを適用
- 02コメント・関数・設計を網羅
- 03命名とテストの指針
- 04TypeScript 固有の実践項目
- 05ルール番号で違反を報告
活用シーン
- 01明示されたルールに沿った TypeScript コードレビュー
- 02重複や意図の不明瞭さを減らす編集の指針
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ ertugrul-dmr/ clean-code-skills --skill typescript-clean-codeインストール後、Claude Code で/typescript-clean-codeを入力して読み込まれたか確認します。
詳細
クリーンな TypeScript:完全リファレンス
Robert C. Martin の第 17 章にあるクリーンコードの原則をすべて、TypeScript 向けに適用して徹底します。
コメント(C1-C5)
- C1:コメントにメタデータを書かない(Git を使う)
- C2:古くなったコメントはすぐに削除する
- C3:冗長なコメントを書かない
- C4:コメントが必要なら、適切に書く
- C5:コメントアウトしたコードを決してコミットしない
環境(E1-E2)
- E1:ビルドには 1 つのコマンドを使う(
npm run build) - E2:テストには 1 つのコマンドを使う(
npm test)
関数(F1-F4)
- F1:引数は最大 3 つにする(それ以上の場合はパラメーターオブジェクトやインターフェースを使う)
- F2:出力引数は使わない(戻り値を使う)
- F3:フラグ引数は使わない(関数を分割する)
- F4:使われていない関数を削除する
一般(G1-G36)
- G1:1 つのファイルでは 1 つの言語を使う
- G2:期待される動作を実装する
- G3:境界条件を処理する
- G4:安全策を無効にしない
- G5:DRY(重複をなくす)
- G6:抽象化レベルを一貫させる
- G7:基底クラスは子クラスを知らない
- G8:公開インターフェースを最小限にする
- G9:使われていないコードを削除する
- G10:変数は使用箇所の近くに置く
- G11:一貫性を保つ
- G12:余計なものを取り除く
- G13:人為的な結合を避ける
- G14:フィーチャー・エンヴィーを避ける
- G15:セレクター引数を使わない
- G16:意図を曖昧にしない
- G17:期待される場所にコードを書く
- G18:インスタンスメソッドを優先する
- G19:説明的な変数を使う
- G20:関数名で処理内容を示す
- G21:アルゴリズムを理解する
- G22:依存関係を物理的に明示する
- G23:if/else よりポリモーフィズムを優先する
- G24:規約に従う(TypeScript スタイルガイドと ESLint/Prettier)
- G25:マジックナンバーではなく、名前付き定数を使う
- G26:正確さを保つ
- G27:規約より構造を重視する
- G28:条件式をカプセル化する
- G29:否定条件を避ける
- G30:関数は 1 つのことだけを行う
- G31:時間的結合を明示する
- G32:恣意的な設計を避ける
- G33:境界条件をカプセル化する
- G34:関数ごとに抽象化レベルを 1 つにする
- G35:設定は高いレベルに置く
- G36:デメテルの法則(メソッドチェーンを避ける)
TypeScript 固有(TS1-TS3)
これらは、Java 固有のルール(J1-J3)を TypeScript の規約に合わせて適用したものです。
- TS1:インポートを明示的かつ安定した状態に保ち、名前空間形式の過度な使用や暗黙の依存関係を避ける
- TS2:マジック定数ではなく、列挙型またはリテラルユニオン型を使う
- TS3:公開インターフェースの型を明示し、境界では
anyを避ける
名前(N1-N7)
- N1:説明的な名前を選ぶ
- N2:適切な抽象化レベルの名前を付ける
- N3:標準的な命名を使う
- N4:曖昧でない名前を付ける
- N5:スコープに合った長さの名前を付ける
- N6:エンコーディングを使わない
- N7:副作用を名前で示す
テスト(T1-T9)
- T1:壊れる可能性のあるものをすべてテストする
- T2:カバレッジツールを使う
- T3:些細なテストも省略しない
- T4:テストを無視する場合は、曖昧さがないか確認する
- T5:境界条件をテストする
- T6:バグが発生しやすい箇所を網羅的にテストする
- T7:失敗にパターンがないか確認する
- T8:デバッグ時にカバレッジを確認する
- T9:テストは高速でなければならない(1 件あたり 100 ms 未満)
クイックリファレンス表
| カテゴリー | ルール | 一言で |
|---|---|---|
| コメント | C1 | メタデータを書かない(Git を使う) |
| C3 | 冗長なコメントを書かない | |
| C5 | コメントアウトしたコードを書かない | |
| 関数 | F1 | 引数は最大 3 つ |
| F3 | フラグ引数を使わない | |
| F4 | 使われていない関数を削除する | |
| 一般 | G5 | DRY(重複をなくす) |
| G9 | 使われていないコードを削除する | |
| G16 | 意図を曖昧にしない | |
| G23 | if/else よりポリモーフィズムを優先する | |
| G25 | マジックナンバーではなく、名前付き定数を使う | |
| G30 | 関数は 1 つのことだけを行う | |
| G36 | デメテルの法則(ドット 1 つ) | |
| 名前 | N1 | 説明的な名前を付ける |
| N5 | スコープに合った長さの名前を付ける | |
| テスト | T5 | 境界条件をテストする |
| T9 | テストを高速にする |
アンチパターン(しない → する)
| ❌ しない | ✅ する |
|---|---|
| すべての行にコメントを付ける | 明らかなコメントを削除する |
| 1 行だけの処理にヘルパーを作る | コードをインライン化する |
あらゆる場所で import * as utils を使う | 依存関係を明示するために名前付きインポートを使う |
公開 API で any を使う | 具体的な型、または絞り込みを伴う unknown を使う |
マジックナンバー 86400 | const SECONDS_PER_DAY = 86400 |
process(data, true) | processVerbose(data) |
| 深いネスト | ガード節と早期リターン |
obj.a.b.c.value | obj.getValue() |
| 100 行を超える関数 | 責務ごとに分割する |
AI の振る舞い
コードをレビューするときは、ルール番号を示して違反を特定してください(例:「G5 違反:ロジックの重複」)。
コードを修正または編集するときは、何を修正したかを報告してください(例:「修正済み:マジックナンバーを SECONDS_PER_DAY に抽出しました(G25)」)。
コメント
Markdown 対応