オブジェクト指向について大雑把に纏める
最近オブジェクト指向ってなんですか?って聞かれて、いきなり「犬も人間もオブジェクトで座れって命令すると〜」
みたいな説明を始めてる人がいて困惑したから書いてみる。
オブジェクト指向ってなんだかんだ人に説明する事ってないし どうやって人に説明すればいいかわからなかったから大雑把に自分の中での理解をぶちまけてみた。
オブジェクト指向ができるまでのソフトウェア開発の歴史
そもそもハードが貧弱だった時代には数バイトのメモリなどを気にしながらソフトウェアを作っていたが、 ハードが強化されていった結果メモリ効率などよりも可読性や再利用性に重きがおかれるようになった。 (プログラムは書いてるより読んでる時間の方が長いよねというお話)
従来の手続き型手法で大規模のソフトウェアを構築しようとすると、 同じようなソースが大量にできあがったり、どのソースがどこにあるかわからなくなってしまうなどの問題があった。
そこで複雑さを回避するためにオブジェクト指向が生まれた。
オブジェクト指向ってなに?
ソフトウェアを作る際の部品化(クラス化)の考え方の事
オブジェクト指向の本質は?
現実世界の人・物・出来事をソフトウェアの世界に表す手法
部品化のルールは?
人・物・出来事の単位でクラスに分割する。
オブジェクト指向の三大要素
・継承
・多態性
カプセル化
予期せぬ変更がされぬようにオブジェクトのメンバを保護すること
他のプログラムから干渉されたくない物はきちんと保護しておこうよってお話。
基本的な定石
・フィールドは全てプライベート
・メソッドは全てパブリック
ちなみにJavaでアクセス修飾子をつけないと package private
になる。
継承
プログラムの再利用性を高めるために同じような処理をまとめること
例えばWindowsPCクラスとMacPCクラスがあったとして、両方のクラスに起動メソッドstartUpがついてるとする。
これはPCという親クラスを作成してあげてそこにstartUpメソッドを実装してあげれば、 それぞれのクラスで継承してあげれば同じソースを二回書かなくていいよねってやつ。
※言語によっては抽象クラスとかinterfaceとかの機能もある
多態性(ポリモーフィズム)
継承と同じくプログラムの再利用性を高めるためにある
クラスをあいまいに捉えさせるような手法
class PC // method getNameはあるが実装はされていない class Windows extends PC // method getNameをcallすると「Windows」と表示する class Mac extends PC // method getNameをcallすると「Mac」と表示する PC pcs = new PC[2]; pcs[0] = new WindowsPC(); pcs[1] = new MacPC(); for (PC pc : pcs) { pc.getName(); // 1. Windows, 2. Mac }
↑の例で行くとWindowsクラスもMacクラスもPCクラスを継承していて 親子関係だから元は両方PCクラスだよね。
だからPC型に両方代入できて、PC型が持っているgetNameを呼び出せるよっていう例。
本当にざっくりとだけど疲れたから以上。