イントロダクション
前回は、リファクタリングをやり、メインメソッドを整理しました。ここまで来た方、おめでとうございます。
ここから、オブジェクト指向プログラミングの始まりです。
今迄の事がわかれば何かしらの処理を自分で考えて作れるレベルになっていると思います。でわ、ここから何をやるか?ですが、基本の更に深いところ、オブジェクト指向について理解していこうと思います。
オブジェクト指向
オブジェクト指向については、色々な書籍があり、色々な事が書かれていますが、ネコとかイヌを例に出しているものは、混乱すると思います。(自分はハマりました(笑))
他にも、個人的な呼び名でありますが「staticおじさん事件」というのがあり、左記のリンク先にある結論が面白かったのでこのような呼び方をした次第です。
現状は「オブジェクト指向プログラミング言語」というカテゴリのプログラミング言語がほとんどです。よく「オブジェクト指向」とか「手続き型」とか「関数型」とか言いますが、どれもこれも書き方を間違えれば「カオス化」するという事です※上記のリンク先参照。
クラスとオブジェクト
クラスの書き方をしたのように図にして見ました。ズバリUMLになります。
「オブジェクト指向ってなによ?」という疑問がはじめに出てくると思います。諸説ありますが。。。
早い話が
「プログラムの資源を現実にあるモノ(オブジェクト)と同じように扱う(考える)ためのコードの書き方(考え方)」です。
いろんな人がいろいろなことを言うので混乱すると思いますが、下のUMLのクラス図ように「クラスというハコを使ってプログラムを考えましょうよ」というのが「オブジェクト指向」という考え方の基本になります。※筆者の解釈なので自分で考えて、イメージをつけるようにしてください。
ちなみに、「クラス」をインスタンス化すると「オブジェクト」になります。
プログラムコードで書くならば下のようになります。
下のコードでは、上記の人間クラスを具体的なプログラムコードにしてみました。この「Humanクラス」を使用するときにはメインメソッドで実行します。
この「クラス」を「new」するとクラスはオブジェクトを生成します。このときに生成されたオブジェクトには必ず「フィールド変数の値を持っています」
ここがクラスとオブジェクトの大きな違いです。
このようにクラスを使用すれば、一つのクラスを定義すれば
- 引数なしで「new」すると名前がTakunojiになります。
- 引数ありで「new」すると年齢と名前、体重を指定した「誰か」になります。
明確に言うのであれば
「クラス」というテンプレートを用意して、「new」することで、実際に値をセット(テンプレートに書き込んだ)オブジェクトが生成されるということです。
<人間クラスのプログラムコード>
public class Human {
/** 年齢 */
private int age;
/** 名前 */
private String name;
/** 体重 */
private double weight;
/** コンストラクタ */
public Human() {
this.age = 43;
this.name = "Takunoji";
this.weight = 60;
}
/** コンストラクタ:オーバーライド */
public Human(int age, String name, int weight) {
this.age = age;
this.name = name;
this.weight = weight;
}
/** 挨拶 */
public void greet() {
System.out.println("私の名前は、" + this.name + "です。" + this.age + "歳です。");
}
}
<クラスのインスタンス化などの解説>
具体的に
プログラムを眺めてみると、1つのファイルに1000行を超える様なデカイ、ファイルになっているものがあったりします。申し訳ないがこういうプログラムは「オブジェクト指向」していません。何故か?再利用出来ないからです。
つまり、「オブジェクト指向」とか、いろんなことを言っても「きれい」で「再利用できる」かつ「わかりやすい」コードが「良いコード」ということです。上のような「オブジェクト指向していません」という言葉は「良いコードでない」という意味です。※筆者も不適当な使い方をしていたみたいです。。。すいません。。。
まずは概念
プログラムの動きは、目に見えないので大雑把な概念からイメージの輪郭を拾います。この概念を理解するのにわかりやすいのがUMLだと思うのでUMLのクラス図を例に出したいと思います。
UMLの細かい部分に関しては下のリンクを参照下さい。
UMLツール Star UML〜ユースケース図を書いて見た〜
Java言語の基本単位
Java言語の場合、プログラムの基本単位はクラスです。もっと言うと、全てがクラスで表現されます。だからオブジェクト=クラスで考えて良いです。
明確に言うならば、「new」する前と後で、それぞれ「クラス」か「オブジェクト」かの違いになるので、「new」しないで考えるなら「クラス」「new」した後で考えるなら「オブジェクト」ですが、「new」した後で考えるときはデータクラスを考えるときがほとんどなので、あまり区別しなくても問題ありません。
ただし、先ほども申し上げたように「new」する前と後ではちょっと注意が必要です。
下の動画は、クマ(のような)が葉っぱを食べるのですが、Java言語でできているので葉っぱも、クマ(のような)もすべてオブジェクトです。
クマ(のような)はインスタンスが一つ=オブジェクトが一つですが、葉っぱは複数あります。画面に表示された状態が「new」した後です。
<Greenfoot>
上のリンクは、UMLのユースケース図について記載しています。そして、クラス図の書き方も隣のリンクに記載しました。
早い話が、プログラムをどのように使うか?(ユースケース)とどんな構成で作るか?(クラス図)を絵にしたものがUMLです。
準備
オブジェクト指向プログラミングの準備として、どんなクラス構成でやるか?(プログラム・デザイン)を考えます。こんなデザイン(設計)、あんなデザイン…と最も美しい(効率の良い)デザイン(設計)をやります。もちろん「完璧なデザイン(設計)」は存在しないので、現時点での最高のもので良いと思います。
実装
準備の段階で作成したデザイン(設計)を元にコーディングを行います。
今回は、メインメソッドを整理した状態で再実装(リファクタリング)します。注意点は以下の通り。
- 作成したオブジェクトは再利用出来るように作る
- 各オブジェクト間の依存関係を分断してやる。なるべく「このクラスを使う時はあのクラスも必要…」とならない様にする
あとは「リーダブルコード」を読みましょう(笑)
おススメです。
コーディング開始
とは言っても、即コードを書くわけではありません。まずはコードを眺めます。そして、前回作成したメインメソッドを全体の流れとして考えます。
- 無限ループを作る
- プロパティファイルから値を取得
- 値が取得できない時は初めの実装の処理
- byeコマンドでコマンドリストを出力しアプリ終了
この部分はメインメソッドで実装してます。
## 本題
オブジェクト=クラスの構成と使い方に関しては、下のリンクに記載しているので。。。
自作クラスの使い方(呼びたし方について記載します。
まずはしまめに、『クラスを使用する時にはまず「new」します。』という考えを捨てて下さい。必要なので「new」するという事です。
new演算子
クラスをインスタンス化するのはクラスに初期化処理が必要で、同じクラスを複数人で使用したい時など、クラスをnewします。
<例>
サーバーにユーザがアクセス、ログインした場合、LoginUserクラスをインスタンス化しない場合、LoginUserクラスはずっとユーザデータがセットされないので、クラスと言う型が存在しているだけになります。
しかし、インスタンス化してやるとユーザデータがセットされ1つのインスタンスとして存在できるので、サーバーのメモリが許す限り、ログインしたユーザを識別する事が出来ます。
まとめ
大雑把で良いので「クラス」「オブジェクト」という概念に対する偏見(ないのがベスト!)を捨てることができれば、おっけ!です。次回からは実際のコードと実行結果などを見ながら学んでいきたいと思います。
でわでわ。。。
<<< [前回](https://zenryokuservice.com/wp/2019/08/12/java-mid-basic-%e3%80%9clv2_7_java%e3%81%ae%e5%9f%ba%e6%9c%ac%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e8%aa%ad%e3%82%80%e3%82%b2%e3%83%bc%e3%83%a0%e3%83%ab%e3%83%bc%e3%83%97%e4%bb%98%e3%81%8d/) [次回](https://zenryokuservice.com/wp/2019/08/24/java-mid-basic-%e3%80%9clv3_2_java%e3%81%ae%e5%9f%ba%e6%9c%ac%e3%83%aa%e3%83%95%e3%82%a1%e3%82%af%e3%82%bf%e3%83%aa%e3%83%b3%e3%82%b0lv2%e3%82%b2%e3%83%bc%e3%83%a0%e3%83%ab%e3%83%bc%e3%83%97/) >>>