純粋なオブジェクト指向って?
Bài đăng này đã không được cập nhật trong 3 năm
いっぱしのrubyistになるためにrubyの勉強をはじめました。
rubyの勉強をしていたらrubyは純粋オブジェクト指向であるといので気になって調べてみました。
という事で、純粋じゃないオブジェクト指向を調べるとJavaがいい例みたいですね。
Javaはデータの型にプリミティブとオブジェクトがあるということ。 純粋じゃないオブジェクト指向はデータの型にオブジェクトでないものがあるということ
裏を返すと純粋なオブジェクト指向はデータの型が全てオブジェクトであるということです。
そこでふと、 ①プリミティブとオブジェクトの違いは何か? ②なぜデータ型が全て純粋なオブジェクトだと何がいいのか?
更に気になったので調べてみました。
①プリミティブとオブジェクトの違い データの保持の仕方を見てみると以下の違いがあることがわかりました。
・プリミティブ:スタック領域に値をとる。 ・オブジェクト:ヒープ領域にデータをとりスタック領域にはヒープ領域のデータがあるアドレスを保持する。
つまりメモリの管理方法が違うということがわかりました。
メモリの管理方法が変わってくると両方のデータを統一したクラスライブラリがつくれません。
ということは全てオブジェクトクラスなら任意のデータを入れるクラスライブラリを構築できるということです。
良い例でVectorクラスがあったので見てみることにしました。 Vectorクラスには任意のオブジェクトを配列に追加したり、インサートできるメソッドがあります。
見ての通り、このメソッドにはオブジェクトを引数にとることができます。この時に起こることをイメージしてみると以下のようになるのではないかと考えました。
オブジェクトのデータにアクセスする→そこに格納されているアドレスに飛ぶ→飛んだ先のアドレスに格納されているデータを追加する
javaではアドレスを操作することができないので確かめようがないんですが・・・(仕様書みたいのを読めばいいんですかね?)
つまりこれにプリミティブ型の変数の引数を渡してしまうと、おかしなことになってしまいます。Integerクラスがプリミティブのintだとアドレスの10番にあるデータを指してしまいますね・・・
これを阻止するためにJavaではStringクラスやIntegerクラスのようなラッパークラスを導入しているみたいです。
プリミティブがあると、とても分かりにくく使う人の気持ちを考えるRubyが純粋なオブジェクト指向を選択したのではないかと思いました。
全てのデータに対してメソッドを打ってるのは、なぜなら全てオブジェクトだから!!という意味がようやく分かりました。
このことでRubyの理解が少し深まったのではないかと思います。
※違っている部分がありましたらご指摘ください。
All rights reserved