いまさらオブジェクト指向について考えを巡らせたので

なんで2013年も終わりになりそうになってて、ScalaとかHaskellだとかF#だとかで巷がにぎわってるのにこんなカビの生えた話題なんでしょうね。いや、僕的には割と生々しいんですけども。

というのも、社内で有志を募りちょこちょことやったりしているモノに関連して、コーディング規約を僕の独断と偏見で全部書いたりしていた訳です。
そんでもって、そこに関連して良いコードを書くためのハウトゥーみたいなものも勝手に書いたりしつつあるわけです。僕も新人ですけど、例えば新人が新たに入ってきたりとか、運用の人がコーディングに参加したりとかなんだりするときに役に立ちますし、うまく練り上げれば社内でも有用な文書になりますもんね。というか正直社内のコーディングのアレについては若干歯がゆいものを感じているので、これを気に良いコードを書く習慣が広まれば良いなぁと思ってもいるのです。

という導入がありまして。
その社内の某ではWebフレームワークを使うので、非開発者や新人はもとより、開発チームでもオブジェクト指向について危うい感じのメンバーもいるアトモスフィアを感じているので、さも偉そうな感じで解説用の文書を書こうと思い立ちました。

世の中でどーいわれてんのか

そんで、僕自身はまあそれなりにわかってるつもりではあるんですけど、人様の為の文書をまとめるとなるとそんないい加減なことじゃいけない。ましてやゆくゆくは社内の手引書にまで育て上げたいと思っているのだ。つまり世の中で、OOPについて言及している文章(主にネットの)からパクろうと思ったんです。

でも、なんかこうこれじゃない感のあるエントリとかばっかなので余計もやもやした。
なんだろう、クラスベースの言語機能をオブジェクト指向とイコールで結んでる感じのが多くね? って感じなんだけど、それって違くね? って思うんですよ。
だって僕、普段仕事では.NET使ってますけど、.NETにしても関数型的な機能(関数型の定義とかどうでもいいからね。ようは高階関数とかレキシカルスコープ的な挙動を使ったコーディングですよ)を結構使いまくるわけで、そんなこんなでオブジェクト指向してるコードを書けてるという自己評価ですよ。ええ。


あと本題とは全然関係ないんだけど、一時話題だったstaticおじさんなんかはともかくとして、20世紀入ってからのエントリでオブジェクト指向は全能じゃない〜だとか銀の弾丸が〜とか言っちゃってるの、ナンセンスだと思うんですよね。もはや基礎教養レベルのものについて、ノウハウ以上のことを語るのって意味あるんでしょーかね。それ言っちゃうとこのエントリの意味がなくなるんですけどね。

つまり言いたいのは、みんな難しく考え過ぎなんじゃねえの? だって僕、特に苦労とかなくて一瞬で理解出来たんだけど、なんか難しいことあんの?え?俺あたまいいの? っていう。もちろん、理解できるっていうのとうまく扱えるってのは別もんで、そこんところ僕は経験不足も相まってまだまだなのは自覚的ですけど。

どう考えてるのか

まずクラスがどうこうとか、関係ないと思う。いわゆる一つの言語しか知らないし知る気もない系の人とかは、この手のに凝り固まりがちな気がすんだよね。そういう人ってPythonカプセル化が出来ないからオブジェクト指向は出来ない! とか言い出しちゃう。

オブジェクト指向は、単純にコードを組み立てる上でのアプローチのことであって、クラスがどうだとかポリモルフィズムがどうだとかってのは、下のレイヤーの話と混同すんなよっていう。多分これわかってる人は当たり前にわかりすぎてて、だから誰もわざわざエントリ書かないのか、もしくは僕が完全に的外れ超高校級かのどちらかだと思うんですけど。


たとえてみましょう。いいですね。オブジェクト指向の話っていっつも抽象的なたとえ話ですもんね。

たとえばですね。ネットワークのプロトコルってあるじゃないですか。
僕全然詳しくないんで間違ったこと言ってるかもしれないですけど、あれもいわばオブジェクト指向だと思うんですよ。

通信の規約って、確かRFCとかいうのに載ってるって聞いたんですけど、実装レベルでの規約ってのは例えば

+ 全体の長さはaビットまでで
+ データの区切りはbビットごとに一つの単位として区切る
+ さらに全体を区切って、先頭はID、二つ目はステータス、三つ目は通信内容……

なんて感じだったと思うんですよ。
これってクラスベースでいう、インターフェースの定義じゃないですか? んで、実際にプロトコルにそってやりとりされるデータはインスタンスなんですよ。


他にも、例えばHTMLとかにしても、こういうマークアップの時はこうしてくださいよーっていう規格が存在する。そんで、その規格にそって各ベンダは中身をそれぞれ実装する。
中身の実装はてんでばらばらだけど、ちゃんと規格にそったHTMLを流せば、どれも規格通りの画面を表示してくれる。多少の誤差はでるけど。多少の。

そんなかんじ

どうですかね。オブジェクト指向の考え方ってごくごくありふれたものだと思うんですよ。
だから、C言語だろうがアセンブリだろうが(書いたことないけど)、Haskellだろうが(書いたことないけど)Lispだろうが(書いたことないけど)オブジェクト指向は実現できます。多分。

っていうか
Haskellオブジェクト指向は出来ない。でも純粋な関数型のパワーがあればそんなものはいらないのだ!(くわっ」
みたいなのとか、超もやもやしないですか? だって、モナドとか超オブジェクト指向っぽいじゃないですか。
「関数型のパワーを使えば、より素敵なオブジェクト指向を実現できる!」
これならいい、全然もやっとこない。

実現するための手法は色々あると思うんです。関数型にしたところで、クラスベースとは別の形でのオブジェクト指向的な、あるいはもっとうまくて崇高ななのかなのかもしんないですけど、でも物事を設計する上での冴えたやり方としてのオブジェクト指向はクラスがどうだとかそういうのに縛られたもんじゃあないですよっていう、そんだけ。


え? そんな抽象的な論はいいからクラスだとかインターフェースだとかポリモルフィズムだとかのオブジェクト指向的な手法をどうこうしたコーディングが出来なくて悩んでんだよカスって、それ努力と向上心の不足じゃあないんですか? 手を動かしてれば簡単に理解出来ますよ。多分ね。

オブジェクト指向が難しい、理解できないっていう人の気持ちはよくわかんないんですけど、たぶん難しく考え過ぎですよ。楽に、綺麗に、自分が使っている言語に適した形で、って言うように心がけてコード書いてれば自然とそういう方向に向かってコードが良くなっていくと、僕はそうなってくれたら良いなあと思ってます。社内でも、もうちょっとオブジェクト指向に対する理解が広まってくれたらいいなあと、思ってます。
以上です。