本セッションの登壇者
セッション動画(YouTubeチャンネル登録もお願いします。)
今回は脱オブジェクト指向講座という話をやりたいと思います。
自己紹介ですが、きしだ なおきといいます。LINE Fukuokaに勤めていて、最近『プロになるJava』(技術評論社)というJavaの本を出したのですが、今回の話のちょっと具体的なコードも載っているので、興味があれば買ってみてください。
今日の話なんですけど、よく「プログラミングの勉強をはじめたけどオブジェクト指向がわからん」みたいな発言を初心者の人がしているのを見かけるんですね。わりと「オブジェクト指向」でTwitter検索するとそういうのばっかりだったりします。
そもそもオブジェクト指向は(プログラミングを)始めたばかりなら気にする必要はないんですよね。なんでみんな気にするんだろう、みたいな。
そもそもちゃんと処理が書けるようになるのが大事で、(オブジェクト指向は)その後に考えればよくて。あとオブジェクト指向はなんだかんだ言って30年前のコード整理術なんで、今はもっといろんな考え方がありますね。むしろ、今の考え方にはあってないので、脱オブジェクト指向した方がいいのではと。
オブジェクト指向の特徴とは?
じゃあ「オブジェクト指向の特徴」ってなんなのか、あらためて見てみると、わりとみんなオブジェクト指向と言ったときに「それ、ほか(の手法)でも通じるじゃん」みたいなやつを混ぜて、ソフトウェアをうまく作る作り方を全部オブジェクト指向って言ってたりするんですけど。
その中でオブジェクト指向独自のことだけを抜き出すと、結局、継承によるモジュールの分類と、その継承を使った差分プログラミングというのが、オブジェクト指向ならではの特徴ということができます。
データと処理をまとめるというのも、けっこうオブジェクト指向の特徴だと言われるんですけど、それはオブジェクト指向固有ではなくて、抽象データ型。で、抽象データ型をクラスを使って実現したのが、オブジェクト指向だったり、C++だったりするわけですよね。
なので、オブジェクト指向の役割としてはポリモーフィズム - 多態を使って状態の管理に対する差分プログラミングをするというのが、オブジェクト指向の役割だと思います。ほかはほか(の手法)でできる。
差分プログラミング
じゃあ差分プログラミングとは何かというと、似たような処理があって、その中のうちの異なる部分を抜き出すというのが差分プログラミングですね。メソッドの場合は似たような処理のうちの共通部分を抜き出してメソッドにする。で、差分プログラミングは似たような部分の違う部分を抜き出して書くという感じですね。
昔はCPUが遅かったり、メモリが少なかったりして継承を使っていたんですけど、今はラムダで実装するのが手軽になっています。
##アプリケーションの構造とオブジェクト指向の相性
アプリケーションの構造を見てみると、基本的にはレイヤー構造なんですね。UI(ユーザーインターフェース)があって、アプリケーションの処理があって、ロジックがあって、永続化の層があって、データベースに繋がるという処理になっていて。で、その間はオブジェクト的にやるとわりとめんどくさいことになるので、レイヤーごとの受け渡しは関数的にやることになっています。
そのうち流れるデータは抽象データ型として、そこはオブジェクトっぽく書くんですけど。ただ、そこにデータと処理を書くんですけど、そのときに持つ処理というのはデータに対する処理だから、データの正規化、データが正しくなるように、もしくはその持っているデータの表現のバリエーション、文字列にしたりとか、メッセージに対して適した形にするみたいな、そういう感じですね。
一方で、ユーザーインターフェースについては、オブジェクト指向が適切なんですが、ここはたとえばWebの場合は、HTML(DOM)やウィジェットでラップされていて、そこはオブジェクト指向が使われているんですけど、ユーザーのアプリケーションを書く側、我々アプリケーションプログラマは、そのDOMとかイベントに対してイベントを関数的に書けば良いとなっていますね。
まとめ - オブジェクト指向は処理が書けるようになってから考えよう
まとめとしては、コーディングテクニックとしてはさっき言ったように、差分プログラミングで使われていたんだけど、もう関数型が使えるようになってます。
だから差分プログラミングのためにオブジェクトの多態で難しい構造を作らなくてよい。デザインパターンもほとんど不要。あれは差分プログラミングをシンプルにやるためのものだったので、今は不要になっています。
で、アプリケーション構造も関数的になっていて、データも抽象データとして考える。だから、オブジェクトごとのやりとりはしないわけですよね。そもそも処理が書けるようになってからオブジェクト指向を考えましょう…ということで5分経っているので、僕の話を終わりたいと思います。