Pergunta

Estou lendo Programming Perl , e eu encontrei este trecho de código:

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;
}

Com construtores como este, o que é o benefício de chamar new em uma instância objeto? Eu supor que é o que é, certo? Meu palpite é que, se alguém gostaria de escrever como um construtor, ele teria que adicionar mais algum código que copia os atributos do primeiro objeto para aquele prestes a ser criado.

Foi útil?

Solução

Então você pode construir um outro objeto da mesma classe sem saber o objeto da classe original é -. Isso pode fazer por algum padrão de fábrica compacta realmente puro

Como um exemplo, isso é útil quando você tem recursos objetos que você precisa para construir, como surge necessidade eo custo da computação qual o tipo de objeto de recurso é elevada (por exemplo, uma consulta DB de longa duração). Portanto, uma fábrica iria ver se ele foi passado um objeto recurso antigo e se assim for, criar um igualzinho por apenas chamando $old_object->new() -. Evitando o custo de recursos de re-calcular o tipo de recurso

Como outro exemplo, se você tiver hierarquia de classes denotando animais, e uma fábrica para a construção de novos animais em uma simulação, você poderia chamar $newborn = $factory->make_new_animal($mother) com a implementação da fábrica ser meramente $object->new()

Outras dicas

Não vejo qualquer benefício real. Você sempre pode apenas fazer ref($obj)->new ou ter um método para fazer $obj->clone; dessa forma você não ficam se perguntando qual dos dois $object->new está fazendo.

Como já foi dito, é para permitir a criação polimórfica de uma nova instância do objeto sem ter que estar ciente do tipo de instância.

Quanto objeto clonagem, eu normalmente escrever clone explícita () ou copiar () métodos que podem cópia devidamente atributos e outros dados sobre, mas não há nenhuma razão para que new () não pode cuidar desse papel, desde que ele está documentado de forma clara. No entanto Vejo duas vantagens para defini-los separadamente:

  1. ser capaz de usar uma classe diferente (uma criança, ou um mixin / papel (por exemplo, um alce papel)) para substituir vários comportamentos
  2. o potencial de tornar o código mais claro, como se os passos necessários para criar uma nova "esvaziar" objeto é muito diferente do que aqueles na clonagem de um objeto existente.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top