先日プログラミングスクールを卒業し、面接に向けて自分のやってきたことの棚卸し・曖昧にしていた所の学習をしている者です。間違いあればどんどんご指摘下さい。お願い致します。
参考にさせて頂いたlink
Rubyのオブジェクト指向におけるカプセル化について
オブジェクト指向と10年戦ってわかったこと
Ruby入門 オブジェクト指向
やはりお前らのコンポジションは間違っている
オブジェクト指向言語とは
現実世界のモノを1つの(例)CarClass(設計図)として定義し、それを基にinstance(実体)を生成・操作することで変更に強いプラグラムを書ける言語・・・だと思っていたのですが、どうやらそれだけじゃないみたい。
オブジェクト指向言語の3大要素
①カプセル化
②継承
③ポリフォーリズム
カプセル化とは
カプセル化とはオブジェクトの状態や機能(インスタンス変数やメソッド)を、他のオブジェクトからアクセスできないようにすること
これはつまり、あるclassの外から当該classのinstanceに何か操作を加える際、当該classにて予め加えたい操作を行うmethodを書かない限りは、その操作を行うことが出来ないということを指しているのではないかと思う。
Ruby入門 オブジェクト指向
このサイトの運営者はカプセル化の説明の中でこうも言っている。
「オブジェクトは自分が今どういう状態であるか, という情報をインスタンス変数に記憶している, と言えます. そのため, 勝手にその状態を他人に変えられたら困るので, インスタンス変数はクラス内部のメソッドの中でしか値を書き換えることができません」
オブジェクト指向と10年戦ってわかったこと
一方この記事においては「カプセル化とは無駄を省き洗練させてわかりやすいものを作るということ」
としており、記事内のエレベーターの例を見る限りは、
「余分な機能(method)を定義することはプログラムを複雑なものにするだけでなく、時に事故を起こす原因になる。だから触らせたくない機能(method)は定義しない(外からは触らせない)」
ということを意味しているのではないかと思う。
この説明には設計思想(?)的なものを感じた。
カプセル化の利点
methodで定義されていなければ(もしくはattr_reader :"culum"等のアクセサメソッドを定義しなければ)、不必要な操作が加わらないので、安定的。
もし外から予期せぬ変更を加えられるとしたら(メソッドの中身を操作とか)、正常に動かなくなる可能性がありますから、不安定な要素が入りにくい設計なのは大きな利点と言えそう。
継承
classは別のclassと親子関係になれます。そして親子関係になると子は親classの中で定義されたメソッドが使えるようになります。これによって複数のmethodを組み合わせた複雑なmethodが短文で作れたりします。
ただ
やはりお前らのコンポジションは間違っている
オブジェクト指向と10年戦ってわかったこと
この2つの記事で紹介されているオブジェクトコンポジションという考え方を含めると継承にはもっと本質的な意味がある気がしてきます。
先述の自分の説明だと単に一度定義したメソッドを色んなclassで使い回すことが出来て、再利用性が高いので良いみたいになっていますが、「1つのオブジェクト(コンポジション)は複数のパーツによって出来ている、そのパーツ毎に出来ることだけを定義して最終的に組み合わせるという方法を取れば、部分的な変更を加えた時にエラーが起きにくいコンポジション(合成集約)になる。」というのが本質なのではないでしょうか。
またこれが単一責任の原則(1つのクラスに1つの役割(機能))というオブジェクト指向の設計思想に深く絡んでいる気がします。
ポリモーフィズム
ポリモーフィズムとは多様性とも言われ、3つの種類に分けられる
①アドホック多相
プログラミングにおける各要素に型による制限を付けないことを表す。
手続き型言語において、date型をstringに、integer型をstringに変換する関数はそれぞれ一意的だが、オブジェクト指向言語におけるポリモーフィズムとは、より上位の抽象概念を対象にすることで、A型をB型に変えるではなく、あらゆる型をB型に変えるのように多意的な関数の使い方ができる性質をさす。
②パラメータ多相
特別、型宣言をしなくてもvalueから型を推測してくれるという性質
③部分型付け
これは継承のことを指しているようです。