2009-02-18 12 views
7

Moose::Manual::Attributes Zustände:Warum nimmt Moose's Builder einen String-Wert?

Als Alternative einer Subroutinenreferenz [für Standard] zu verwenden, können Sie stattdessen eine Builder Methode für Ihr Attribut übergeben: ... Dies hat mehrere Vorteile. Erstens verschiebt es einen Teil des Codes in seine eigene benannte Methode, was die Lesbarkeit und Code-Organisation verbessert.

So könnte das Attribut einen Standard thusly definieren:

has attr => (
    is => 'ro', 
    builder => 'subroutine' 
); 
sub subroutine { 
    # figure out and return default value 
} 

ich nicht, warum dies von Standard getrennt sein muss. Könnten Sie nicht einfach einen Verweis auf eine benannte Subroutine übergeben?

has attr => (
    is => 'ro', 
    default => \&subroutine 
); 

Und wäre das nicht besser Programmierpraxis sein, da Sie nicht versehentlich garantiert sind, zu einem Unterprogramm zu beziehen, die gar nicht existieren? Sie würden sich auf die Methode mit einer logischen Referenz anstelle einer symbolischen Referenz beziehen.

Antwort

14

Wenn der Erbauer genannt wird, geschieht dies:

$object->$builder 

Wenn Builder ist eine Zeichenkette (sie build_attr sagen), dann können die Benutzer ihre eigene build_attr Methode in einer Unterklasse schreiben und es wird aufgerufen werden. Dadurch wird der Standardwert über einen einfachen benannten Methodenmechanismus erweiterbar.

Wenn es sich um eine Referenz auf eine Subroutine handelt, wird die Referenz im Paket der ursprünglichen Klasse verwendet, was bedeutet, dass sie nicht auf die gleiche Weise überschrieben werden kann.

10

Es ist keine "symbolische" Referenz. Der Builder ist eine Methode Name. Das bedeutet, dass es vererbbar und aus einer Rolle zusammensetzbar ist. Wenn Sie eine Subroutinenreferenz übergeben, muss diese Referenz im selben Paket vorhanden sein (oder vollständig qualifiziert sein).

Ich bin mir ziemlich sicher, dass ich das im Handbuch erkläre. Ist es unklar?

+0

Nun, ich weiß, es ist keine Referenz im Perl-Sinne; Ich dachte nur, eine bessere Programmierung wäre es, aus den genannten Gründen einen echten Hinweis auf eine benannte Subroutine zu geben. Sie haben jedoch Recht; Der Rest des Handbuchs zeigt, warum es so ist, wie es ist ... – skiphoppy

+1

Beachten Sie den Absatz, der beginnt "Dies hat mehrere Vorteile. Erstens ..."; vielleicht würde es helfen, etwas von dem nächsten Abschnitt nach oben zu verschieben, damit der Absatz mehr als nur diesen einen Vorteil gibt, ein wenig früher für diejenigen, die sich wundern. – skiphoppy

7

Unterklasse.

Builder gibt einen Methodennamen zu nennen, so

package Something; 
use Moose; 

extends 'YourClass'; 

sub subroutine { <some other default> } 

Etwas :: Unterprogramm für einen Builder von ‚Unterprogramm‘ genannt haben würde, während, wenn Sie den Subref Stil des würde Yourclass :: Unterprogramm dann verwendet werden, Sie werden stattdessen aufgerufen, weil Sie eine direkte Referenz auf das Unterprogramm erstellt haben, anstatt es durch den Methodenversand gehen zu lassen.

Verwandte Themen