もう一度身につけたい変態で学ぶオブジェクト指向

コンニチハ!
変態アドベントカレンダーです。

http://atnd.org/events/22020

アドベントカレンダーとは、クリスマスまでに毎日日替わりで窓を開けていくカレンダーのこと。
それにちなんで、日替わりでblogエントリを書くのがアドベントカレンダーです。

オブジェクト指向

ってよく聞きますし、実際のところ何がすごいの??
って思ったりしてる人も多いでしょう。

抽象クラスって何よ!?
インタフェースとかどうやって使う?

とか

そういう初心者向けアーンドもう一度学びたい人達に変態を例に説明してみましょう。

うだうだですけど、最後まで読んでいただければ幸いです。。。

まず、オブジェクト指向は何が嬉しいのか?ってところですけど、

処理を共通化し、生産性をあげる!!

ということではありません。

もちろんそういう一面もありますが、これぐらいならオブジェクト指向を使わなくても十分できます。

では、オブジェクト指向は何を可能にしてくれるのか?

それは

変化に強いプログラムにしてくれる

ということです。

これを変態を使って説明してみましょう。

そう

変化に強い変態

を作ってみましょう


これが社会に出てきたらもう無敵ですね。


まず簡単なユースケースを考えてみます。

変態が女子高生のスカートをめくる

こんな感じです。

ではこれをもとに実装してみましょう。

____________________________________________________________________________________________________

まず「変態クラス」と「女子高生のスカートをめくる」メソッドがでてきます。

class 変態 {

  スカートをめくる(女子高生){
    女子高生.スカートがめくられた();
  }
}

次に「女子高生クラス」を作り「スカートをめくられた」というメソッドを作ります

class 女子高生{
  スカートがめくられた() {
    printf("きゃーーーー!!");
  }
}


____________________________________________________________________________________________________

ってかんじでしょうか?

これで、「変態が女子高生のスカートをめくる」というユースケースの実装ができます。

でも、変態ですよ?
この変態ぶりが女子高生だけでおさまるとは限りません。
もしかしたら女子大生に手を出すかもしれません。

では次のユースケースを足しましょう。

変態が女子大生のスカートをめくる

____________________________________________________________________________________________________

新たに「女子大生クラス」が追加されます。

class 女子大生{
  女子大生#スカートがめくられた() {
    printf("いやーーー!!");
  }
}

そして、変態クラスに女子大生用のメソッドを追加します。

class 変態 {
  スカートをめくる(女子高生){
    女子高生.スカートがめくられた();
  }

  スカートをめくる(女子大生){
    女子大生.スカートがめくられた();
  }
}

____________________________________________________________________________________________________

って感じでしょう。

でも、中にはロリコンな変態もいます。
女子中学生に手を出すかもしれません。
なので、次のユースケースを足しましょう。

変態が女子中学生のスカートをめくる

____________________________________________________________________________________________________

新たに「女子中学生クラス」が追加されます。

class 女子中学生{
  スカートがめくられた() {
    printf("おまわりさんこっちです。");
  }
}

そして、変態クラスに女子中学生用のメソッドを追加します。

class 変態 {
  スカートをめくる(女子高生){
    女子高生.スカートがめくられた();
  }

  スカートをめくる(女子大生){
    女子大生.スカートがめくられた();
  }

  スカートをめくる(女子中学生){
    女子中学生.スカートがめくられた();
  }
}

____________________________________________________________________________________________________

変態さんの欲望はまだまだかもしれませんが、ここでここまでした実装の内容を振り返ってみましょう。

まず、
「変態クラス」ができ
「変態クラスにスカートをめくる(女子高生)メソッド」つくり
「女子高生クラス」ができ、
「女子高生クラスにスカートがめくられた()メソッド」をつくりました

次に
「女子大生クラス」ができ
「女子大生クラスにスカートがめくられた()メソッド」をつくりました
「変態クラスにスカートをめくる(女子大生)メソッド」つくり

そして、
「女子中学生クラス」ができ
「女子中学生クラスにスカートがめくられた()メソッド」をつくりました
「変態クラスにスカートをめくる(女子中学生)メソッド」つくり

ここで、あることに気づきませんか?

スカートをめくる対象が増えたら変態クラスに手が入ります。
つまり、スカートをめくるという変態なことをするためには、一度、変態さんには改修が入らないといけません。
この変態さんは変化に強いでしょうか?

目の前に新たに「OLさん」がスカートをはいて現れたら、一度家に帰って、スカートをめくる練習をして
いざ本番に挑むといったことをしなければなりません。

これでは欲望丸出しな素晴らしい変態さんはできませんよね?

ではどうすればよいのか?

そもそも、相手を絞る必要なんてあるのか?
スカートをはいていればよいのではないか?

つまり
「変態がスカートをはいている人のスカートをめくる」

にすればよいのです。

対象が「スカートをはいている人」という対象になります。
変態とスカートをめくる相手のインタフェースはスカートをはいているになります。

「スカートをはいている人」インタフェースは「スカートがめくられた()」メソッドを持ちます。
メソッドの内容は実際にスカートをはく人に任せます。

____________________________________________________________________________________________________

interface スカートをはいている人{
  スカートがめくられた();
}

____________________________________________________________________________________________________

そして、変態クラスのメソッドは

____________________________________________________________________________________________________

class 変態 {
  スカートをめくる(スカートをはいている人){
    スカートをはいている人.スカートがめくられた();
  }
}

____________________________________________________________________________________________________

ということになります。
ずいぶんすっきりしましたよね?

そして、女子高生はスカートをはき、スカートがめくられた時の動作をそれぞれ実装します。

____________________________________________________________________________________________________

class 女子高生 implements スカートをはいている人 {
  スカートがめくられた() {
    printf("きゃーーーー!!");
  }
}

____________________________________________________________________________________________________

こうすることで何が嬉しくなったのでしょうか?

たとえばOLさんが登場したとします。
そして、OLクラスが作成され、「スカートをはいている人」をimplementsし、スカートがめくられた()を実装します。

こうするだけで、変態さんはOLのスカートをめくることができます。
変態さんに手が入ることはありません。

今後もそうです。
女子小学生が現れようが、熟女が現れようが変態さんにはメンテナンスは起きません。

これで、スカートをはいていれば誰でもスカートをめくってやれるスーパーな変態さんができました。

変化に強い変態さんの完成です。

現実世界でこんな人がいれば、間違いなく逮捕されてますけど。。。

つたない説明でごめんなさい。

最後までお付き合いいただきありがとうございます。