プログラマ・アゲイン blog

還暦を過ぎたけどプログラマ復帰を目指してブログ始めました

やっとオブジェクト指向の意味が分かった気がする

やっと今になって、Java の勉強をしました。

と言っても、入門書を読んだだけですが、その入門書の約半分に Java の文法の事が書かれており、あと半分はオブジェクト指向の事が書かれていました。

オブジェクト指向:OO(Object Oriented)については、約30年前に勉強したことがありましたが、当時は概念だけだったので今一つ理解できませんでした。

今回、Java の入門書を読むことで、Java言語にオブジェクト指向の概念がどのように実装されているのか、クラスやインスタンスやオブジェクトなどの言葉の意味は何なのか、カプセル化や継承などはどういうことなのか、などの長年ボヤっとしていた事が少しハッキリしました。(完全に理解できたかというと、それにはもう少し時間がかかりそうですが)

取り敢えず、入門書を一冊読み終えたので、その入門書を紹介したいと思います。

 

Javaの入門書

今回読んだのは、次の書籍の第2版です。

 

第3版は、「読みやすさ、使いやすさをさらに磨いた増補改訂版」だそうで、

第3版では、Java11を基準に内容を改訂し、実務で頻用するコレクションなどの解説を新たに取り込みました。また、好評の仮想開発環境「dokoJava」をブラッシュアップして使い勝手を高めたほか、紙面上の主要ソースコードQRコードを配し、より学習しやすくなるよう細部に工夫を加えています。

という事なので、第3版を読めばよかったかなとも思いますが、第2版でも十分勉強になりました。

入門書の目次

第2版の目次は、次のようになっています。

  • 第0章 Javaをはじめよう
  • 第1部 ようこそJavaの世界へ(プログラムの書き方/式と演算子/条件分岐と繰り返し/配列/メソッド/付録A JDKを用いた開発/複数クラスを用いた開発)
  • 第2部 すっきり納得オブジェクト指向オブジェクト指向をはじめよう/インスタンスとクラス/さまざまなクラス機構/カプセル化/継承/高度な継承/多様性)
  • 第3部 もっと便利にAPI活用術(Javaを支える標準クラス/例外/まだまだ広がるJavaの世界/付録B Eclipseによる開発/付録C エラー解決・虎の巻/付録D 構文リファレンス)

ページ数は658ページで、本の厚さも3.5㎝あり、読み切るのにはそれなりに根気がいりました。

この本の感想

てっきり、Javaのプログラミングを始める人向けの本だと思っていたので、Javaの文法について細かく書かれているんだろうと思っていました。

感覚的なものですが、前回読んでいたRubyの入門書に比べると記述が少ないと思います。

しかし、文法については第1部がメインで量的には少なめですが、要点を抑えて説明されており、イラストを使って分かりやすくなっていると思います。

何より良いと思ったのは、何故そういうコーディングになるのかを原点に戻って説明されているところです。

原点とは例えば、「配列の舞台裏」で説明されているように、配列変数と配列要素はメモリー上別々の場所に作成されており、どのようにコンピュータ処理されるのか、というようなことです。

単にコーディングの仕方だけを説明されるのではなく、実際コンピュータ内部でどういう処理が行われるからこうするんだという説明があるので、納得して理解する事が出来ました。

同じような意味で、オブジェクト指向についても第2部で説明されていますが、その内容について次に記述します。

 

オブジェクト指向で分かった事

第2部の最初の方に書かれている、次の記述が衝撃的でした。

基本文法とオブジェクト指向とでは、そもそも学ぶものも学び方もまったく違う

今まで基本文法とオブジェクト指向は同じものだと思っていたので、何とかオブジェクト指向もどきでプログラミングすればいいんだろうと思っていました。

しかし、Ruby でプログラミングして出来上がったコードを見ると、今までアセンブラCOBOL等の手続き型言語を使ってプログラミングしてきたものと、文法が違うだけで同じようなものになっていました。

これは完全に間違ってました。

引用

いくつか、オブジェクト指向を理解するうえで、大事だと感じたところを引用させていただこうと思います。

「正解に辿り着くための考え方」を学ぶ

オブジェクト指向とはソフトウェアを開発するときに用いる部品化の考え方のこと。

その根底にある目的は、「人間に把握できるプログラム開発を実現する」というものです。

私たち人間が慣れ親しみ、よく把握している現実世界をマネして作られたプログラムもまた、私たち人間にとって把握しやすいものだから

現実世界の登場人物たちを、コンピュータの中の仮想世界にオブジェクトとして再現し、現実世界と同じように連携して動くようにプログラムを作ること

 

理解した事

上記のようなことから、私のオブジェクト指向の理解は、

オブジェクト指向は、プログラムの構造を現実世界に合わせて記述し、人間が理解しやすいプログラムを作成するための手法

となりました。

これを基に、クラスやインスタンス、継承やカプセル化などの説明を読むと、なるほどその為だったのかと、改めて納得して理解できた気がします。

これからは、プログラムをいきなりコーディングする前に、オブジェクトの認識や継承などを考える事が、オブジェクト指向に繋がるのではないかと思います。

 

今後に向けて

まだまだ Java のプログラミングをするには、知識の定着も浅く、開発経験もないことから、次の実践編も読んだ方が良いかなと思っています。

また、Rubyオブジェクト指向言語なのに、今までコーディングしたプログラムはオブジェクト指向もどきにしかなっていません。改めて Rubyオブジェクト指向を意識したプログラミングをやってみたいと思っています。