argra****@users*****
argra****@users*****
2015年 8月 3日 (月) 22:57:27 JST
Index: docs/modules/Class-Accessor-0.18/Accessor.pod diff -u docs/modules/Class-Accessor-0.18/Accessor.pod:1.4 docs/modules/Class-Accessor-0.18/Accessor.pod:1.5 --- docs/modules/Class-Accessor-0.18/Accessor.pod:1.4 Thu Jan 27 22:14:46 2011 +++ docs/modules/Class-Accessor-0.18/Accessor.pod Mon Aug 3 22:57:26 2015 @@ -1,14 +1,17 @@ =encoding euc-jp -=pod +=head1 NAME + +=begin original -=head1 名前 +Class::Accessor - Automated accessor generation - Class::Accessor - アクセサの自動生成 +=end original +Class::Accessor - アクセサの自動生成 -=head1 概要 +=head1 SYNOPSIS package Foo; @@ -29,15 +32,23 @@ $foo->set('that', 'crazy thing'); -=head1 説明 +=head1 DESCRIPTION + +=begin original This module automagically generates accessor/mutators for your class. +=end original + このモジュールは、あなたのクラスに自動でアクセサ/ミューテータを生成する。 +=begin original + Most of the time, writing accessors is an exercise in cutting and pasting. You usually wind up with a series of methods like this: +=end original + 通常、アクセサを書くことはカット&ペーストの練習だ。いつも このように一連のメソッドを書くはめになる: @@ -73,41 +84,61 @@ # 等々... +=begin original + One for each piece of data in your object. While some will be unique, doing value checks and special storage tricks, most will simply be exercises in repetition. Not only is it Bad Style to have a bunch of repetitious code, but its also simply not Lazy, which is the real tragedy. +=end original + オブジェクト内のデータの各部分をみてみる。あるものは独特で、値のチェックや 特殊なデータ保持の技巧を行なう一方、大部分は単純な反復作業だ。繰り返される コードの山をつくるのは、「悪いスタイル」であるだけでなく、全くもって [訳補足:Perlの美徳である]無精でもない。これは真の悲劇である。 +=begin original + If you make your module a subclass of Class::Accessor and declare your accessor fields with mk_accessors() then you'll find yourself with a set of automatically generated accessors which can even be customized! +=end original + もしもあなたのモジュールをClass::Accessorのサブクラスにし、mk_accessors()で アクセサフィールドを宣言するなら、自動的に生成されたアクセサの一揃いを見出す だろう。このアクセサはカスタマイズさえ可能だ! +=begin original + The basic set up is very simple: +=end original + 基本的な段取りは大変シンプルだ: package My::Class; use base qw(Class::Accessor); My::Class->mk_accessors( qw(foo bar car) ); +=begin original + Done. My::Class now has simple foo(), bar() and car() accessors defined. +=end original + さあできた。My::Classには今やfoo()、bar()そしてcar()というアクセサが 定義された。 -=head2 何が違うの?(What Makes This Different?) +=head2 What Makes This Different? + +(何が違うの?) + +=begin original What makes this module special compared to all the other method generating modules (L<"SEE ALSO">)? By overriding the get() and set() @@ -116,6 +147,8 @@ memory than most other solutions which generate a new method for each accessor. +=end original + 他の全てのメソッド生成モジュール(L<"参考">)と比較して、このモジュールを 特別なものにしているのは何か? get()及びset()メソッドをオーバーライドする ことによって、クラス全体でアクセサの振る舞いを変更させることができる。また、 @@ -123,7 +156,9 @@ 他の大部分の解決方法に比べて、メモリ消費が若干少なくなるはずだ。 -=head2 メソッド +=head2 Methods + +(メソッド) =over 4 @@ -135,18 +170,26 @@ my $obj = Class->new(\%fields); my $obj = $other_obj->new(\%fields); +=begin original + Class::Accessor provides a basic constructor. It generates a hash-based object and can be called as either a class method or an object method. +=end original + Class::Accessorは基本的なコンストラクタを提供する。これはハッシュベースの オブジェクト生成し、クラスメソッドとしてもオブジェクトメソッドとしても 呼び出すことができる。 +=begin original + It takes an optional %fields hash which is used to initialize the object (handy if you use read-only accessors). The fields of the hash correspond to the names of your accessors, so... +=end original + オプションとして%fieldsハッシュを取り、オブジェクトの初期化に利用される (読取専用アクセサに使うと便利だ)。ハッシュのフィールドはアクセサの 名前に対応する。だから… @@ -158,9 +201,13 @@ my $obj = Class->new({ foo => 42 }); print $obj->foo; # 42 +=begin original + however %fields can contain anything, new() will shove them all into your object. Don't like it? Override it. +=end original + だが%fieldsはどんなものでも含むことができる。new()はそれらを全て オブジェクトに押し込むだろう。それは嫌だって?オーバーライドすればよい。 @@ -170,11 +217,15 @@ Class->mk_accessors(@fields); +=begin original + This creates accessor/mutator methods for each named field given in @fields. Foreach field in @fields it will generate two accessors. One called "field()" and the other called "_field_accessor()". For example: +=end original + これは@fieldsで与えられたフィールド用のアクセサ/ミューテータメソッドを 作成する。@fieldsの各フィールド用に、二つのアクセサが生成される。一つは "field()"で、もう一つは"_field_accessor()"と呼ばれる。例えば: @@ -182,9 +233,13 @@ # foo()、_foo_accessor()、bar()そして_bar_accessor()が生成される Class->mk_accessors(qw(foo bar)); +=begin original + See L<CAVEATS AND TRICKS/"Overriding autogenerated accessors"> for details. +=end original + 詳細はL<警告とトリック/"自動生成されたアクセサのオーバーライド">を参照のこと。 =pod @@ -195,11 +250,15 @@ Class->mk_ro_accessors(@read_only_fields); +=begin original + Same as mk_accessors() except it will generate read-only accessors (ie. true accessors). If you attempt to set a value with these accessors it will throw an exception. It only uses get() and not set(). +=end original + mk_accessors()と同じだが、読み取り専用アクセサを生成する(つまり 真のアクセサだ)。このアクセサで値をセットしようとすると、例外を 投げる。このメソッドはget()だけを使い、set()は使わない。 @@ -219,18 +278,26 @@ Class->mk_wo_accessors(@write_only_fields); +=begin original + Same as mk_accessors() except it will generate write-only accessors (ie. mutators). If you attempt to read a value with these accessors it will throw an exception. It only uses set() and not get(). +=end original + mk_accessors()と同じだが、書き込み専用アクセサを生成する(つまり ミューテータだ)。このアクセサで値を取得しようとすると、例外を 投げる。このメソッドはset()だけを使い、get()は使わない。 +=begin original + B<NOTE> I'm not entirely sure why this is useful, but I'm sure someone will need it. If you've found a use, let me know. Right now its here for orthoginality and because its easy to implement. +=end original + B<注意> 私はなぜこれが便利なのか完全には確信が持てない。だが、誰かがそれを 必要とすると確信している。もし使い道を知っているなら、私に教えてほしい。 [訳者:最後一文が訳せませんでした] @@ -247,15 +314,25 @@ =back +=begin original + The rest is details. +=end original + 残りは詳細について。 -=head1 詳細 +=head1 DETAILS + +(詳細) + +=begin original An accessor generated by Class::Accessor looks something like this: +=end original + Class::Accessorが生成するアクセサは、このようになっている: # fooには色々なバリエーションがあるだろう @@ -269,28 +346,42 @@ } } +=begin original + Very simple. All it does is determine if you're wanting to set a value or get a value and calls the appropriate method. Class::Accessor provides default get() and set() methods which your class can override. They're detailed later. +=end original + とても単純だ。やっていることは、あなたが値をセットしたいのか取得したい のかを決定し、適切なメソッドを呼び出しているだけだ。Class::Accessorは デフォルトのget()及びset()メソッドを提供する。これはあなたのクラスで オーバーライドすることができる。これについては後で細かく扱う。 -=head2 アクセサの振る舞いを変更する +=head2 Modifying the behavior of the accessor + +(アクセサの振る舞いを変更する) + +=begin original Rather than actually modifying the accessor itself, it is much more sensible to simply override the two key methods which the accessor calls. Namely set() and get(). +=end original + アクセサそれ自身を本当に変更するよりもむしろ、そのアクセサを呼び出す 二つのキーメソッドを単純にオーバーライドしたほうがずっと実際的だ。 すなわち、set()とget()のオーバーライドである。 +=begin original + If you -really- want to, you can override make_accessor(). +=end original + もしあなたが-本当に-望むなら、make_accessor()をオーバーライドできる。 =over 4 @@ -300,12 +391,20 @@ $obj->set($key, $value); $obj->set($key, @values); +=begin original + set() defines how generally one stores data in the object. +=end original + set()は、オブジェクト内のデータを一般的にどのように保持するか定義する。 +=begin original + override this method to change how data is stored by your accessors. +=end original + このメソッドをオーバーライドすると、アクセサのデータ保持の仕方が変化する。 =pod @@ -315,27 +414,43 @@ $value = $obj->get($key); @values = $obj->get(@keys); +=begin original + get() defines how data is retreived from your objects. +=end original + get()は、オブジェクトからどのようにデータを取り出すかを定義する。 +=begin original + override this method to change how it is retreived. +=end original + このメソッドをオーバーライドすると、取り出し方が変化する。 =item B<make_accessor> $accessor = Class->make_accessor($field); +=begin original + Generates a subroutine reference which acts as an accessor for the given $field. It calls get() and set(). +=end original + $field用のアクセサとして動作するサブルーチンへのリファレンスを生成する。 それはget()とset()を呼び出す。 +=begin original + If you wish to change the behavior of your accessors, try overriding get() and set() before you start mucking with make_accessor(). +=end original + アクセサの振る舞いを変更したいなら、make_accessor()をいじくる前に get()とset()をオーバーライドしてみること。 @@ -345,14 +460,22 @@ $read_only_accessor = Class->make_ro_accessor($field); +=begin original + Generates a subroutine refrence which acts as a read-only accessor for the given $field. It only calls get(). +=end original + $field用の読み取り専用アクセサとして振舞うサブルーチンリファレンスを 生成する。このメソッドはget()を呼び出すだけだ。 +=begin original + Override get() to change the behavior of your accessors. +=end original + get()をオーバーライドしてアクセサの振る舞いを変更できる。 =pod @@ -361,34 +484,52 @@ $read_only_accessor = Class->make_wo_accessor($field); +=begin original + Generates a subroutine refrence which acts as a write-only accessor (mutator) for the given $field. It only calls set(). +=end original + $field用の書き込み専用アクセサ(ミューテータ)として振舞う サブルーチンリファレンスを生成する。このメソッドはset()を呼び出すだけだ。 +=begin original + Override set() to change the behavior of your accessors. +=end original + set()をオーバーライドしてアクセサの振る舞いを変更できる。 =pod =back -=head1 効率 +=head1 EFFICIENCY + +(効率) + +=begin original Class::Accessor does not employ an autoloder, thus it is much faster than you'd think. Its generated methods incur no special penalty over ones you'd write yourself. +=end original + Class::Accessorはオートローダーを使っていない。それゆえ、あなたが 思っているよりずっと高速だ。生成されたメソッドが、あなた自身で書いた 場合に生じるであろう特別なペナルティを被ることはない。 +=begin original + Here's the results of benchmarking Class::Accessor, Class::Accessor::Fast, a hand-written accessor and direct hash access (generated by examples/bench). +=end original + 以下はClass::Accessor、Class::Accessor::Fast、手書きのアクセサ、及び 直接ハッシュにアクセスするやり方によるベンチマークの結果である (examples/benchで生成)。 @@ -414,16 +555,22 @@ Direct - set: 2 wallclock secs ( 0.87 usr + 0.00 sys = 0.87 CPU) @ 574712.64/s (n=500000) +=begin original + So Class::Accessor::Fast is just as fast as one you'd write yourself while Class::Accessor is twice as slow, a price paid for flexibility. Direct hash access is about six times faster, but provides no encapsulation and no flexibility. +=end original + Class::Accessor::Fastはあなた自身が書いた場合と同じ速さだ。その一方 Class::Accessorは柔軟性のために支払われるコストのため、倍遅くなる。 直接ハッシュにアクセスするのは約6倍高速だ。だがカプセル化と柔軟性は 提供されない。 +=begin original + Of course, its not as simple as saying "Class::Accessor is twice as slow as one you write yourself". These are benchmarks for the simplest possible accessor, if your accessors do any sort of @@ -432,6 +579,8 @@ calling the accessor. In that case, Class::Accessor and the ones you write will tend to be just as fast. +=end original + もちろん、「Class::Accessorは自分で書くより倍遅い」と言えるほど単純では ない。これらは最も単純なアクセサによるベンチマークであり、 あなたのアクセサが何らかの複雑な仕事(データベースとの対話やファイル @@ -439,11 +588,17 @@ アクセサを呼び出すのにかかる時間をいっきに圧倒するだろう。その場合、 Class::Accessorとあなたが書くものとは同じ速さに向かうことになる。 -=head1 例 +=head1 EXAMPLES + +(例) + +=begin original Here's an example of generating an accessor for every public field of your class. +=end original + パブリックな全クラスフィールド用のアクセサ生成例。 package Altoids; @@ -473,8 +628,12 @@ print $pouch->{strong}; # 'Fuck you up strong!'を出力 +=begin original + Here's a simple example of altering the behavior of your accessors. +=end original + アクセサの振る舞いを変更する簡単な例。 package Foo; @@ -500,37 +659,59 @@ } -=head1 警告とトリック +=head1 CAVEATS AND TRICKS + +(警告とトリック) + +=begin original Class::Accessor has to do some internal wackiness to get its job done quickly and efficiently. Because of this, there's a few tricks and traps one must know about. +=end original + Class::Accessorは、その仕事を素早く効率よくやるために内部で 変わったことをやらねばならない。このため、知っておくべきいくつかの トリックとトラップとがある。 +=begin original + Hey, nothing's perfect. +=end original + やあ、完璧なものなんてないのさ。 -=head2 DESTROYという名前のフィールドをつくらないこと +=head2 Don't make a field called DESTROY + +(DESTROYという名前のフィールドをつくらないこと) + +=begin original This is bad. Since DESTROY is a magical method it would be bad for us to define an accessor using that name. Class::Accessor will carp if you try to use it with a field named "DESTROY". +=end original + これはまずい。DESTROYはマジカルメソッドであるため、その名前を 使ったアクセサを定義するとまずいことになるだろう。フィールド名に "DESTROY"とつけようと試みた場合、Class::Accessorはcarpする。 -=head2 自動生成されたアクセサのオーバーライド +=head2 Overriding autogenerated accessors + +(自動生成されたアクセサのオーバーライド) + +=begin original You may want to override the autogenerated accessor with your own, yet have your custom accessor call the default one. For instance, maybe you want to have an accessor which checks its input. Normally, one would expect this to work: +=end original + あなたは自動生成されたアクセサをオーバーライドしたいと思うかもしれない。 しかもそのカスタマイズしたアクセサは、デフォルトのアクセサを呼ぶ。 例えば、入力をチェックするアクセサが欲しい場合。通常、次のような動作を @@ -556,18 +737,26 @@ return $self->SUPER::email(@_); } +=begin original + There's a subtle problem in the last example, and its in this line: +=end original + 最後の例に微妙な問題が存在する。それは次の行にある: return $self->SUPER::email(@_); +=begin original + If we look at how Foo was defined, it called mk_accessors() which stuck email() right into Foo's namespace. There *is* no SUPER::email() to delegate to! Two ways around this... first is to make a "pure" base class for Foo. This pure class will generate the accessors and provide the necessary super class for Foo to use: +=end original + Fooがどのように定義されているかみてみると、Fooが呼び出した mk_accessors()は、email()をFooの名前空間に入れている。委譲するための SUPER::email()は存在*しない*! これについて二つの方法がある…一つ目は @@ -581,17 +770,25 @@ package Foo; use base qw(Pure::Organic::Foo); +=begin original + And now Foo::email() can override the generated Pure::Organic::Foo::email() and use it as SUPER::email(). +=end original + 今度はFoo::email()が生成されたPure::Organic::Foo::email()を オーバーライドし、それをSUPER::email()として利用できる。 +=begin original + This is probably the most obvious solution to everyone but me. Instead, what first made sense to me was for mk_accessors() to define an alias of email(), _email_accessor(). Using this solution, Foo::email() would be written with: +=end original + これは恐らく私以外の万人にとって最も明快な解決方法だろう。代わりに、 私がまず理解できたのは、mk_accessors()がemail()のエイリアスである _email_accessor()を定義することだった。この解決方法を使えば、 @@ -599,33 +796,47 @@ return $self->_email_accessor(@_); +=begin original + instead of the expected SUPER::email(). +=end original + これでSUPER::email()の代わりになる。 -=head1 作者 +=head1 AUTHOR Michael G Schwern <schwe****@pobox*****> -=head1 謝辞 +=head1 THANKS + +(謝辞) Thanks to Tels for his big feature request/bug report. -=head1 参考 +=head1 SEE ALSO L<Class::Accessor::Fast> +=begin original + These are some modules which do similar things in different ways L<Class::Struct>, L<Class::Methodmaker>, L<Class::Generate>, L<Class::Class>, L<Class::Contract> +=end original + 違う方法で似たようなことを行なうモジュール L<Class::Struct>, L<Class::Methodmaker>, L<Class::Generate>, L<Class::Class>, L<Class::Contract> +=begin original + L<Class::DBI> for an example of this module in use. +=end original + L<Class::DBI>にはこのモジュールの例がある。