【要約】Strategy Pattern を ABC で書くか、Protocol で書くか [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
Pythonの開発者が、Strategy Patternを実装する際に、インターフェースの定義手法によってコードの結合度やテストの容易性が変わる問題に直面する。具体的には以下の課題がある。
- ・ABC(抽象基底クラス)を使用すると、明示的な継承が必須となる。
- ・継承を忘れると、メソッドが揃っていても型として認められない。
- ・基底クラスへの依存が実装側に広がり、モジュール間の結合度が強まる。
- ・テスト用のモック作成時にも継承が必要になり、コードが冗長になる。
// Approach
著者は、インターフェースの性質の違いを理解し、設計の目的に応じてABCとProtocolを使い分ける手法を提案している。主なアプローチは以下の通りである。
- ・厳格な契約と共通実装の共有:実装漏れの検知や、処理の一部をサブクラス間で共有したい場合はABCを採用する。
- ・疎結合とテスト容易性の優先:実装側にインターフェースの存在を意識させず、テストダブルを軽量に作りたい場合はProtocolを採用する。
- ・ハイブリッド構成:外部公開用にはProtocolを定義し、共通処理が必要なクラスのみ中間クラスを継承させる二段構えの設計を行う。
// Result
この設計指針を適用することで、開発者は状況に応じた最適なインターフェース定義を選択できる。具体的な成果は以下の通りである。
- ・実装側の依存関係を最小限に抑え、疎結合な設計を実現できる。
- ・テストコードの記述を簡素化し、メンテナンスコストを削減できる。
- ・共通ロジックの適切な集約により、コードの重複を排除できる。
- ・Factory Patternの過剰な導入を防ぎ、シンプルな実装を選択できる。
Senior Engineer Insight
> 実戦では「疎結合」と「堅牢性」のバランスが鍵となる。外部ライブラリとの連携やテストのしやすさを重視するならProtocolが極めて強力だ。しかし、ドメインの不変条件を強制し、実装漏れを即座に検知したい場面ではABCの「契約」としての側面が不可欠となる。両者を排他的に捉えず、Protocolを境界線とし、内部でABC的な継承を用いるハイブリッド構成が、大規模開発におけるスケーラビリティと保守性を両立させる最適解といえる。