2012/09/28

線形代数学とオブジェクト指向は似てる!?


プログラミングを始めると「オブジェクト指向って何?」って壁にぶつかるのではないでしょうか?オブジェクト指向について調べると本当にいろんな情報が手に入って,結局よくわからなかったりします.とりあえずオブジェクト指向って難しいということだけ判るかもしれません.

結論から言うと,オブジェクト指向という言葉や概念に明確な定義はなく,
「プログラムなどをもの(オブジェクト)として考えること」
に近い意味を持っています.そして,定義が曖昧なために説明も抽象的になり難しく感じてしまうのでしょう.


しかし,現在ほとんどのプログラミング言語がオブジェクト指向をサポートしており,プログラミングを行う上でオブジェクト指向はなくてはならないと言っていいほど重要な概念であることも事実です.さらに最近ではオブジェクト指向を直接プログラミングとは関係のないシステム開発の上流工程に応用するといった動きすら存在します.ですが,オブジェクト指向についての理解が深まれば,オブジェクト指向言語の理解はもちろん,その概念は様々な場面で(時には無意識に)役立つことも多いかと思います.



では,どうやってオブジェクト指向を理解すればよいか?


そもそも,オブジェクト指向が1つの概念である(実際はそうなのですが)と思っていることを一度やめてはどうでしょうか?

1つの分野,プログラミングという科目のオブジェクト指向という分野.数学の線形代数学のような.

こう考えてみると,一言ではオブジェクト指向という分野について語れないとわかるでしょう.一朝一夕には学べないことがわかるでしょう.


ここで,結局時間をかけて学ぶしかないのかと残念に思わないでほしいのです.もはやオブジェクト指向という概念の把握にかける無駄な時間は必要ありません.いや,時間はかけなければならないのですが,オブジェクト指向という分野を構成している要素を1つずつ理解する有意義な時間の使い方を推奨します.学問の1分野を学ぶときも,1つ1つの概念を理解して,演習問題を解いて,応用問題に取り組んで…といった形で学んでいた人が多いのではないでしょうか.そして,その知識を使う段階(という経験があればですが)でより一層理解が深まっていったと思います.オブジェクト指向も同じで,構成する1つ1つの概念に対して,特に必要なものから順に理解し,応用し…を繰り返して学んでゆけばよいでしょう.結局は経験がなければただの知識しか残らないのですから.


とは述べたものの,オブジェクト指向プログラミング(OOP)について知りたい方と話したい筆者のために,少しOOPとは何かに対する抽象的な意見を述べておきます.OOPの本質はポリモーフィズムに代表される(同じ点を抽出して同じ像とみなす)抽象化にあると筆者は考えています.そもそも,コンピュータ上の(コードを含む)データをものとみなす行為が抽象化です.プログラミング言語の進化自体抽象化の歴史みたいな一面があり,オブジェクト指向を説明する人は抽象化が大好きで何でも抽象化して考える癖があるように思います.一般的な議論をすることも,異なるものに対して同じ要素を抽出してきて同じものとみなすことも,ある意味抽象化です.だから,オブジェクト指向の説明は抽象的なものが多く,実際の具体的なコードがなんとなく少なく,プログラム以外の他のものが例えとして用いられていることが多いのではないでしょうか.この文章のタイトルからしてすでに抽象化を用いたものになっています.
OOPでは,言語でサポートされているものとそうでないもの,基礎的なものから応用したもの(デザインパターンなど)まで様々なものとみなす抽象化のためのテクニックが数多く存在します.以下に基礎的な概念の一部を列挙してこの説明を終えようと思います.

概念 説明
ポリモーフィズム(多態性) 同じように振舞わせる操作の抽象化
継承,ダックタイピング 同じように振舞う動作の抽象化
型,クラス(構造体),インスタンス 同じ属性のデータや処理をまとめる概念の抽象化
カプセル化 詳細を隠蔽し単純にする抽象化


最後になぜ,似ている分野の例に線形代数学を挙げたのかを説明しておきましょう.
それは,筆者が始めにどんなものか知ったときは大して必要なさそうに感じたものの,学ぶうちに必要不可欠なものに変わった点が似ていたためです.また,どちらも抽象化し,簡単にし,人間の理解を助けるという点でも似ているのではないでしょうか.

0 件のコメント:

コメントを投稿