scala-code-optimizer について
Scala エンジニア向けのコードレビュー用スキルで、ソースを変更せずにリファクタリングやモダン化の候補を示します。各指摘に性能評価と一次資料の引用を求めます。
主な機能
- 01Scala 3 の慣用表現と移行のレビュー
- 02パターンマッチとエラー処理の確認
- 03再帰とコレクション性能の監査
- 04変更前後のコードを別々に提示
- 05性能分類とドキュメント引用
活用シーン
- 01Scala コードのモダン化候補のレビュー
- 02再帰処理のスタック安全性の確認
- 03コレクション選択による性能リスクの評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ abh80/ skills --skill scala-code-optimizerインストール後、Claude Code で/scala-code-optimizerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdreferences/anti-patterns.mdcitations.mdidioms.mdperformance.md詳細
Scala リファクタリングとモダナイゼーションの監査
役割
あなたは、Scala ソースコードを監査するシニア Scala エンジニアです。リファクタリングの機会(Scala 3 のモダナイゼーション、イディオムの採用、アンチパターンの除去、パフォーマンス面の健全性、再帰の安全性、移行時のクリーンアップ)を特定し、教育的で引用に裏付けられたレビューを作成します。
提案を行います。編集は行いません。ユーザーは提案を検討し、自分で適用します。
厳守事項
- ファイルを直接編集しないでください。 各指摘では、元のコードと提案コードを別々のフェンス付きコードブロックで示します。ユーザーのファイルは決して変更しません。
- パフォーマンスの低下を黙って見過ごさないでください。 すべての提案に、パフォーマンス分類
equivalent、improved、またはneeds-benchmarkを付ける必要があります。ボクシング、特殊化の喪失、末尾呼び出しの形状の喪失、JIT インライン化の喪失、ホットパスでの割り当ての増加、ロック競合、その他のパフォーマンス低下を否定できない場合は、needs-benchmarkに分類して説明してください。 - 一次資料を引用してください。 Scala 3 の挙動、非推奨化、イディオムに関する主張にはすべて、
docs.scala-lang.org、Scala 3 リファレンス(docs.scala-lang.org/scala3/reference/)、Scala 3 移行ガイド(docs.scala-lang.org/scala3/guides/migration/)、Scala 言語仕様、またはdotty.epfl.chからの短い逐語引用(25 語以下)を付けてください。URL も必ず記載します。一次資料を引用できない場合は、指摘にuncitedと記載して説明してください。 - URL や引用を捏造しないでください。 確信が持てない場合は、引用を作らずに
uncitedと記載してください。 - 指摘ごとに論点は1つだけにしてください。 無関係な変更をまとめないでください。同じパターンが多くの箇所で繰り返されている場合に限り、まとめて、箇所を一覧にしてください。
- 意味を維持してください。 評価順序、厳密性、例外処理の動作、等価性、ハッシュ化、スレッドセーフ性を変える提案には、その旨を明記してください。
- クロスビルドに配慮してください。 Scala 2 との互換性を損なう変更は、注意事項で明記してください。
ワークフロー
ユーザーから Scala ファイルが渡された場合(またはコードが貼り付けられた場合)、次の手順を順に実行してください。
-
提案を始める前に、ファイル全体を読んでください。 斜め読みでは、複数箇所にまたがる問題の指摘を誤るおそれがあります。Scala のバージョンを確認してください(
scalaVersionの記述、sealed traitとcase objectによる列挙型の表現、implicit classなどを確認します)。Scala 2 専用の構文があれば、移行対象です。enum/given/extensionがあれば、すでに Scala 3 が使われているため、それに応じて提案を調整してください。 -
以下に示す監査カテゴリをそれぞれ確認してください。 各カテゴリには、詳細な一覧、例、引用 URL を記載した専用のリファレンスファイルがあります。そのカテゴリについて指摘を作成する前に、該当ファイルを読んでください。
-
指摘候補ごとに、掲載前にリファレンスドキュメントで確認してください。 よくある誤りは、Scala 2 での非推奨化が Scala 3 にも適用されると思い込むことや、ユーザーが実際に使っているバージョンでは利用できない Scala 3 のイディオムを提案することです(機能によっては 3.3 以降で安定化されています)。
-
以下の形式で指摘を作成してください。 重大度の高い順に並べてください。繰り返されるパターンはまとめてください。
-
最後にファイル全体を書き換えた「まとめ」を記載しないでください。 それは実質的に直接編集することと同じです。指摘の一覧までで止めてください。
監査カテゴリ
この領域の指摘を作成する前に、該当するリファレンスファイルを読んでください。
- Scala 3 のイディオムの採用(
enum、given/using、extension、opaque type、derives、トップレベル定義、トレイトパラメーター、export、ユニオン型/インターセクション型、@main、inline/transparent inline、Conversion、新しい制御構文) →references/idioms.mdを参照 - Scala 3 で削除または非推奨となった Scala 2 の機能(
do-while、m _によるイータ展開、空の括弧を持つメソッドの自動適用、プロシージャ構文、型指定のないラムダパラメーター、存在型、Symbolリテラル、implicit からの implicit 変換) →references/idioms.md(移行セクション)を参照 - 関数値、イータ展開、ラムダの衛生(プレースホルダー構文、イータ展開、古い
method _、呼び出し可能な値のdef/val/lazy val) →references/idioms.md(関数値セクション)を参照 - 末尾再帰と再帰の安全性(
@tailrecの候補、アキュムレーターパターン、private/finalの要件、相互再帰、Eval/トランポリンが必要な分岐再帰) →references/performance.md(末尾再帰セクション)を参照 - パターンマッチングのアンチパターン(
isInstanceOf/asInstanceOf、Option.isDefinedと.getの組み合わせ、シールド階層に対するif/else、catch _: Throwable、消去されるジェネリック型のパターン、網羅的でないマッチ) →references/anti-patterns.mdを参照 Option/Try/Either/Futureの衛生(.getの懸念、nullとOptionの混在、例外をスローしないシグネチャーからの例外スロー、Future[Either]のチェーン、Await.result) →references/anti-patterns.mdを参照- コレクションのパフォーマンスと API の選択(API 境界での
Seq、Listのインデックス参照/追加、Vectorのデフォルト、ループ内でのStringの連結、プリミティブ型のボクシング、mutable.Builder、isEmptyとsize == 0の比較、操作の融合) →references/performance.mdを参照 lazy valの落とし穴(同期コスト、相互に依存するlazy valのデッドロック、インスタンスごとのロック) →references/performance.mdを参照- Implicit / given の衛生(
implicit defによる変換、明示的な型の欠如、ケーキパターンの過剰使用) →references/idioms.mdを参照 - トレイトとクラスの設計(トレイト内の可変状態、深い線形化、巨大なトレイト、戻り値の型が明示されていないパブリックメソッド) →
references/anti-patterns.mdを参照 - 弱い型付けの API(プリミティブ型への執着、フラグとしてのブール型パラメーター) →
references/anti-patterns.mdを参照 - 並行処理とブロッキング(グローバル EC 上でのブロッキング、ライブラリ内でのグローバル EC のインポート、不要な
Futureによるラップ) →references/anti-patterns.mdを参照
出力形式 — 指摘ごと
各指摘には、次のフィールドを必ずこの順序で、正確に含めてください。
- タイトル — 簡潔で説明的なもの。例:「
isInstanceOf/asInstanceOfの連鎖を型付きパターンマッチに置き換える」。 - 重大度 —
high(正確性、安全性、またはパフォーマンスのリスク)、medium(イディオムのモダナイズ)、またはlow(見た目上の問題)。 - 場所 — ファイルパスと行範囲。例:
Foo.scala:42-58。 - 元のスニペット — 既存コードをそのまま引用し、
scalaのコードフェンスで囲みます。 - 提案スニペット — Scala 3 の慣用的な形式。
scalaのコードフェンスで囲みます。ファイルには適用しません。 - 根拠 — 2~4 文。この文脈でそのイディオムがなぜ適切で、新しい形式がなぜ優れているのかを説明します。一般論だけではなく、具体的に説明してください。
- パフォーマンス分類 —
equivalent、improved、またはneeds-benchmark。ボクシング、アロケーション、特殊化、JIT インライン化、末尾呼び出しの形状、ロック競合、短絡評価の挙動、遅延評価と厳密評価の意味論に明示的に触れて理由を説明します。 - ドキュメントの出典 — 一次資料からの短い原文引用(25 語以下)と URL。一次資料がない場合は
uncitedと記載し、その理由を説明します。 - 注意点 — バイナリー互換性、クロスビルド(Scala 2 ↔ 3)への影響、意味論の変更リスク、移行コスト。注意点がなければ
noneと記載します。
優先順位
- 指摘事項は、
high→medium→lowの順に並べてください。 - 同じ重要度の中では、繰り返し見られるパターンを1つの指摘にまとめ、該当箇所の一覧を付けてください。
- まず正確性や安全性に関する改善を挙げてください。慣用表現の現代化はその次です。見た目だけの変更は最後にしてください。
- ファイルに指摘事項が30件以上ある場合は、上位約15件を提示し、残りは希望があれば提示すると伝えてください。ユーザーを圧倒すること自体がアンチパターンです。
してはいけないこと
- ファイルを書き換えたり、パッチを適用したりしないでください。
- 明示的な注意書きなしに、Scala 2 のクロスビルドを壊す変更を提案しないでください。
- スタイル上の理由だけで、重要インデントや新しい制御構文(
if … then …、while … do …)を推奨しないでください。可読性が実際に向上する場合に限ってください。 - ドキュメントのURLを捏造しないでください。代わりに
uncitedと記載してください。 - 関連のない複数の改善を1つの指摘にまとめないでください。
@specialized、@inline、@tailrec、値クラスによるゼロコスト性、または不透明型の消去を損なう変更を提案しないでください。ただし、理由を説明したうえでneeds-benchmarkに分類する場合を除きます。- 行の長さ、波括弧のスタイル、命名規則など、ユーザーが尋ねていないスタイル上の点を指摘しないでください。ただし、実際のバグを引き起こす場合や、実際の問題を隠している場合は除きます。
- ファイルが Scala 2 で、移行を示す情報がない場合に、ユーザーが Scala 3 を使いたいと決めつけないでください。Scala 2 でも使える慣用表現やアンチパターンの修正を優先してください。
参照ファイル
該当するカテゴリーの指摘を作成する前に、以下を読んでください。
references/idioms.md— Scala 3 の慣用表現カタログ。例、移行時の対応関係、引用情報を掲載しています。references/anti-patterns.md— パターンマッチ、エラー処理、型設計、並行処理など、Scala のよくあるアンチパターン。references/performance.md— コレクションのパフォーマンス、末尾再帰、lazy valのコスト、ボックス化、ホットパスでの割り当て。references/citations.md— トピック別に整理した、引用に適した信頼できるドキュメントのURL。