Summary
字面の同一性ではなく意図(目的)の同一性に基づいてコードの共通化を判断するスキル。 DRY原則の誤適用(字面が同じだが意図が異なるコードの共通化)を検出し、正しい共通化判定を 支援する。コードレビュー、リファクタリング、新規実装時に重複コードの扱いを判断する場合に使用。 対象言語: 言語非依存(Rust, Java,…
j5ik2o/okite-ai
>- 字面の同一性ではなく意図(目的)の同一性に基づいてコードの? DRY原則の誤適用(字面が同じだが意図が異なるコードの? 支援する。コードレビュー、リファクタリング、新規実? 対象言語: 言語非依存(Rust, Java, TypeScript, Go, Python, Kotlin, Scala等すべて)。 トリガー:「重複コードを? 「この2つの関数をまとめたい」「コードの重複を減らしたい」「? 「リファクタリングで?
npx skills add j5ik2o/okite-ai --skill intent-based-dedup
字面の同一性ではなく意図(目的)の同一性に基づいてコードの共通化を判断するスキル。 DRY原則の誤適用(字面が同じだが意図が異なるコードの共通化)を検出し、正しい共通化判定を 支援する。コードレビュー、リファクタリング、新規実装時に重複コードの扱いを判断する場合に使用。 対象言語: 言語非依存(Rust, Java,…
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Implement App Intents for Siri, Shortcuts, Spotlight, widgets, Control Center, and Apple Intell…
3.4K installsTurn ambiguous or high-impact product and engineering changes into scoped, verifiable acceptanc…
3.1K installsThe entry point for Intent, a UX and design strategy system. Sets project context, routes to sp…
1.6K installsBest practices for Android Intent security. Use this skill when auditing component configuratio…
13 installsSet up hierarchical Intent Layer (AGENTS.md files) for codebases. Use when initializing a new p…
594 installsFrames coding-agent work sessions with explicit intent capture and drift monitoring. Use when a…
426 installsOther skills from j5ik2o/okite-ai · top by installs.
npx skills add j5ik2o/okite-ai
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
main
Files included with this skill beyond the listing page.
SKILL.md
7,764 B
SUMMARY.md
876 B
字面が同じかどうかより、意図(目的)が同じかどうかで共通化する。
「字面が同じなら共通化」という単純思考は危険。意図・目的の一致を最優先に判断する。
コード表現が同一でも、ビジネスロジック上の目的が異なれば共通化してはならない。 逆に、表現が異なっていても目的が同じなら統一すべきである。
| 字面 | 意図 | 判定 | アクション |
|---|---|---|---|
| 同じ | 同じ | 共通化 ◎ | DRY原則を適用し共通関数に抽出 |
| 異なる | 同じ | 統一 ◎ | どちらかの実装に統一 |
| 同じ | 異なる | 共通化 ✗ | 絶対に共通化禁止(最重要) |
| 異なる | 異なる | 共通化 ✗ | 検討不要 |
重複コードを発見した
↓
2つのコードの「目的」は同じか?
├─ YES → 字面は同じか?
│ ├─ YES → 共通化する(標準的DRY)
│ └─ NO → 実装方式を統一する
└─ NO → 字面は同じか?
├─ YES → ⚠ 共通化禁止(最も危険なケース)
└─ NO → 何もしない
以下のパターンを見つけたらDRY誤適用の兆候:
❌ 異なるドメイン概念に同じユーティリティ関数を使い回す
❌ "たまたま同じ計算式" を共通関数に抽出
❌ 共通化した関数に if (type == A) / else if (type == B) の分岐が増える
❌ 共通関数名が汎用的すぎる(calculate, process, transform等)
❌ 一方の仕様変更時に「もう一方も壊れないか」を心配する
❌ 共通関数のパラメータが増殖し続ける
DRY原則が正しく適用されるケース。
// ❌ 同じ目的の処理が2箇所に重複
fn report_even_squares(numbers: &[i32]) -> Vec<i32> {
numbers.iter()
.filter(|&&x| x % 2 == 0)
.map(|&x| x * x)
.collect()
}
fn display_even_squares(numbers: &[i32]) -> Vec<i32> {
numbers.iter()
.filter(|&&x| x % 2 == 0)
.map(|&x| x * x)
.collect()
}
// ✅ 共通化: 同じ目的なので1つにまとめる
fn even_squares(numbers: &[i32]) -> Vec<i32> {
numbers.iter()
.filter(|&&x| x % 2 == 0)
.map(|&x| x * x)
.collect()
}
同じ目的だが異なる実装スタイルで書かれているケース。
// パターンA: 関数型アプローチ
fn total_a(values: &[i32]) -> i32 {
values.iter().fold(0, |acc, &x| acc + x)
}
// パターンB: 命令型アプローチ
fn total_b(values: &[i32]) -> i32 {
let mut sum = 0;
for &v in values { sum += v; }
sum
}
// ✅ どちらか一方に統一(チーム規約に従う)
fn total(values: &[i32]) -> i32 {
values.iter().sum()
}
最も危険なケース。 形式上同じコードでも、ビジネス上の目的が異なる。
// ケース1: 攻撃力計算(地形倍率を適用)
fn adjusted_attack_points(weapon_points: &[i32]) -> Vec<i32> {
weapon_points.iter()
.map(|&x| x * 2)
.filter(|&x| x % 2 == 0)
.map(|x| x * x)
.collect()
}
// ケース2: 武器加工費用計算
fn weighted_crafting_costs(amounts: &[i32]) -> Vec<i32> {
amounts.iter()
.map(|&x| x * 2)
.filter(|&x| x % 2 == 0)
.map(|x| x * x)
.collect()
}
字面は同じだが共通化してはならない。 理由:
// ❌ 危険な共通化
fn apply_formula(values: &[i32]) -> Vec<i32> { /* ... */ }
let attack = apply_formula(&weapon_points); // 攻撃力?
let cost = apply_formula(&amounts); // 費用?
// → 一方を変更すると他方が壊れる
検討不要。それぞれ独立したコードとして維持する。
目的が同じかどうかを見極めるための質問:
- YES → 意図が同じ(共通化可) - NO → 意図が異なる(共通化不可)
- YES → 意図が同じ - NO(汎用的な名前しか付けられない)→ 意図が異なる
- YES → 意図が同じ - NO → 意図が異なる
コードレビュー時の確認ポイント:
このスキルを使用する際は、以下のスキルも併せて参照すること:
domain-building-blocks: 異なるドメインの同形コードを共通化しない判断first-class-collection: 同じ構造のコレクションでも意図が異なれば別型とする判断package-design: 同じコードでも変更理由が異なればパッケージを分ける判断