まだ実践で開発したことがない人や本でプログラミングを勉強した人にとってオブジェクト指向がわからないと思います。
プログラミングの本ではいきなり抽象化しますとか、継承しますって表記されているのでわかるはずないです。
抽象化とか継承って普段話の中であまり使わない単語だから理解を難しくしています。
なんでこういった表記になるのかと言われると抽象化や継承に当てはまる適当な日本語の単語がなかったから、日本語に当てはめたときに混乱するような単語になったと言わざる得ません。
なので今回はオブジェクト指向の概念をわかりやすく書いていきたいと思います。
オブジェクト指向に必要な知識は実はそんなに多くない
オブジェクト指向を理解するためにはクラスとメソッドは覚えて置かないとなりません。
ですが、クラスもメソッドも初心者の方にとってはどこまでがクラスにすべきで、どこまでをメソッドにすべきかということは難しく慣れてない場合1ファイルの1クラスに全部の機能が固まっている可能すらありますね。
もちろん今はそれほど悪いことではありませんが、問題を切り分ける時に1つのファイルに書いていたのであれば苦労します。
なので復習の意味もこめたクラスとメソッドの違いをおさらいしておきます。
オブジェクト指向に必要な知識はクラスとメソッドor関数の違い
オブジェクト指向のプログラミングを習得するときに必要な最低限の知識は、クラスとメソッドの違いです。
※メソッドはプログラミング言語によっては関数とも言いますので、メソッドも関数も同じ意味として扱います。
基本的にプログラミングを書くときクラスとは、1つの機能単位で書きます。
メソッドは1つの処理の単位で書きます。
クラスとメソッドのプログラミング方法(実例)
車の操作をプログラミングで実現するとします。
そうすると、最低限必要な機能を以下のようにまとめられます。
- 前進する機能
- 後退する機能
これが最低限の車を動かす機能ですね。次のもっと細かい機能について考えましょう。
- 前進している時に、カーナビでテレビを見れなくなる機能
- 後退している時に、カーナビをバックモニターに切り替える機能
とか他にもいっぱいありますが、わかりやすい2つの機能をあげてみました。
車を前進させたり、車を後退させる機能は一番大きいのでクラスにします。
そして前進している時にカーナビが見れなくなる機能というのは、前進する機能の中に入っていますのでこれをメソッドにします。
車が後退しているときにカーナビをバックモニターに切り替える機能も車を後退させる機能であることからメソッドにしましょう。
すごくざっくり説明しましたがこういった形で決めていきます。クラスやメソッドは人間が後から見てわかりやすいことが大事です。
オブジェクト指向の用語はいったん忘れる
オブジェクト指向の理解を難しいものにしていることの1つに言葉がわかりずらいことがあります。
インスタンスとかインスタン生成とか継承とかインタフェースやポリモーフィズムとか・・・。
正直こんな単語並べられるとわかりずらいです。
なのでここでは技術書に書いてある言葉や概念を一旦忘れてください。(と言っても難しいとは思いますが)
世界一わかりやすいオブジェクト指向の概念を説明
ゲームの制作を通してオブジェクト指向を解説します。
ゲームを通して理解するオブジェクト指向講座
プログラミングをしようとしている人はテレビゲームをしたことがある人がほとんどだと思います。
どのゲームにもコントローラーがあると思いますが、コントローラーの十字キーの右を押せばキャラクターが右に移動しますし左のキーを押せば左に移動します。
これって当たり前って思うかもしれませんが、ゲーム開発会社が各社標準仕様としてユーザーが戸惑わないためにもわかりやすく作ってます。
このキャラクターの左右の移動を各社ゲームを制作するたびに毎回プログラミングを書いていると思いますか?
多くの開発会社では、1度作ったものを何度も作っていると思います。そしてゲームやキャラクターによってのスピードは変数を渡してあげて可変に調整可能にしているはずです。
例えば、上の図のような勇者と馬を動かすゲームを作成するとします。
これを動かす時の流れはこうなります。
- 十字キーが押された
- キャラクターがキャラクターを動かすクラスを呼び出し
- キャラクターはキャラクターのパラメーターを確認する
- キャラクター移動
このような流れになります。今回はわかりやすいように書きましたが、実際はキャラクターが動くロジックは人間も馬も一緒でキャラクターの移動クラスというものが作成されていると想像がつきます。
このキャラクターを動かすクラスをキャラクターが5体ぐらいまでなら作れるかもしれませんが、大きなゲームでキャラクターが100体あった場合どうでしょうか?
ゲーム制作会社の人はプログラミングを作っている間は家に帰れないかもしれません。
プログラムの再利用を高めたのがオブジェクト指向の概念です。
次章でもっと深掘りして解説します。
オブジェクト指向プログラミングとは簡単
さきほどの説明でオブジェクト指向とはプログラミングの再利用を高めたものだと理解していただけかと思います。
オブジェクト指向プログラミングでの他のクラスを使う必要性
プログラミングをしていると、同じようなコードを書くことが多いです。
車のプログラミングをするなら、前進後進は全ての車に必要ですし、ゲームならキャラクターの移動も全ゲームに共通することでしょう。
基礎となるプログラムを趣味であれば毎回書いても問題ありませんが、仕事であると上司に怒られます。
そういった時にプログラムを再利用する必要があります。そういった時に共通で使えるクラスが必要になってきます。
そこで毎回コピペしてクラスの中に処理を入れることもできますが、そういった書き方は好ましくありません。理由はいくつかあります。
- クラスの中に処理が多くなってプログラムがみにくい
- 動かなかったときに、何が動かないか切り分けが難しい
- 新しい機能をつけたい時にプログラムをいじることが難しい
多くはこの3つが考えられます。
こういった問題を解決しようと思ったときにクラスのインスタンスの生成が必要になってきます。
オブジェクト指向プログラミングは他のクラスの使い方がわれば制覇です
ながながと説明してきましたが、オブジェクト思考は他のクラスを使うためにすることに尽きます。
他のクラスを使う重要性がわかってくれば、カプセル化やアクセス修飾子も芋づる式にわかってきます。
もう一度さらに踏み込んだ共通クラスのあり方を説明します。
キャラクター移動クラスは、人間にも馬にも敵Aにも敵Bにも適応できます。
そうすると人間移動クラス、馬移動クラス、敵A移動クラス、敵B移動クラスを作成する手間を省けます。
人間クラスも、馬クラスも、敵Aクラスも敵Bクラスも全てキャラクター移動クラスを参照します。
そこで4つのクラスから参照されるキャラクター移動クラス、キャラクター移動の中のメソッドはprivateだとアクセスできません。publicにする必要があります。
それがアクセス修飾子の考え方です。
そう考えると、全てのクラスやメソッドがpublicでいいじゃないかと思いがちですが、それは好ましくありません。
なぜなら、意図していない他のクラスやメソッドからアクセスされた場合にはデータが書き換えられます。それがカプセル化です。
今回は以上です。