インターフェイスの良さをソースコードなしでがんばって説明してみた

公開

最近なぜか C# を教えるという機会がまれにあるのですが、その中でもインターフェイスは「良く分かん!」となってしまうことが多くて(めっちゃわかる)、どうしたらうまく説明できるのか考えることが多いです。せっかくなので何番煎じもいいところですがここでもメモしておこうと思います。

想定している方

  • インターフェイスがどういうものか知ってはいるけれど使うイメージが沸かないという方向けです。
  • 一応 C#のinterfaceを想定しています(が他の言語も変わらないと思います)。

契約と実装の分離?

C#におけるインターフェイスはたとえばこの辺を見てもらえればどのようなものか分かると思います。

簡単に言えばインターフェイスを使うと、インターフェイスで何を実装するか(契約1)を決めて、インターフェイスを実装すると決めたクラスで実際にメソッドを実装させることができます。これは契約と実装の分離とも呼ばれインターフェイスの利点とよく言われます。

う~ん何が嬉しいの…?

インターフェイスがない世界

突然ですがあなたはとあるお店の店長です。最近お店がとても忙しくなってきたため、とりあえず運よく捕まえた A さんを雇う2ことにしました。A さんには忙しくて自分では覚えられない仕事を代わりに覚えて貰い完全に任せることにしました。

実体に依存した状態

このとき、お店は A さんという実体に依存した状態になったと言えます(A さんなしじゃ仕事が回らない!)。こんなとき、もしも A さんがお店に出られなくなったらめちゃくちゃ困ります。急遽別の人を呼んだとしてもおそらく仕事が分からず困ってしまいます。さらにあなたも仕事のやり方が微妙に変わりきっと戸惑うはずです。

インターフェイスのある世界

そこで、次にあなたは自分が任せたい仕事をあらかじめきっちり整理してこれこれをしてもらうという契約(インターフェイス)を作成しました。そしてこの契約を履行してくれる人を雇うことにしました。

抽象に依存した状態

こうするとたとえば次のような嬉しいことが起こります。

依存を解消できる

契約を履行してくれる人を雇い契約した仕事だけをしてもらう3ようにすれば、お店はもはや A さんといった実体には依存しなくなります。代わりに契約(インターフェイス)という抽象にのみ依存するようになります。なので、たとえば A さんがお店に出られない日があったとしても代わりに契約を履行してくれる誰かがいれば(それが例えサルだとしても!)、いつもと変わらず仕事を進めることができまます。

依存関係逆転の例

このことは依存関係逆転の原則と呼ばれたりして、クラス間を疎結合に保ち変更に強いソフトウェアを作るための原則としてよく知られています。ソフトウェアはよく変更されるのでいかに変更しやすく作るかはとても重要です。

契約の実現方法を選択できる

契約した仕事だけをしてもらうとき、あなたとしては契約を履行してくれさえすればいいので、その契約の実現方法は履行してくれるそれぞれに任されています。つまり、A さんとサルとでは契約の実現方法は異なってもよい訳です。

これは逆にあなたが契約の実現方法を選択できるとも言えます。仕事の適切なやり方は時と場所で異なる4可能性があります。契約(インターフェイス)があると、契約が履行されることは保証されながらもその実現方法を選択することができます。

ポリモーフィズムの例

これはいわゆるポリモーフィズムというやつの嬉しいところで、たとえば単体テストを行うためのテクニックとして本番用クラスとテスト用クラスが使い分けられたりします。

お決まりのフレーズが使える

仕事をしているといつも同じような作業の組み合わせが出てきたりします。このような典型的なパターンにはお決まりの共通のフレーズを定めておくと便利なことがあります。契約(インターフェイス)があるとできる仕事が保証されているので、この範囲で再利用可能なお決まりのフレーズを定めることができます。

お決まりの構文を使う例

たとえば .NET ではIEnumerableというインターフェイスが実装されていれば、foreachという誰もが使ったことがある便利な構文を利用することができます。

おわりに

ということでかなり無理やり5な気がしますが人になぞらえてインターフェイスを説明してみました(コードが一切出てきてない!)。実際の人の仕事とプログラムの挙動は異なるものなので必ずしも適当な表現ではないと思いますが、インターフェイスという概念の感触を掴むきっかけにしてもらえたら幸いです。

参考


  1. とはいえ C# 8.0 以降では既定の実装を定義できるようになっていたりします。
  2. ここでの A さんを雇うとは、クラス A に処理を移譲することをイメージしています。
  3. ここでの契約した仕事だけをしてもらうとは、クラスをインターフェイスへアップキャストすることをイメージしています。
  4. 要件によっては望ましい技術ないしはデータ構造等が異なる可能性があることをイメージしています。
  5. 無理やりですが当事者感?が出てイメージしてもらいやすいかなと思った次第です(コンセントみたいな例の方が適当だとは思ってる)。
プロフィール画像
tamaosa

釣りと登山が好き。

Privacy PolicyBuilt with Gatsby, © 2019 Tamaosa