Communityコーディング&開発github.com

yutna/oo-design

新しいモジュール、機能、またはシステムをオブジェクト指向のコードベースで開始する際、設計の規模を決める場合、またはどのオブジェクトルールが適用されるか不明な場合に使用します。

oo-design とは?

このスキルは、オブジェクト指向コードベースにおける設計ルールを包括的に提供するパックです。新しいモジュールや機能の設計を始める前に、どの程度の設計が必要かを判断するための「タスク規模のガイドライン」を提供し、設計ループと呼ばれる7段階の反復プロセスを通じて、ドメイン言語の使用、責任の割り当て、集約の設計、依存性の逆転など、オブジェクト指向設計の主要な原則を実践する方法を示します。各ルールは「ルール」「デフォルト」「判断」の3段階で厳格さがラベル付けされ、状況に応じた適用が可能です。また、コードの「症状」から適切な設計スキルを特定するための症状テーブルが用意されており、オブジェクトまたはデータの選択、カプセル化、不変条件の設計など、100以上の固有の設計上の問題に対応します。このスキルはClaude Code、Cursor、CodexなどのAIエージェント向けに設計されており、SKILL.mdドキュメントとして読み込まれます。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/yutna/object-oriented-design-skills/tree/HEAD/plugins/core/skills/oo-design

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

オブジェクト指向設計

概要

このパックは、オブジェクト指向スタイルで書かれたコードベースのための設計ルールであり、普遍的なアドバイスではありません。プロジェクト独自の記法規則がパックよりも優先されます。変更中のモジュールのイディオムに従ってください。このスキルはタスクの規模を判断し、適合するスキルを指定します。

回答する前に、このインデックスが指定するスキルをロードしてください。そのルールと例はそこにあり、ここにはありません。

タスクに必要な設計の規模

タスク使用するスキップする
一度だけ使用して捨てられる回答なしすべて
既存のクラス内の1つのメソッドその名前と契約再モデリング
既存のフロー内の機能そのフローが使用するイディオム新しい境界線
新しいクラスまたはモジュール設計ループなし
新しいコンテキスト設計ループ、次にその境界線なし
ゼロからの新しいシステム設計ループ、コンテキスト、次に構造なし

設計を始める前に

設計を始める前に、ゲートを宣言します。ソフトウェアが従わなければならない1つのルールと、それが受け入れる1つの例と拒否する1つの例です。例えば、「スロットには最大1つの予約を保持できる」というルールです。これは、別のスロットに2人目の患者を予約することを受け入れ、同じスロットに2人目の患者を予約することを拒否します。ルールを書き留められるなら、開始してください。書き留められないなら、欠けているものは設計ではなく、このパックはそれを提供できません。

設計ループ

  1. ソフトウェアがドメインの言葉で何をしなければならないかを述べ(ドメイン言語を話す)、各振る舞いが必要とするものを知っているオブジェクトを見つける(責任の割り当て)。
  2. 一貫性の境界を見つける。1つのトランザクションで一緒に真でなければならないものは何か(集約の設計)。
  3. 各ルールがどこに存在するかを決定する。エンティティ、値オブジェクト、またはドメインサービス(ドメインロジックの配置)。
  4. 各オブジェクトが応答するメッセージを設計し(状態と振る舞いのカプセル化)、不正な状態を構築不可能にする(不正な状態を不可能にする)。
  5. ドメインがデータベースやフレームワークについて何も知らないように依存関係を逆転させる(依存関係の逆転、システムの階層化)。
  6. ドメインの言葉でものに名前を付け、コードが言えないことだけをコメントする(クラスとメソッドの命名、コードが言えないことのコメント)。
  7. 結果を以下のレッドフラグと照合する(オブジェクト設計のレビュー)。

ルールの厳格さ

このパックのすべてのコアルールには3つのラベルのいずれかが付けられており、そのラベルはルールがどの程度厳格に意図されているかを示します。

  • ルール. 破ることは欠陥です。フレームワークもそれを免除しません。
  • デフォルト. 明示された条件が成立しない限り、これを行ってください。条件はそれ自体が文であり、決して従属節ではありません。
  • 判断. 2つの答えが許容されます。どちらにバランスが傾くかをスキルが示します。

症状からスキルへ

