ゆるこあプログラミング

新卒社員がプログラミングとたたかう

Perlにおけるクラスメソッドとインスタンスメソッドの違い

オブジェクト指向,面倒ですよね.

学生時代はProcessingを手続き型で書く程度だったので
未だによくわかってません

そして,オブジェクト指向ではないPerlならではの
独自的な用語が用いられるため,ほんとさっぱりです.

一般的なOOP Perl 別名
クラス パッケージ -
メソッド サブルーチン -
インスタンス データ構造 オブジェクト

とんでもなくややこしいですね…

以下はメモなのでこの記事は参考になりません

クラスとインスタンス

ざっくりとした概念

クラスとインスタンスって
オブジェクト指向をするときに大切なことばです

このオブジェクトってなんだろ?


とても大雑把に言い切ってしまうと
いろんな物体はオブジェクトと言っちゃえます⑅රωර⑅

猫もオブジェクト,犬もオブジェクト,
たまもオブジェクト,ポチもオブジェクト.

合ってるのかな.笑


そいで,話をもとに戻すと
このオブジェクトには
クラスインスタンスって概念があります.

で,それってなんだろう

そもそもクラスとインスタンスってなんでしょうか.
一般的には,よくクラスは概念でインスタンスは実体と言います.

なんのこっちゃ.

猫はクラス
黒猫はインスタンス
馬はクラス
ディープインパクトインスタンス

馬の例えが古い・ω・………

つまり インスタンスって
クラスを実際に操作して,具体的な値をはめ込んだもの.

クラスは箱に過ぎなくて
それをがっちゃんこしてひとつの実体にしてあげます.

たとえば猫だったら
毛の長さとか眼の色とかを定義してあげる

ってことですにゃー(=′ᴗ'=)


よしよし,ざっくりと分かった気がします.

もう少し具体的に考えて行きましょ.

コードにおけるクラスとインスタンス

かんたんなコードです!!

package A;

my $obj = B->new;
my $result = $obj->keep_cat('mike');

1;


package B;

sub keep_cat {
  my ($self, $name);
  print "the cat name is $name";
}

sub new {
  my ($class, $args);
  bless($args, $class);
}

1;

このプログラムにおいて,クラスを宣言しているのは

package A;
package B;

この部分です.
Perlではよく「パッケージ」といいますが
これがそのままクラス名になります.

Perlはクラス宣言に何か明確なものが必要ではなく
メソッドが押しこんであるパッケージ=クラス です

ちなみに
ファイル名も「A.pm」とかにしないと
動かなかったような気がします

_(┐「ε:)_<どうだっけ?




このパッケージ内のデータ構造を
他のオブジェクト指向言語では「オブジェクト」と呼んでます.
さっきもでてきましたね.


ではインスタンスはどれかっていうと
その前にコンストラクタを見つけましょう.

Perlコンストラクタを通してblessというものをしなければ
オブジェクトにすることができません.

sub new {
  my ($class, $args);
  bless($args, $class);
}

この,newと名付けられたメソッドを
一般的にコンストラクタと呼びます.

別にnewって名前じゃなくてもいーんですが
慣習です慣習.
プログラミングの慣習には従っておきましょう.

クラスAにおいて

my $obj = B->new;

こう表記することで,
クラスBにblessされたオブジェクトが生成されます.


では実際に
そのオブジェクトを使ってみましょう.

my $result = $obj->keep_cat('mike');

第一引数にインスタンス$objを渡してます.
これが呼ぶメソッドは,$objが紐付いたクラスBにある

sub keep_cat {
  my ($self, $name);
  print "the cat name is $name";
}

これですね.
$selfには第一引数のインスタンス$obj,
$nameには'mike'がはいっています.




コード動かないかも.