58
Perl 6 オブジェクト指向 プログラミング YAPC::Asia TOKYO 2013 2013/09/21 risou

Perl 6 Object-Oliented Programming

  • Upload
    risou

  • View
    1.618

  • Download
    4

Embed Size (px)

DESCRIPTION

talk about Perl 6 and OOP at YAPC::Asia TOKYO 2013

Citation preview

Page 1: Perl 6 Object-Oliented Programming

Perl 6オブジェクト指向プログラミング

YAPC::Asia TOKYO 20132013/09/21risou

Page 2: Perl 6 Object-Oliented Programming

※注意ここでのPerl 6の説明は簡素化のため、厳密には正しくない表現も含まれます。

(もしくは私の間違いです)

Page 3: Perl 6 Object-Oliented Programming

お話する人

• risou ( @risou )• 職業プログラマではない• 普段は Java とか Haskell とか書いてます• たまに Perl 入学式にいたりいなかったり• 昨夜、銀歯がとれました

今喋ってるのはこんな人です。

Page 4: Perl 6 Object-Oliented Programming

本日のお題

• Perl 6 でオブジェクト指向プログラミング今日喋るのはこんなことです。

Page 5: Perl 6 Object-Oliented Programming

本日のお題

• Perl 6 でオブジェクト指向プログラミング今日喋るのはこんなことです。

もっと言うと……

• Perl でのオブジェクト指向• Perl 6 でのオブジェクト指向• Perl と Perl 6 の違いとかに間接的に言及するかも

Page 6: Perl 6 Object-Oliented Programming

オブジェクト指向

Page 7: Perl 6 Object-Oliented Programming

オブジェクト指向とは

• データの構造と振舞いをオブジェクトとして扱う• オブジェクト間でのメッセージのやりとりでシステムを構成する

• 様々なプログラミング言語がサポートしている• Smalltalk / C++ / Java / Perl / Ruby / ...

ご存知の方も多いかと思いますが……

Page 8: Perl 6 Object-Oliented Programming

オブジェクト指向の特徴

• カプセル化• ポリモーフィズム• 継承

オブジェクト指向の代表的な特徴をあげると……

※全てのオブジェクト指向言語が これらの特徴を備えているわけではない

Page 9: Perl 6 Object-Oliented Programming

Perl でオブジェクト指向

Page 10: Perl 6 Object-Oliented Programming

Perl でオブジェクト指向

package Classname;use strict;use warnings;

sub new { my ($class) = @_; return bless { field => $field, }, $class;}

Page 11: Perl 6 Object-Oliented Programming

Perl でオブジェクト指向

• カプセル化されていない• public/privateなど可視性を指定できない• オブジェクト=パッケージという縛り

オブジェクト指向のように書けるが……

という短所(見方によっては長所?)もある

Page 12: Perl 6 Object-Oliented Programming

Perl 6

Page 13: Perl 6 Object-Oliented Programming

Camelia

Page 14: Perl 6 Object-Oliented Programming

Perl 6 について

• 既存の Perl (~ v.5.18)とは異なる言語• 互換性がない• 作者は Larry Wall ( Perl と作者が同じ)• オブジェクト指向スクリプト言語• 静的型付けにも対応• 全ての仕様を反映した実装はまだない

基本的な話

Page 15: Perl 6 Object-Oliented Programming

完全な実装がない?

• 今はまだない• 仕様のある程度の部分に対応した実装はある• 今回提示するコードは Rakudo で動作確認しました• テクニカルな実装をしなければ、けっこう使えるかも

Page 16: Perl 6 Object-Oliented Programming

Perl 6オブジェクト指向プログラミング

Page 17: Perl 6 Object-Oliented Programming

• 予約語• class• method• 同一ファイル内で定義も呼び出しもできる(良いかどうかは別として)

• sub も色々ある(ここで話すには時間がry)

クラス and メソッド

class Engineer { method greeting { say ‘hello, YAPC!’; }}

my $c = Engineer.new;$c.greeting; # hello, YAPC!

Page 18: Perl 6 Object-Oliented Programming

メソッドの可視性

Page 19: Perl 6 Object-Oliented Programming

