Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

Perl 6 Object-Oliented Programming

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité

Consultez-les par la suite

1 sur 58 Publicité

Plus De Contenu Connexe

Diaporamas pour vous (20)

Les utilisateurs ont également aimé (17)

Publicité

Similaire à Perl 6 Object-Oliented Programming (20)

Plus récents (20)

Publicité

Perl 6 Object-Oliented Programming

  1. 1. Perl 6 オブジェクト指向 プログラミング YAPC::Asia TOKYO 2013 2013/09/21 risou
  2. 2. ※注意 ここでのPerl 6の説明は簡素化のため、 厳密には正しくない表現も含まれます。 (もしくは私の間違いです)
  3. 3. お話する人 • risou ( @risou ) • 職業プログラマではない • 普段は Java とか Haskell とか書いてます • たまに Perl 入学式にいたりいなかったり • 昨夜、銀歯がとれました 今喋ってるのはこんな人です。
  4. 4. 本日のお題 • Perl 6 でオブジェクト指向プログラミング 今日喋るのはこんなことです。
  5. 5. 本日のお題 • Perl 6 でオブジェクト指向プログラミング 今日喋るのはこんなことです。 もっと言うと…… • Perl でのオブジェクト指向 • Perl 6 でのオブジェクト指向 • Perl と Perl 6 の違いとかに間接的に言及するかも
  6. 6. オブジェクト指向
  7. 7. オブジェクト指向とは • データの構造と振舞いをオブジェクトとして扱う • オブジェクト間でのメッセージのやりとりでシステムを 構成する • 様々なプログラミング言語がサポートしている • Smalltalk / C++ / Java / Perl / Ruby / ... ご存知の方も多いかと思いますが……
  8. 8. オブジェクト指向の特徴 • カプセル化 • ポリモーフィズム • 継承 オブジェクト指向の代表的な特徴をあげると…… ※全てのオブジェクト指向言語が  これらの特徴を備えているわけではない
  9. 9. Perl でオブジェクト指向
  10. 10. Perl でオブジェクト指向 package Classname; use strict; use warnings; sub new { my ($class) = @_; return bless { field => $field, }, $class; }
  11. 11. Perl でオブジェクト指向 • カプセル化されていない • public/privateなど可視性を指定できない • オブジェクト=パッケージという縛り オブジェクト指向のように書けるが…… という短所(見方によっては長所?)もある
  12. 12. Perl 6
  13. 13. Camelia
  14. 14. Perl 6 について • 既存の Perl (∼ v.5.18)とは異なる言語 • 互換性がない • 作者は Larry Wall ( Perl と作者が同じ) • オブジェクト指向スクリプト言語 • 静的型付けにも対応 • 全ての仕様を反映した実装はまだない 基本的な話
  15. 15. 完全な実装がない? • 今はまだない • 仕様のある程度の部分に対応した実装はある • 今回提示するコードは Rakudo で動作確認しました • テクニカルな実装をしなければ、けっこう使えるかも
  16. 16. Perl 6 オブジェクト指向 プログラミング
  17. 17. • 予約語 • class • method • 同一ファイル内で 定義も呼び出しもできる (良いかどうかは別として) • sub も色々ある (ここで話すには時間がry) クラス and メソッド class Engineer { method greeting { say ‘hello, YAPC!’; } } my $c = Engineer.new; $c.greeting; # hello, YAPC!
  18. 18. メソッドの可視性
  19. 19. メソッドの可視性 class Engineer { method greeting { say ‘hello, YAPC!’; } method !thinking { say ‘sleepy...’; } my $c = Engineer.new; $c.greeting; # hello, YAPC! $c!thinking; # NG
  20. 20. メソッドの可視性 • メソッドに public/private を指定できる • private メソッドはメソッド名の最初に ! をつける • private メソッドはクラス外からはアクセスできないが 当然クラス内からはアクセスできるので……
  21. 21. メソッドの可視性 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...
  22. 22. アトリビュート
  23. 23. アトリビュート 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
  24. 24. アトリビュート • メソッドと同様に public/private を指定できる • さっきのコード、動きそうですが……
  25. 25. Cannot assign to a readonly variable or a value in method set_all at attrs.p6:10 in block at attrs.p6:16 エラー!
  26. 26. アトリビュート • public アトリビュートはデフォルトでは readonly • 無理やり代入したい場合は ! を使う
  27. 27. アトリビュート 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
  28. 28. アトリビュート • public アトリビュートはデフォルトでは readonly • 無理やり代入したい場合は ! を使う • ん……でも ! だと private 扱いになる? • じゃあクラス外からアクセスするには?
  29. 29. アトリビュート 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; # NG say $attr.pub_var; # bravo
  30. 30. アトリビュート • public アトリビュートはデフォルトでは readonly • 無理やり代入したい場合は ! を使う • ん……でも ! だと private 扱いになる? • じゃあクラス外からアクセスするには? • is rw をつけることで writable にできる
  31. 31. 継承
  32. 32. 継承 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;
  33. 33. 継承 • 他の多くのオブジェクト指向言語と同様に メソッドは自分→親→……→ルートの順で探索する • 親クラスのアトリビュート、メソッドを引き継ぐ • 多重継承もできる class Charlie is Alpha is Bravo ... {
  34. 34. オーバーライド
  35. 35. オーバーライド class Parent { method print_generation { say ‘first generation’; } } class Child is Parent { method print_generation { say ‘second generation’; } } Parent.print_generation; # first generation Child.print_generation; # second generation my Parent $p = Child.new; $p.print_generation; # second generation
  36. 36. オーバーライド • もちろんオーバーライドもできる • (ここ特筆すべきことないですね)
  37. 37. コンストラクタ
  38. 38. コンストラクタ 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
  39. 39. コンストラクタ • コンストラクタの戻り値は bless • オブジェクトを生成するために bless の第1引数に * をセットする • bless の引数で名前付き引数を用いることで アトリビュートに値をセットできる
  40. 40. コンストラクタ • ルートオブジェクトがコンストラクタを持つため 引数付きコンストラクタが必要ないなら定義は不要 method new { return self.bless(*); }
  41. 41. コンストラクタ class OneAttr { has $.attr; method new ($attr) { return self.bless(*, :attr); } method print_attr { say $.attr; } } my $oa = OneAttr.new; $oa.print_attr; # ??
  42. 42. Not enough positional parameters passed; got 1 but expected 2 in method new at con2.p6:4 in block at con2.p6:13 エラー!
  43. 43. コンストラクタ • 引数なしコンストラクタが呼べ……ない! • 同名のメソッドが既に定義されているため (引数の有無/数にかかわらず同名のメソッド扱い) • これは不便ですね • デフォルトの引数なしコンストラクタと 独自定義の引数ありコンストラクタを共存させたい • させましょう!
  44. 44. コンストラクタ • 引数なしコンストラクタが呼べ……ない! • 同名のメソッドが既に定義されているため (引数の有無/数にかかわらず同名のメソッド扱い) • これは不便ですね • デフォルトの引数なしコンストラクタと 独自定義の引数ありコンストラクタを共存させたい • させましょう!
  45. 45. コンストラクタ • 引数なしコンストラクタが呼べ……ない! • 同名のメソッドが既に定義されているため (引数の有無/数にかかわらず同名のメソッド扱い) • これは不便ですね • デフォルトの引数なしコンストラクタと 独自定義の引数ありコンストラクタを共存させたい • させましょう!
  46. 46. コンストラクタ • 引数なしコンストラクタが呼べ……ない! • 同名のメソッドが既に定義されているため (引数の有無/数にかかわらず同名のメソッド扱い) • これは不便ですね • デフォルトの引数なしコンストラクタと 独自定義の引数ありコンストラクタを共存させたい • させましょう!
  47. 47. コンストラクタ 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()
  48. 48. コンストラクタ • multi これだけ! • multi をつけることでメソッドをオーバーロードできる • (親クラスの)引数なしメソッドと 引数ありメソッドが同じクラスの中で同居できる
  49. 49. Role
  50. 50. Role role Dice { method roll { return [1..$.plane].pick; } } class Cube does Dice { has $.plane = 6; } my $dice = Cube.new; $dice.roll; # 1∼6
  51. 51. Role • オブジェクトに役割を与える (Javaで言うとインタフェース) • 継承とは異なるものなので注意 • オブジェクト生成時に Role を与えることもできる
  52. 52. Role role Dice { method roll { return [1..$.plane].pick; } } class Cube { has $.plane = 6; } my $dice = Cube.new does Dice; $dice.roll; # 1∼6
  53. 53. と、ここまで駆け足でお送りしてきました
  54. 54. Perl 6 • Perl よりも自然にオブジェクト指向が書ける • 記号プレフィックス(sigil, twigil)が豊富・複雑に • (ここでは紹介してないけど)メタクラスなどもあります
  55. 55. ところで • Perlでオブジェクト指向するならモジュール使いましょう • 個人的には素で書くのも嫌いじゃないけど、 規模が大きくなると苦しくなってくる
  56. 56. OOP モジュール • 選択肢はいくつかある • Mouse • Moo • より良い選択肢(の候補) • p5-mop-redux
  57. 57. OOP モジュール • 選択肢はいくつかある • Mouse • Moo • より良い選択肢(の候補) • p5-mop-redux
  58. 58. p5-mop-redux • 今日説明した Perl 6 の OOP にかなり近い • ドット演算子は無理だけと twigil はなんとかできそう • コアに入れば Perl での OOP がすごく楽になるはず

×