開放閉鎖原則
コードを追加/修正するときに他のモジュールに影響させない
拡張に対して開いていて
修正に対して閉じている
?🤔?
拡張に対して開くとは
コードを追加するときに既存のコードを修正しなくていいということ
例
ViewerクラスとVideoServiceクラスがあったとする
動画視聴をするViewer.watch()がVideoServiceクラスを使っているとする
既存の視聴サービスに追加して、アニメ視聴サービスを視聴させたいという要件が新たにできたとき
Viewer.watch()をAnimeVideoServiceに対応させるためにwatch()を変更しなくていい設計
満たされていないとどうなる?
機能追加をするたびに既存モジュールの分岐を増やしたりする必要がある
修正に対して閉じるとは
コードを修正するときに別のコードも修正せずに済むこと
例
ViewerクラスとVideoServiceクラスがあったとする
Viewer.watch()がVideoServiceクラスを使っているとき
VideoServiceクラスのメソッドを変更した際に
Viewer.watch()を変更しなくていい設計
その他の例
this.foo.bar.baz += 1
bazを変更しようとしたときにbar, fooを変更しないといけないかもしれない
満たされていないとどうなる?
既存モジュールこコードを修正しようとしたら、そのモジュールを使っているコードも手を入れないといけなくなる
上の例で言えばViewer.watch()を変更しなければいけなくなる
そしてさらにそれを使っているモジュールも変更を強いられる可能性が
/icons/つらい.icon
補足
interfaceに依存しておけば、そのinterfaceを実装しているクラスを差し替えることができる