オブジェクト指向を理解したいならGithubのオープンソースのクラスライブラリのドキュメントを読もう

オブジェクト指向を学ぶには使うのが一番

文法は抑えたはずだけどオブジェクト指向が分からない。自分の書いているコードがちゃんとしてるものなのか分からないという人向けの記事です。

いつかの記事でも言いましたが、オブジェクト指向を極めてから応用しようと言うのは無謀です。何度でも言いますが、プログラミングを学び始めるあたって「極める」と言うワードは使わないようにしましょう。極めると言う言葉は多くの場合、一通りじっくり勉強してから何かを作り始めるという意味で使われますが、これは作ることから逃げているという意味で逃げのワードだと思います。

とは言え右も左も分からないのにいきなり書けるわけがありません。そこで、まずはGithubのクラスライブラリのドキュメント読むことから始めましょう。例えば私が今使おうとして読んでいるクラスライブラリのドキュメントは以下になります。

PkRSS javadoc

これはAndroid向けのRSSやAtom形式のフィードを読み込むためのライブラリで、規模としてはそこまで大きくないです。

このクラスライブラリですが、オブジェクト指向という設計思想に即しているか微妙なところがあります。しかし、このクラスライブラリは実際にアプリに応用されるようなものです。Javaライブラリのパッケージ管理システムとも呼ばれるMavenのセントラルリポジトリにも登録されています。

実際に設計を見ることで、オブジェクト指向的じゃ無いクラスライブラリなんて無数にあることが分かると思います。そもそもオブジェクト指向は開発を加速させるための道具として注目されているに過ぎないので、それで良いのです。オブジェクト指向であるかどうかにとらわれて、プログラムを作り出すことが出来ないと言うのは本末転倒です。

クラスとは何かについての認識で、言語の壁が見えてくる

「class」という英語は、日本語で授業などと訳されることが多いです。このことは、オブジェクト指向の用語としてのクラスがピンと来にくい主な原因になっていると考えられます。

オブジェクト指向におけるクラスの訳は「種別」が適当です。英語圏の人は当然そんなこと言われないでも分かっているのでクラスはきちんと「種別」になっています。

例えば Article .getTitle();を「ArticleクラスのgetTitleメソッドを使用。」と言うより「種別:Articleのメンバ関数getTitle()を呼び出し。」と言った方がわかりやすいと思います。「ArticleクラスのインスタンスではgetTitleメソッドが使える。」というより「種別:Articleのものが存在している時、それにおいてメンバ関数getTitleが使える。」と言った方が分かりやすいです。

情報系は漢語や大和言葉的な和訳がされておらず、用語によってはピンと来にくいものがあります。そのためクラス=種別であるという英語圏では当然の認識がナチュラルには共有出来ず、種別と言って意味が通れば良い、という感覚でされた設計に違和感を感じてしまいます。

参考書などで勉強すれば勉強するほど、実際に使われているクラスライブラリを見た時に違和感を感じてしまうでしょう。世界でのクラスライブラリの認識は、一部の研究者など詳しい人を除けば、種別分けして使いやすくしたライブラリというシンプルなものです。厳密にオブジェクト指向に則る方が稀なケースだと思います。

クラスライブラリを使ってオブジェクト指向の素晴らしさを感じよう。

厳密にオブジェクト指向に則っているわけではないですが、クラスライブラリがいくつかのオブジェクト指向的な特徴を使って書かれていることに変わりはありません。それによって、ライブラリの使いやすさは格段に上がっています。

まず、クラスとしてライブラリが定義されていると言うことが使いやすさを上げています。メンバ関数に使われる変数がある名前空間にひとまとまりになっているので、名前の衝突が起きませんし、可読性も上がります。

またクラスライブラリの多くは内部動作を意識しなくても使える設計思想である「カプセル化」の下にされているので、使い方を読むだけで問題なく使え、とにかく可用性が高いです。様々な種類のライブラリをインポートして使っても相性などの問題が起きず、リミックス的な開発が加速します。

クラスライブラリを使っていく中で様々なオブジェクト指向の特徴がどう便利かということが理解出来ます。

GithubでLet’s STUDY

参考になる沢山のプロジェクトがGithubで公開されています。現代的な情報学徒が利用しない手はありません。Githubを勉強に役立てましょう。

Add a Comment

メールアドレスの入力は任意です。(公開されることはありません)