今携わっているアプリの規模が大きくなってきたので、最近はクラスの分割をするようになってきました。
そこで「色々考えて分割はしているんだけどイマイチ何が正しいか分からない」って状態だったので答えを出す助けになりそうなオブジェクト指向についてちゃんと調べてみる事にしました。
オブジェクト指向とは何か
オブジェクト指向(オブジェクトしこう)とは、オブジェクト同士の相互作用として、システムの振る舞いをとらえる考え方である。
上がWikipediaからの抜粋。
オブジェクト指向とはシステムに関する考え方の事らしいです。
オブジェクト指向とはどんな考え方か
それじゃあ実際にオブジェクト指向ってどんな考え方かを調べてみました。
また、プログラミングのレベル (プログラミングパラダイム) では、プログラムの実行の流れを決められた制御構造の組み合わせとして書き下す構造化プログラミングや、カプセル化を促すモジュールプログラミング、多態に対応するデータ指向プログラミングという技法が存在していた。オブジェクト指向手法はそれらを一般化しさらに推し進めたものであるという考え方がある。
再度Wikipediaからの抜粋です。
オブジェクト指向は「構造化プログラミング」や「カプセル化」等の様々な手法の集合のようです。
ここを見る限りオブジェクト指向は考え方というよりは手法の集合と言ったほうがわかりやすそうです。
オブジェクト指向プログラミング
オブジェクト指向についてぼんやり分かってきたので具体的にどうプログラミングに活かせば良いかを見ていきます。
オブジェクト指向プログラミングの具体的な定義を見ながらどういう書き方をすればいいかを見ていきます。
オブジェクト指向プログラミングですが以下の特徴を活用したプログラミングの事を指すことが多いようです。
それぞれ掘り下げていきます。
- カプセル化(振る舞いの隠蔽とデータ隠蔽)
- インヘリタンス(継承) -- クラスベースの言語
- ポリモフィズム(多態性、多相性) -- 型付きの言語
- ダイナミックバインディング(動的束縛) -- 動的型付言語
カプセル化(振る舞いの隠蔽とデータ隠蔽)
カプセル化とはプロパティーやメソッドを隠蔽することで安全なクラスを作れるものです。
要するになんでもかんでもpublicにすると変数に予期せぬ値が入ったり、内部の仕様を変えた時の変更箇所が多くなるから公開不要なものは極力privateにするというもの考え方です。
それじゃあどういうメソッドを公開すればいいか、という事なんですがメソッド設計周りを追求していくと話が大きくなりそうなので後日調べてみようと思います。
インヘリタンス(継承) -- クラスベースの言語
継承(けいしょう、inheritance:インヘリタンス)とはオブジェクト指向を構成する概念の一つである。あるオブジェクトが他のオブジェクトの特性を引き継ぐ場合、両者の間に「継承関係」があると言われる。
上はWikipediaからの引用です。
継承はよく使われる機能で、使うメリットとしてはクラスの機能や構造を再利用できる事です。
しかし共通化したいからと安易に継承をすると見通しが悪いコードになりがちです。
その辺り(クラスの設計)については後日調べてみます。
ポリモフィズム(多態性、多相性) -- 型付きの言語
ポリモーフィズムあるいはポリモルフィズム(Polymorphism)とは、プログラミング言語の型システムの性質を表すもので、プログラミング言語の各要素(定数、変数、式、オブジェクト、関数、メソッドなど)についてそれらが複数の型に属することを許すという性質を指す
上はWikipediaの引用です。
こちらによるとポリモフィズムとは変数やオブジェクトやメソッドが複数の型に属する事を許す事を示すようです。
具体的に複数の型に属するとはどういう事かを深掘りします。
string = number.StringValue string = date.StringValue
Wikipediaによると上も多態性によるもののようです。
numberとdateという別の型がStringValueという同名のメソッドを持てる事も多態性のおかげです。
多態性は継承やインターフェースと一緒に話される事が多いですが、それらとは関係なしにある性質のようです。
ダイナミックバインディング(動的束縛) -- 動的型付言語
Wikipediaによると動的型付けとも呼ばれ、処理実行時まで型が分からないという性質の事を言います。
つまりRubyやPerlは動的型付けを持っていて、SwiftやJavaは動的型付けを持っていない(静的型付けを持っている)と言えそうです。
動的束縛の性質を持っているとポリモフィズムをより有効活用できます。
具体的には、下のような例が挙げられます。
numberとdateという全く違うクラスをGetStringValueメソッドの引数に渡していますが、どちらもStringValueを持っているので実行されます。
静的束縛を持つ言語で同じ事をしようとする場合、dateとnumberに共通のインターフェースや親クラスを持たせる必要が出てきてしまいます。
function GetStringValue(value) { value.StringValue } string = stringValue(number) string = stringValue(date)
まとめ
最初の目的である「クラスの設計を学びたい」という事からは逸れましたが非常に勉強になりました。
特に多態性はなんとなくの理解しかなかったので、今回の勉強で定義が分かってすっきりしました。
次は具体的にクラスの設計をどうすればいいか・メソッドの設計をどうすればいいかを考えてみようと思います。
参考URL
オブジェクト指向 - Wikipedia
オブジェクト指向プログラミング - Wikipedia
【Java】 カプセル化って何? | 一番かんたんなJava入門
http://www.sophia-it.com/content/%E5%A4%9A%E6%85%8B%E6%80%A7