2006 年 4 月 3 日 23 時 59 分

題材


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


さて、これからプロパティについて考えていくので、
その題材となるクラスを考えよう。

今回は、Employee オブジェクトを作る。
Employee = 従業員だ。プログラミングのサンプルとして、
どこにでも出てきそうな名前だ。

Employee というオブジェクトは、以下の属性を持つ。

・名前
・性別
・体重
・給料

後々これを使って色々やるつもりなので、
なんで体重やねん。というつっこみはなしで。

さて、上を元にオブジェクトを作ってみよう。

my $jack = {
    'name'  => 'Jack',
    'gender' => 'male',
    'salary' => 160000,
    'weight' => '65kg',
};

完成。……文句を言ってはいけない。

連想配列(ハッシュ)は、非常に汎用化されたクラスであり、
そのインスタンスとして従業員を定義することもできるのだ。
Perl においては、ハッシュが組み込み型となっているが、
その他の言語では、通常はクラスであることが多い。

ただ、組み込み型を使うのはサボりすぎなんで、
モジュールとしての枠組みを被せることにしよう。

========== Employee.pm ==========

package Employee;

use v5.6.1;
use strict;
use warnings;

BEGIN {
    our $Version = '0.01';
}

sub new {
    my ($package, %identity) = @_;
    $package = (ref $package or $package or __PACKAGE__);
    bless(\%identity, $package);
}

1;

========== end of Employee.pm ==========

最も基本となるパッケージである。
今回は、単に引数のハッシュを取り、
そのコピーを bless してオブジェクトにしている。

テストしてみよう。

========== EmployeeTest.pl ==========
#!/usr/local/bin/perl

use lib '.';
use Employee;

my $jack = Employee->new(
    'name'  => 'Jack',
    'gender' => 'male',
    'salary' => 160000,
    'weight' => '65kg',
);

print "Package: ", ref($jack), "\n";
print "Name: $jack->{'name'}\n";
$jack->{'name'} = 'Fake';
print "Name: $jack->{'name'}\n";

========== end of EmployeeTest.pl ==========

実行してみる。

$ ./EmployeeTest.pl
Package: Employee
Name: Jack
Name: Fake

どうだろう。ref 関数が返すのはパッケージ名。
$jack は確かに Employee のインスタンスだ。
しかし、アクセス方法はハッシュと変わらない。
なので、名前にも代入することができてしまうのだ。

この状態は、いわゆる public フィールドを使った実装、
もしくは、構造体と呼ばれるクラスである。
つまり、アクセス制限を持たないため、
外部から自由に操作できてしまうのだ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.