2011-12-10
もう一度身につけたい変態で学ぶオブジェクト指向
コンニチハ!
変態アドベントカレンダーです。
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のスカートをめくることができます。
変態さんに手が入ることはありません。
今後もそうです。
女子小学生が現れようが、熟女が現れようが変態さんにはメンテナンスは起きません。
これで、スカートをはいていれば誰でもスカートをめくってやれるスーパーな変態さんができました。
変化に強い変態さんの完成です。
現実世界でこんな人がいれば、間違いなく逮捕されてますけど。。。
つたない説明でごめんなさい。
最後までお付き合いいただきありがとうございます。
- Twitter / @kytiken
- Twitter / @tmybj
- Twitter / @yasi_life
- Twitter / @alpha_pz
- Twitter / @razan_zhang
- Twitter / @s_kozake
- Twitter / @tmybj
- Twitter / @ogcy
- Twitter / @Attsun1031
- Twitter / @yugotou
- Twitter / @motodimago
- Twitter / @mi3papa
- Twitter / @yuya_satooo
- Twitter / @aiaiueo
- Twitter / @bethbeth321
- Twitter / @makorinx
- Twitter / @stc1988
- Twitter / @chaosbrave
- Twitter / @ryotafujihashi
- Twitter / @yuta_matsuyama
- Twitter / @DeDeDeDeDecky
- Twitter / @en_daisuke
- Twitter / @T0M0AK
- Twitter / @_Count_Zero
- Twitter / @dorokei
- Twitter / @furukubo
- Twitter / @akira1908jp
- Twitter / @sleepyyusuke
- Twitter / @sicks_6
- Twitter / @downstair
- Twitter / @sibonyan
- Twitter / @aWebprogrammer
- Twitter / @notsumitsuru
- Twitter / @razon
- Twitter / @keeee29
- Twitter / @colorless_moon
- Twitter / @kuritatu
- Twitter / @coonya_jp
- Twitter / @usayman
- Twitter / @dunjiii
- Twitter / @cherno_bog
- Twitter / @urus_
- Twitter / @OutEagle
- Twitter / @dododohondo
- Twitter / @editnuki
- Twitter / @5chi
- Twitter / @hrsw___
- Twitter / @waman10da
- Twitter / @kingofalpha
- Twitter / @kyo10
- Twitter / @niusounds
- Twitter / @DJ_32Mitsu
- Twitter / @ri_ru55
- Twitter / @ebatu
- Twitter / @shinoyu
- Twitter / @sai95692002
- Twitter / @piziro
- Twitter / @kwmt5com
- Twitter / @maroon297
- Twitter / @55enokky
- 倭マン日記 - 2011年12月12日のツイート
- Twitter / @at_sasaki
- 513 http://b.hatena.ne.jp/hotentry/fun
- 512 http://www.ig.gmodules.com/gadgets/ifr?exp_rpc_js=1&exp_track_js=1&url=http://www.hatena.ne.jp/tools/gadget/bookmark/bookmark_gadget.xml&container=ig&view=default&lang=ja&country=JP&sanitize=0&v=7a9925984095c987&parent=http://www.google.co.j
- 467 http://b.hatena.ne.jp/hotentry
- 349 http://t.co/OtuN82QQ
- 291 http://www.sleipnirstart.com/
- 288 http://b.hatena.ne.jp/
- 193 http://reader.livedoor.com/reader/
- 147 http://bit.ly/u1wnHf
- 136 http://d.hatena.ne.jp/
- 97 http://www.facebook.com/l.php?u=http://d.hatena.ne.jp/Murakami003/20111210/1323482287&h=eAQH4Rhc6AQHULpggy8zNvy8WN7iLL1zR_6ITbEUs4qdBDw