症状はそれを治療するスキルを指し、この表はスキルが追加されるにつれて拡大します。

症状スキル
どのクラスがこれをすべきか?責任の割り当て
このクラスはやりすぎている責任の割り当て
変更が多くのクラスに波及する結合の診断
この2つの部分はどの程度密に結合しているか?結合の診断
これはオブジェクトか、単なるデータか?オブジェクトかデータかの判断
私たちのドメインモデルは貧血であるオブジェクトかデータかの判断
他のコードがこのオブジェクトのために決定する状態と振る舞いのカプセル化
セッターがこのオブジェクトにルールを破らせる状態と振る舞いのカプセル化
このオブジェクトは半分構築された状態で存在できる有効なオブジェクトの構築
このコンストラクタは引数が多すぎる有効なオブジェクトの構築
新しいケースごとに動作中のコードを編集する必要がある変化するもののカプセル化
これはどれだけの柔軟性を持つべきか?変化するもののカプセル化
これは値かエンティティか?値とエンティティのモデリング
生の文字列や数値がドメインルールを運んでいる値とエンティティのモデリング
これはそのクラスを拡張すべきか、保持すべきか?継承よりコンポジションの選択
基底クラスの変更がそのサブクラスを壊す継承よりコンポジションの選択
サブクラスが親の約束を破る代入可能性の尊重
コードがどのサブタイプを保持しているかをチェックする代入可能性の尊重
同じ型に対するスイッチが繰り返し現れる条件文をポリモーフィズムで置き換える
サブクラスかパターンマッチングか?条件文をポリモーフィズムで置き換える
コードがオブジェクトの連鎖を介して到達するオブジェクトが知る範囲の制限
このクラスは呼び出しを転送するだけであるオブジェクトが知る範囲の制限
このクラスやメソッドは何と呼ばれるべきか?クラスとメソッドの命名
Manager、Helper、Utilのような名前クラスとメソッドの命名
呼び出し側が使用しないインターフェースメソッドに依存するインターフェースの設計
インターフェースか抽象基底クラスか?インターフェースの設計
ドメインコードがデータベースやフレームワークに依存する依存関係の逆転
オブジェクトはどこで生成され、配線されるか?依存関係の逆転
呼び出し側が別のクラスのデータ保存形式やフォーマットを知っている実装の隠蔽
クラスが内部エラーや手順を漏洩する実装の隠蔽
フラグやオプションフィールドが不可能な組み合わせを許容する不正な状態を不可能にする
型がドメインに決して存在しない値を許容する不正な状態を不可能にする
コードの言葉がスタッフの言葉と異なるドメイン言語を話す
同じ単語が2つのチームで異なる意味を持つドメイン言語を話す
どのオブジェクトが一緒に変更されなければならないか?集約の設計
保存が衝突する、または1つのロードで過剰に取り込む集約の設計
どのステータス変更が許可されるか?ライフサイクルのモデリング
キャンセルまたはクローズされたオブジェクトが再び変更されるライフサイクルのモデリング
ドメインオブジェクトはどのように保存され、見つけられるべきか?リポジトリの設計
リポジトリに画面ごとのfindメソッドがあるリポジトリの設計
ユースケースが同じビジネスチェックを繰り返すドメインロジックの配置
ドメインサービス、エンティティメソッド、アプリケーションサービス?ドメインロジックの配置
変更が保存された後、他の部分が反応しなければならないドメインイベントの発行
ロールバックされた変更に対してメッセージが送信されたドメインイベントの発行
あるチームのモデルが終わり、別のチームのモデルが始まるのはどこか?コンテキストの境界付け
どの部分がコアであり、どれを購入できるか?コンテキストの境界付け
レイヤーはどちらの方向に依存すべきか?システムの階層化
画面やジョブがフレームワークなしではテストできないシステムの階層化
モジュールが循環依存するモジュールの整理
モジュラーモノリスか、個別のサービスか?モジュールの整理
APIの変更がそれを呼び出すアプリを壊すシステム境界の越境
このAPIやメッセージはどのようにバージョン管理すべきか?システム境界の越境
マッピングツールがドメインクラスを歪める永続化の制御
リストが行ごとに1つのクエリを実行する永続化の制御
画面はモデルとは異なる形のデータを必要とする読み取りと書き込みの分離
読み取りモデル、プロジェクション、イベントソーシング?読み取りと書き込みの分離
この画面にはMVC、MVP、MVVMのどれか?プレゼンテーションとドメインの分離
画面がドメインオブジェクトを直接編集するプレゼンテーションとドメインの分離
この問題にはどのデザインパターンが適合するか?パターンの選択
問題の前にパターンが追加されたパターンの選択
これらのパターンクラスは関数にできる言語が提供するパターン
Visitor、それとも一致する閉じた集合?言語が提供するパターン
メソッドが何も見つからないときにnullを返す障害動作の設計
拒否が呼び出し側が無視するコードとして返される障害動作の設計
スレッドがオブジェクトを共有し、変更を失ったり混在させたりする共有状態の管理
この状態にはロックか単一所有者か?共有状態の管理
別のシステムへの呼び出しがハングするか、途中で失敗する作業の信頼性確保
リトライが作業を2回実行した作業の信頼性確保
記録からインシデントを説明できない記録内容の設計
何をログ、カウント、監査すべきか?記録内容の設計
レビューで神クラスや溶岩流が見つかったアンチパターンの認識
どのアンチパターンを最初に修正すべきか?アンチパターンの認識
動作は変わっていないのにテストが壊れるオブジェクト指向コードのテスト
このコラボレーターにはMock、Stub、Fakeのどれか?オブジェクト指向コードのテスト
テストが時間やランダム値に依存するテスト容易性のための設計
テストがアクセスできるようにするためだけにコードが公開されるテスト容易性のための設計
このコードを安全に再構築するにはどうすればよいか?オブジェクト設計へのリファクタリング
リファクタリングが大きくなりすぎて完了できなかったオブジェクト設計へのリファクタリング
テストのないコードを変更しなければならないレガシーコードの扱い
古いシステムを少しずつ置き換えるレガシーコードの扱い
このレビューでは何をチェックすべきか?オブジェクト設計のレビュー
どのレビュー指摘事項がマージをブロックするか?オブジェクト設計のレビュー
誰もコードがこの形になった理由を覚えていない設計決定の文書化
何を、どのレベルで描くべきか?設計決定の文書化
コメントがコードを繰り返すか、矛盾するコードが言えないことのコメント
このコードが奇妙に見える理由をどこで説明するか?コードが言えないことのコメント
フレームワークフックやマーカーがビジネスルールを持つフレームワーク内での作業
フレームワークにどこまで従うべきか?フレームワーク内での作業
計算が同時に保存、送信、または入力を変更する関数型テクニックの適用
どの関数型テクニックがオブジェクトコードに適合するか?関数型テクニックの適用

