コンストラクタ

コンストラクタって難しいけど、ここに手を出さなきゃプログラムの意味がない!
てなわけで、やってみることにしました!!!
いよいよ近づいてきました、オブジェクト指向!!!
姿を現し始めましたよ。検索していると、あちこちから「オブジェクト」という
名前が。
こわいなぁ。。。。

ひとまずコンストラクタについて勉強することにします。

まずコンストラクタとは?
「与えられたクラスのオブジェクトを生成する特別なサブルーチンです」
「newで呼び出すのが習慣です。」

?????ちんぷんかんぷんです。でもどうやら、オブジェクト指向には
かかせない様子。続いて読んでみます。

基本的なコンストラクタ(newサブルーチン)の形式

  • 新しいオブジェクトの変数を初期化する。例えば、$selfに無名ハッシュをセットする
  • オブジェクトのすべてのデータを初期化する。各属性に値やundef値を格納する
  • blessコマンドでオブジェクトをブレスする。
  • オブジェクトを返す

だ、そうです。ちんぷんかんぷんです。

ということで、実際にやってみた方が早そうなのでとりあえずやってみることに
しましょう。

Try1
###コンストラクタ作成

  • Mugiwara.pm
sub new{

newという名前でサブルーチンを作ります。どうやらこれがコンストラクタになる
らしいですね。

my $class = shift;

newの第一引数としてクラス名が渡されることが決まりなので、shiftを使って受け
とります。これは決まりなので必ず書きます。

my $self = {
	name => $op{name}
};  

でました、「無名ハッシュのリファレンス」とやらですね。
my $self = {};でいいみたいです。ただし、属性を設定する場合は、ここで、
name=>$op{name}
といった感じで定義するといいみたいです。
要するに、かわるであろうと思われる変数をここでセットしなさいよ、ってこと。
私は%連想配列を使ってみました。$でも、@でもかまいません。

return bless $self,$class;

「ブレスする」とやらですな!これは、$self(無名ハッシュとやら)と、$class(クラス名)
を、「返す」っていうこと。myで呼ばれたとこに返すってことなのかなぁ??
よくわからないですが、ひとまずこれも決まり事なので書きます。

これがだいたいの流れのようです。

では、次にsyori.plの方に処理を書きます。

  • syori.pl
use Mugiwara;

まず、モジュールの方を読み込みます。

my $obj = new Mugiwara(name => 'robin');

これは、$objという変数に右の結果を代入中です。
Mugiwaraモジュールの、newサブルーチンの、name属性を「robin」にしなさい!

ということになります。

my $value = $obj->main();

これが、サブルーチンの呼び出し方になります。
サブルーチン同様、引数を渡して結果を受け取ることだってできます!

$obj->main();

mainサブルーチンを呼び出しています。

$value = $obj->method1(10, 100);

引数を渡すときはこんな感じです。
そして最後に、

print $value;

表示して完了!!!

さて、結果を見てみましょう。

結果1
あれ?エラーです!!!
失敗。。。。
変数の宣言エラーがでてしまいました。

ということで、
my $class = shift;
の後に、
my %op;
と入れてみます。

結果2

ruffy,zoro,nami,usoppu,sanji,tyopper

エラーは消えましたが、ロビンいませんね。。。。
なんでだろう?と考えていましたが、発見!!!

そうか、データを受け渡してもらわないと当然表示されませんよね。
ということで、

my %op;
を、
my %op = @_;

と書き換えました。

結果3

ruffy,zoro,nami,usoppu,sanji,tyopperrobin

できたできた!できました〜♪♪

これでなんとかコンストラクタの基礎の基礎の基礎はクリアーなようです♪

MEMO

  • syori.pl
#!/usr/bin/perl
use strict;
use Mugiwara;  #モジュール読み込み


my $obj = new Mugiwara(name => 'robin'); #変数セット

my $value = $obj->main(); #サブルーチン呼び出し
print $value; 

  • Mugiwara.pm
package Mugiwara;

use strict;

use vars qw($VERSION);
$VERSION = 1.00;



#コンストラクタ######################################

sub new{
	my $class = shift;   #第一引数を受け取る
	my %op = @_; #データ引き渡し
	my $self = {     	#無名ハッシュのリファレンス
		name => $op{name}  #属性の設定
	};  
	
	
	return bless $self,$class; #ブレスする
}
#####################################################


#処理

sub main {
	my $self = shift; #必ず全てのサブルーチンに書く
	my @onepiece2 = $self->eastblue(); #自分のモジュールの中のサブルーチン
なので、$self->で呼び出す事
	$self->grandline(@onepiece2);
}

sub eastblue{
	my $self = shift;
	my @onepiece = ("ruffy,zoro,nami,usoppu,sanji,tyopper");
	return @onepiece;
}

sub grandline{
	my $self = shift;
	my @onepiece3 = @_;
	push(@onepiece3,$self->{name});  #syori.plから受け取った
引数を海賊団の配列へセットする
	print @onepiece3;
}


1; #忘れずに!