Summary
「Tell, Don't Ask」原則に基づくコードレビューと設計支援。オブジェクトの状態を問い合わせて 外部で判断するパターンを、オブジェクトに直接命じるパターンに変換する。カプセル化を強化し、 責任をデータを持つオブジェクトに集約する設計を促進する。コードレビュー、新規実装、…
j5ik2o/okite-ai
>- 「Tell, Don't Ask」原則に基づくコードレビューと設計支援。オブジェクトの状? 外部で判断するパターンを、オブジェクトに直接命じるパターンに変換する。カプセル化を強化し、 責任をデータを持つオブジェクトに集約する設計を促進する。コードレビュー、新規実? リファクタリング時にgetterの乱用やFeature Envyの改善が? 対象言語: Java, Kotlin, Scala, TypeScript, Python, Ruby, Go, Rust。 トリガー:「getterを減らしたい」「カプセル化を改善して」「Feature Envyを直して」 「オブジェクトに責任を持たせたい」「デメテル…
npx skills add j5ik2o/okite-ai --skill tell-dont-ask
「Tell, Don't Ask」原則に基づくコードレビューと設計支援。オブジェクトの状態を問い合わせて 外部で判断するパターンを、オブジェクトに直接命じるパターンに変換する。カプセル化を強化し、 責任をデータを持つオブジェクトに集約する設計を促進する。コードレビュー、新規実装、…
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Research your competitors and build an interactive battlecard. Outputs an HTML artifact with cl…
4.1K installsAnalyze competitor strategies, content, pricing, ads, and market positioning across Google Maps…
2.6K installsPrepare meeting materials with Notion context and Codex research; use when gathering context, d…
2.5K installsAI-native lead intelligence and outreach pipeline.
7K installsResearch prediction-market events, venues, underliers, liquidity, and news context for Itô bask…
2.9K 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
5,312 B
SUMMARY.md
825 B
オブジェクトに問い合わせるな、命じよ。
オブジェクトの内部状態に基づく意思決定をし、その結果で該当オブジェクトを更新してはならない。 (『達人プログラマー 第2版』167ページ)
| アプローチ | 特徴 | 問題 |
|---|---|---|
| Ask | 状態を取得→外部で判断→操作 | ロジックが散在、カプセル化破壊 |
| Tell | オブジェクトに直接命じる | 責任集約、変更に強い |
オブジェクトのメソッド呼び出し
↓
getterで状態を取得しているか?
├─ YES → その後ifで判定している?
│ ├─ YES → Askパターン(問題あり)
│ └─ NO → 表示/出力目的なら許容
└─ NO → Tellパターン(推奨)
以下のパターンを見つけたら変換を検討:
❌ if (obj.getX() > threshold) { obj.setY(...) }
❌ if (obj.getStatus() == ACTIVE) { doSomething(obj) }
❌ obj.getA().getB().doSomething() // デメテルの法則違反
❌ for (item : list) { total += item.getPrice() }
❌ if (user.getRole() == ADMIN) { ... }
// ❌ Ask: 状態を取得して外部で判断
if (user.getAge() >= 18) {
allowAccess(user);
}
// ✅ Tell: 判定ロジックをオブジェクトに持たせる
if (user.isAdult()) {
allowAccess(user);
}
// ✅✅ さらに良い: 処理自体を委譲
user.ifAdult(() -> allowAccess());
// ❌ Ask: 型で分岐
if (user.getType() == UserType.ADMIN) {
sendAdminNotification(user);
} else {
sendUserNotification(user);
}
// ✅ Tell: 各クラスに責任を持たせる
user.sendNotification(); // Admin/RegularUserで実装が異なる
// ❌ Ask: 外部で集計
int total = 0;
for (Item item : order.getItems()) {
total += item.getPrice();
}
// ✅ Tell: オブジェクトに集計を任せる
int total = order.calculateTotal();
// ❌ Ask: null判定の分岐
Address addr = user.getAddress();
if (addr != null) {
return addr.format();
} else {
return "住所未登録";
}
// ✅ Tell: NullObjectでデフォルト動作を定義
return user.getAddress().format(); // NullAddressは"住所未登録"を返す
| 原則 / スキル | 関係 |
|---|---|
| law-of-demeter | 連鎖呼び出しを避ける(a.getB().getC() → a.doC()) |
| Feature Envy | 他クラスのデータに執着 → 責任を移動 |
| 単一責任原則 | データと処理を同じ場所に |
| カプセル化 | 内部状態を隠蔽し振る舞いを公開 |
| breach-encapsulation-naming | getter命名でカプセル化破壊を明示 |
コードレビュー時の確認ポイント:
a.getB().getC() のようなチェーンはないか言語別の実装パターン、リファクタリング手順の詳細は [references/patterns.md](references/patterns.md) を参照。
このスキルを使用する際は、以下のスキルも併せて参照すること:
law-of-demeter: 構造面の補完原則(直接の友人とのみ会話する)first-class-collection: コレクションへのTell, Don't Ask適用パターンbreach-encapsulation-naming: カプセル化を破る必要がある場合の命名規約