[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00485] Re: Java プログラマーのための Perl 入門 ?



えんどう様

おはようございます。大島です。

>Perlist はデータ構造から入る設計を嫌うのではないかと漠然と予想
>していましたが偏見でしょうか。
>  
>
どうなんでしょう。私は、Perl からプログラムをはじめたといっても
設計らしい考え方がわからなかったので、Java をはじめたような
ものなので、本格的 Perlist の方がどのような設計をしてこられたか
よくわかりません。すみません。。。(泣)

>私見ですがオブジェクト指向に最低限必須な要素は
>  
>

> 1.抽象データ型
> 2.型情報によるディスパッチ機構
>
>だと思っています。
>  
>

すみません。知識不足で、Java でいう 1.抽象データ型
と型情報によるディスパッチ機構というのがいまいちわからなかった
のですが、以下のような意味でしょうか。

1,抽象データ型→参照データ型
2,型情報によるディスパッチ機構→オブジェクト指向でいうポリモーフィズム

上記2点だったら Perl でもサポートされています。
たとえば、1だったら以下のような感じになるんでしょうか。


$ cat Test.java
public class Test {
public static void main(String args[]) {
Honyurui h = new Honyurui(30, 2);
h.run();
h.eat();
System.out.println("weight:"+h.getWeight()+" height:"+h.getHeight());
}
}

class Honyurui {
private int weight;
private int height;

public Honyurui(int weight, int height) {
this.weight = weight;
this.height = height;
}

public void run() {
System.out.println("This is running");
}

public void eat() {
System.out.println("This is eating");
}

public int getWeight() {
return weight;
}

public int getHeight() {
return height;
}

}
$ java Test
This is running
This is eating
weight:30 height:2
$
$ cat test.pl
#!/usr/bin/perl

use strict; # 変数の有効範囲を明確にしなければ動作しないようにする

# Test.java の main() に匹敵する部分

my $h = Honyurui->new(30, 5);
$h->run();
$h->eat();
print "weight:". $h->getWeight() . "height:". $h->getHeight() . "\n";



package Honyurui; # Java の クラス宣言に匹敵するもの

sub new() { # コンストラクタ
(my $class, my @args) = @_; # @_ はこの new() に渡された引数が格納されている
my $self = {"_weight"=>$args[0], "_height"=>$args[1] };
bless $self, $class; # $class に $self を結びつける
}

sub run() {
print "This is running\n";
}

sub eat() {
print "This is eating\n";
}

sub getWeight() {
my $self = shift;
return $self->{_weight};
}

sub getHeight() {
my $self = shift;
return $self->{_height};
}


$ ./test.pl
This is running
This is eating
weight:30height:5
$

こんな感じになります。ようするに、Perl がオブジェクト文法のサポートは
bless 関数によって、変数とクラスを結びつけることにあります。
ここでコンストラクタは new にしていますが、名前はなんでもいいんです。
要するに bless 関数で変数とクラスを結びつけているのがコンストラクターに
なります。
(ここにまたなんでもありの Perl っぽさが。。。。。)

あと、Perl には、public, protected, private という修飾子もないので
public にしたくない変数やメソッドには _ をつけるなどしてプログラマーみず
からが
「これは public じゃないぞ」と決めてプログラミングをする必要があるようです。


2 の「ポリモーフィズム」ですが、Java との大きな違いは多重継承がサポート
されている
ことです。

Perl のオブジェクト指向の文法は、オライリーのラクダ本の Vol1 のほうに
のっているので
難しいものではないのですぐわかると思います。


>オブジェクトの「責務」を考えて設計して行けば良いのだと思います。
>  
>

設計はこれからの課題です。がんばります。

>  
>
>>いい加減な書き方でもある程度ことは動いてしまうので、ある程度大規模に
>>なったときにわけがわからなくなることだと思います。
>>    
>>
>
>これが怖いのであまり書きたくなかったのでした。
>  
>

Java の場合、コンパイラではねられますが、Perl の場合、プログラマー自信が
自分を
縛って行かないととんでもないことになるんですよね。。

>
>
> http://perl.infoware.ne.jp/
>
>こちらでしょうか...
>  
>

そうです!

以上です。宜しくお願いいたいます。