メソッドの可視性class Engineer { method greeting { say ‘hello, YAPC!’; }

method !thinking { say ‘sleepy...’;}

my $c = Engineer.new;$c.greeting; # hello, YAPC!$c!thinking; # NG

Page 20: Perl 6 Object-Oliented Programming

メソッドの可視性

• メソッドに public/private を指定できる• private メソッドはメソッド名の最初に ! をつける• private メソッドはクラス外からはアクセスできないが当然クラス内からはアクセスできるので……

Page 21: Perl 6 Object-Oliented Programming

メソッドの可視性class Engineer { method greeting { say ‘hello, YAPC!’; }

method !thinking { say ‘sleepy...’;

method unconsciously { self!thinking;}

my $c = Engineer.new;$c.greeting; # hello, YAPC!$c!thinking; # NG$c.unconsciously; # sleepy...

Page 22: Perl 6 Object-Oliented Programming

アトリビュート

Page 23: Perl 6 Object-Oliented Programming

アトリビュートclass Attrs { has $!priv_var; has $.pub_var;

method print_all { say $!priv_var; say $.pub_var; } method set_all ($priv, $pub) { $!priv_var = $priv; $.pub_var = $pub; }}

my $attr = Attrs.new;$attr.set_all(1, 2);$attr.print_all; # 1 2

Page 24: Perl 6 Object-Oliented Programming

アトリビュート

• メソッドと同様に public/private を指定できる• さっきのコード、動きそうですが……

Page 25: Perl 6 Object-Oliented Programming

Cannot assign to a readonly variable or a value in method set_all at attrs.p6:10 in block at attrs.p6:16

エラー!

Page 26: Perl 6 Object-Oliented Programming

アトリビュート

• public アトリビュートはデフォルトでは readonly• 無理やり代入したい場合は ! を使う

Page 27: Perl 6 Object-Oliented Programming

アトリビュートclass Attrs { has $!priv_var; has $.pub_var;

method print_all { say $!priv_var; say $.pub_var; } method set_all ($priv, $pub) { $!priv_var = $priv; $!pub_var = $pub; # change twigil }}

my $attr = Attrs.new;$attr.set_all(1, 2);$attr.print_all; # 1 2

Page 28: Perl 6 Object-Oliented Programming

アトリビュート

• public アトリビュートはデフォルトでは readonly• 無理やり代入したい場合は ! を使う• ん……でも ! だと private 扱いになる?• じゃあクラス外からアクセスするには?

Page 29: Perl 6 Object-Oliented Programming

アトリビュート

class Attrs { has $!priv_var; has $.pub_var is rw;}

my $attr = Attrs.new;$attr!priv_var = “alpha”; # NG$attr.pub_var = “bravo”;

say $attr!priv_var; # NGsay $attr.pub_var; # bravo

Page 30: Perl 6 Object-Oliented Programming

アトリビュート

• public アトリビュートはデフォルトでは readonly• 無理やり代入したい場合は ! を使う• ん……でも ! だと private 扱いになる?• じゃあクラス外からアクセスするには?• is rw をつけることで writable にできる

Page 31: Perl 6 Object-Oliented Programming

継承

Page 32: Perl 6 Object-Oliented Programming

継承class Person { has $.name is rw;}

class Speaker is Person { method get_name { return $.name; }}

my $speaker = Speaker.new;$speaker.name = ‘risou’; # risou

my Person $p = Speaker.new;

Page 33: Perl 6 Object-Oliented Programming

継承

• 他の多くのオブジェクト指向言語と同様にメソッドは自分→親→……→ルートの順で探索する

• 親クラスのアトリビュート、メソッドを引き継ぐ• 多重継承もできるclass Charlie is Alpha is Bravo ... {

Page 34: Perl 6 Object-Oliented Programming

オーバーライド

Page 35: Perl 6 Object-Oliented Programming

オーバーライドclass Parent { method print_generation { say ‘first generation’; }}

class Child is Parent { method print_generation { say ‘second generation’; }}

Parent.print_generation; # first generationChild.print_generation; # second generationmy Parent $p = Child.new;$p.print_generation; # second generation

Page 36: Perl 6 Object-Oliented Programming

オーバーライド

• もちろんオーバーライドもできる• (ここ特筆すべきことないですね)

Page 37: Perl 6 Object-Oliented Programming

コンストラクタ

Page 38: Perl 6 Object-Oliented Programming

コンストラクタclass OneAttr { has $.attr;

method new ($attr) { return self.bless(*, :attr); }

method print_attr { say $.attr; }}

my $oa = OneAttr.new(10);$oa.print_attr; # 10

Page 39: Perl 6 Object-Oliented Programming

コンストラクタ

• コンストラクタの戻り値は bless• オブジェクトを生成するためにbless の第1引数に * をセットする

• bless の引数で名前付き引数を用いることでアトリビュートに値をセットできる

Page 40: Perl 6 Object-Oliented Programming

コンストラクタ

• ルートオブジェクトがコンストラクタを持つため引数付きコンストラクタが必要ないなら定義は不要

method new { return self.bless(*); }

Page 41: Perl 6 Object-Oliented Programming

コンストラクタclass OneAttr { has $.attr;

method new ($attr) { return self.bless(*, :attr); }

method print_attr { say $.attr; }}

my $oa = OneAttr.new;$oa.print_attr; # ??

Page 42: Perl 6 Object-Oliented Programming

Not enough positional parameters passed; got 1 but expected 2 in method new at con2.p6:4 in block at con2.p6:13

エラー!

Page 43: Perl 6 Object-Oliented Programming

コンストラクタ• 引数なしコンストラクタが呼べ……ない!• 同名のメソッドが既に定義されているため(引数の有無/数にかかわらず同名のメソッド扱い)

• これは不便ですね• デフォルトの引数なしコンストラクタと独自定義の引数ありコンストラクタを共存させたい

• させましょう!

Page 44: Perl 6 Object-Oliented Programming

コンストラクタ• 引数なしコンストラクタが呼べ……ない!• 同名のメソッドが既に定義されているため(引数の有無/数にかかわらず同名のメソッド扱い)

• これは不便ですね• デフォルトの引数なしコンストラクタと独自定義の引数ありコンストラクタを共存させたい

• させましょう!

Page 45: Perl 6 Object-Oliented Programming

コンストラクタ• 引数なしコンストラクタが呼べ……ない!• 同名のメソッドが既に定義されているため(引数の有無/数にかかわらず同名のメソッド扱い)

• これは不便ですね• デフォルトの引数なしコンストラクタと独自定義の引数ありコンストラクタを共存させたい

• させましょう!

Page 46: Perl 6 Object-Oliented Programming

コンストラクタ• 引数なしコンストラクタが呼べ……ない!• 同名のメソッドが既に定義されているため(引数の有無/数にかかわらず同名のメソッド扱い)

• これは不便ですね• デフォルトの引数なしコンストラクタと独自定義の引数ありコンストラクタを共存させたい

• させましょう!

Page 47: Perl 6 Object-Oliented Programming

コンストラクタclass OneAttr { has $.attr;

multi method new ($attr) { return self.bless(*, :attr); }

method print_attr { say $.attr; }}

my $oa = OneAttr.new;$oa.print_attr; # Any()

Page 48: Perl 6 Object-Oliented Programming

コンストラクタ

• multi これだけ!• multi をつけることでメソッドをオーバーロードできる• (親クラスの)引数なしメソッドと引数ありメソッドが同じクラスの中で同居できる

Page 49: Perl 6 Object-Oliented Programming

Role

Page 50: Perl 6 Object-Oliented Programming

Rolerole Dice { method roll { return [1..$.plane].pick; }}

class Cube does Dice { has $.plane = 6; }

my $dice = Cube.new;$dice.roll; # 1~6

Page 51: Perl 6 Object-Oliented Programming

Role

• オブジェクトに役割を与える(Javaで言うとインタフェース)

• 継承とは異なるものなので注意• オブジェクト生成時に Role を与えることもできる

Page 52: Perl 6 Object-Oliented Programming

Rolerole Dice { method roll { return [1..$.plane].pick; }}

class Cube { has $.plane = 6; }

my $dice = Cube.new does Dice;$dice.roll; # 1~6

Page 53: Perl 6 Object-Oliented Programming

と、ここまで駆け足でお送りしてきました

Page 54: Perl 6 Object-Oliented Programming

Perl 6

• Perl よりも自然にオブジェクト指向が書ける• 記号プレフィックス(sigil, twigil)が豊富・複雑に• (ここでは紹介してないけど)メタクラスなどもあります

Page 55: Perl 6 Object-Oliented Programming

ところで

• Perlでオブジェクト指向するならモジュール使いましょう• 個人的には素で書くのも嫌いじゃないけど、規模が大きくなると苦しくなってくる

Page 56: Perl 6 Object-Oliented Programming

OOP モジュール

• 選択肢はいくつかある• Mouse• Moo• より良い選択肢(の候補)• p5-mop-redux

Page 57: Perl 6 Object-Oliented Programming

OOP モジュール

• 選択肢はいくつかある• Mouse• Moo• より良い選択肢(の候補)• p5-mop-redux

Page 58: Perl 6 Object-Oliented Programming

p5-mop-redux

• 今日説明した Perl 6 の OOP にかなり近い• ドット演算子は無理だけと twigil はなんとかできそう• コアに入れば Perl での OOP がすごく楽になるはず