11

私は読んProgramming Perlでいて、このコードスニペットを見つけました:

sub new {
    my $invocant = shift;
    my $class   = ref($invocant) || $invocant;
    my $self = {
        color  => "bay",
        legs   => 4,
        owner  => undef,
        @_,                 # Override previous attributes
    };
    return bless $self, $class;
}

このようなコンストラクターでnewは、オブジェクトインスタンスを呼び出すことの利点は何ですか?それが目的だと思いますよね?私の推測では、誰かがそのようなコンストラクターを書きたい場合は、最初のオブジェクトの属性を作成しようとしているオブジェクトにコピーするコードをさらに追加する必要があります。

4

3 に答える 3

12

したがって、元のクラスのオブジェクトが何であるかを知らなくても、同じクラスの別のオブジェクトを作成できます。これにより、非常に優れたコンパクトなファクトリパターンを作成できます。

例として、これは、必要に応じて構築する必要のあるリソースオブジェクトがあり、どの種類のリソースオブジェクトを計算するコストが高い場合(たとえば、長時間実行されるDBクエリ)に役立ちます。したがって、ファクトリは古いリソースオブジェクトが渡されたかどうかを確認し、渡された場合は、呼び出すだけで同じように作成します$old_object->new()。リソースの種類を再計算するためのリソースコストを回避します。

別の例として、動物を表すクラス階層があり、シミュレーションで新しい動物を構築するためのファクトリがある場合は$newborn = $factory->make_new_animal($mother)、ファクトリの実装を単純に呼び出すことができます。$object->new()

于 2009-10-25T16:56:53.870 に答える
7

I don't see any real benefit. You can always just do ref($obj)->new or have a method to do $obj->clone; that way you aren't left wondering which of those two $object->new is doing.

于 2009-10-25T18:11:21.377 に答える
5

他の人が言っているように、それはそのインスタンスのタイプを意識する必要なしに新しいオブジェクトインスタンスのポリモーフィックな作成を可能にすることです。

オブジェクトのクローン作成に関しては、通常、属性やその他のデータを適切にコピーできる明示的なclone()またはcopy()メソッドを記述しますが、明確に文書化されている限り、new()がこの役割を処理できない理由はありません。 。ただし、それらを個別に定義することには2つの利点があります。

  1. 別のクラス(子、またはミックスイン/ロール(Mooseロールなど))を使用して、さまざまな動作をオーバーライドできる
  2. 新しい「空の」オブジェクトを作成するために必要な手順が、既存のオブジェクトのクローンを作成する手順と大きく異なる場合など、コードをより明確にする可能性。
于 2009-10-25T18:25:17.400 に答える