言語スキル

言語スキルは、1つの言語のコアルールを保持し、それを決して置き換えません。ベース言語スキルは、フレームワークのないコード用です。

  • oo-java (object-oriented-design-java 由来): レコード、シールド型、equals と hashCode、チェック例外、Optional、拡張に対して閉じたクラス。
  • oo-kotlin (object-oriented-design-kotlin 由来): データクラス、シールド型、null許容型、by による委譲、拡張関数。
  • oo-typescript (object-oriented-design-typescript 由来): ブランド化された識別子、#private 状態、抽象クラス、デコレータ、識別共用体、コンポジションルート。
  • oo-javascript (object-oriented-design-javascript 由来): プライベートフィールド (#)、クラスフィールド、instanceof と typeof、動的インポート、モジュールパターン、コンポジションルート。
  • oo-ruby (object-oriented-design-ruby 由来): モジュール、ミックスイン、attr_reader/attr_accessor、ダックタイピング、nil の安全な処理。
  • oo-python (object-oriented-design-python 由来): @dataclass、@property、抽象基底クラス、型ヒント、__slots__、コンテキストマネージャ。
  • oo-go (object-oriented-design-go 由来): 構造体、インターフェース、埋め込み、レシーバメソッド、エラー型、型アサーション。
  • oo-csharp (object-oriented-design-csharp 由来): レコード、抽象クラスとインターフェース、非同期メソッド、record、readonly 構造体、プライマリコンストラクタ。
  • oo-swift (object-oriented-design-swift 由来): struct と class、プロトコルとプロトコル拡張、列挙型と関連値、値型と参照型。

関連スキル