どうも、かまいたちの山内じゃない方のやまうちです。
現在進行系で『アジャイルソフトウェア開発の奥義』っていう本を読んでいます。
今まで読んでた本からステップアップした本を読もうと思ったわけですが、話しが難しい。。。(;・∀・)
ホントはこの本からなんか書こうと思ったんですが、どうも無理っぽいw
とはいえその中にあるSOLIDを読んでいたら、すこぶる刺激を受けました。
「プログラミングするなら抽象化するのが常識やん?」
こんな感じで。
そんなわけで、インターフェースによる抽象化をアウトプットしていきます。
Aボタンでパンチ
こんな感じです。
これは使う側(Aボタン)から使われる側(パンチ)への依存が発生してます。
パンチ側から見ると誰かに呼ばれたらパンチするだけですが、Aボタン側から見るとボタンを押したらパンチしてほしいからですね。
パンチ側の気が変わって
「今日から俺、キックするわ」
こうなってしまっては、Aボタン側としてはボタンを押したらパンチして欲しいのにキックをしてしまうため非常に困ります。
ゴリゴリの依存です。
インターフェース登場
ではAボタンがパンチにゴリゴリ依存してしまっている状況を打破しましょう!
パンチインターフェースがAボタンとパンチの間に入りました。
こうなることで、Aボタンとしてはパンチインターフェースを呼び出すことで、パンチをすることができるようになります。
インターフェースは、パンチが実装されていることを保証する役目もあります。
ですので、パンチを呼び出したのにキックをするということも発生しなくなります。
要するにAボタンとしては、パンチがどういう状態にあるかというのは全く気にする必要はなく、
ただインターフェースに「ボタン押したからパンチ呼び出して」。
こう告げるだけパンチが可能です。
依存するなら抽象に依存しよう!
もっとすごいパンチがしたい!
さて、なんかもっとすごいパンチがしたくなりました。
今度はこんな設計。
すごいパンチが新しく加わりました。
すごいパンチは、パンチを継承してパンチインターフェースを実装しています。
あくまでAボタンは抽象であるインターフェースに依存しているので、パンチがふつうのパンチでもすごいパンチでも、はたまたヘナヘナパンチでも関係なく、AボタンはAボタンをポチッとするだけです。
これが抽象であるインターフェースに依存するメリットです。
簡単な例ですが、インターフェースによる抽象化はこんな感じです。
他にも設計思想がたくさんあって、全然勉強が追いつかないのですが、SOLIDだとかGoFのデザインパターンとか多分他にも色々あると思いますが、焦らず少しづつ学んで行きます。