fumihumiのブログ

プログラミングの備忘録

アクセスメソッドについて考えてみた

記事を書く経緯

先日知り合いから

クラスメソッド内でインスタンス変数使えないはずなのに…

クラスメソッド内でeach文で回してインスタンス変数つかうとエラーが起こらなくて謎い

という質問をもらいました。 ...。。o0O...そもそもそのコード汚いのではというのは抜きです、、、w

それを聞いて僕はすぐに解説ができなかったので備忘録的にまとめます。

 本記事の流れ

  1. そもそもクラス。インスタンスとはなにか
  2. クラスメソッド。インスタンスメソッド。 3 . アクセスメソッドの必要性 について言及していきたいと思います。あくまで個人の見解なので間違い等あれば指摘していただきたく思います。

 そもそもクラス。インスタンスとはなにか

クラス、インスタンスとは →クラスとは設計図であり。インスタンスはその設計図から生まれた物。 という記事をみかけますが、あまりに the 雑 ではありませんか!??w

まあ実際その一文が全てではあるものの正直プログラミングはじめてまもない頃これ見てもさっぱりですよね???

基本的にクラスとは。 設計図、雛形。枠組み。何かの土台となるもの、というような認識でよいと思っています。(最初はこのような理解のが入りやすいはず。)

インスタンスとは。 そのクラスの実態です。設計図から生成された実体となっています。 クラスは'モノ'として存在はしないですが、インスタンスは固有の'モノ'として存在し、認識することが可能です。

例にして考えて見ます
クルマの設計図というものは下記のようになると思います。
...........※(トラック等も含みます。)
 クルマの型番。クルマの形(普通自動車??大型?トラック?)。最大積載量。最大乗車人数。
ハンドルの位置。タイヤの個数。クルマの色。最大速度。重量。
といったような様々な情報をもっています。


この設計図を元に工場でクルマの生産が始まり。クルマが作られると。
レクサス LC (赤) 4人まで。排気量は〇〇
レクサス RC F (青)4人まで。排気量は〇〇
ホンダ フリード(シルバー)6人まで。排気量は〇〇

のようににクルマにはそれぞれの情報が存在しています。
このようなそのクルマ自身の固有の値をインスタンス変数と呼びます。

インスタンス変数とは。 インスタンス変数とはインスタンス自身が固有にもっている情報です。 クルマの色や、最高速度、車種といった情報が含まれます。

インスタンスに対して変数があれば当然クラスにも。クラス変数というモノが存在しています。 これはそのクラスにおいて使うことができる変数です。 先ほどの例でいうと、類型の生産したくるまの数を数えたりする際はクラス変数に数値を入れて管理したりすると楽にできますね! (クラス変数はCar class ではあまりいい用例がなさそうです。。。)

ここまでの情報を少し簡略化しながらソースコードにしてみると

gist58aef3c97db41bbe7f37470faf809ff9

クラスメソッド。インスタンスメソッド。

クラスメソッドとは。 →そのクラスに対し、何か操作を行うメソッドのこと。 今回の例だとクルマクラスに対して何か操作をするということになります。(具体例がなく申し訳ないです。)

インスタンスメソッドはインスタンスに利用することができ何か操作をおこなうこと インスタンスメソッドは、例えば、レクサスの平均速度を求めたり。速度メーターの累計を調べたりと。。そのインスタンスの何かについて調べる必要がある

アクセスメソッドの必要性

オブジェクト指向における”カプセル化”の概念と強く関係を持っています。 アクセスメソッドを利用してインスタンスのもっているインスタンス変数にアクセスを可能にすることで、そのインスタンス変数へのアクセス方法を1つに統一することができます。

> インスタンス変数の隠蔽
インスタンス変数は常にアクセサメソッドで包み、直接参照しないようににします。
(引用:オブジェクト指向設計実践ガイド p.46)

とあるように特にrubyではこのような手法を用います。 java等の言語においてはgetter/setter とよばれるアクセサメソッドを利用することが通例とされているようです

 本題

冒頭に記した通り、知り合いから

クラスメソッド内でインスタンス変数使えないはずなのに…

クラスメソッド内でeach文で回してインスタンス変数つかうとエラーが起こらなくて謎い

という質問をもらいました。 これはどういう構造だったのかというと

gist9b3495b3db6398f8ca507441ab30f363

このような感じのコードのsum_resultのような処理だったと思います。(多分。。) クラス変数によって配列でインスタンスを管理している状態。 配列の中身はインスタンスをもっているのでクラスメソッドであっても、 クラス変数がインスタンスを参照している故に、インスタンス変数、インスタンスメソッドへアクセスが可能ということになっていました。。。

まとめ

解説を求められると。うまく日本語にできないもどかしさからブログにまとめようと思い書き始めましたが、見返してみると うまくまとまってない。。。。。。。。。orz 文章構成をちゃんとかんがえてから着手したほうがいいですね。。

気が向いたらfixしていきます。もしきになる点等あればコメントしていただければ幸いです