Warum nimmt der Builder von Moose einen Zeichenfolgenwert?

7

Elch :: Manual :: Attribute gibt Folgendes an:

  

Alternativ zur Verwendung einer Unterroutinenreferenz [als Standard] können Sie stattdessen eine Builder-Methode für Ihr Attribut angeben:   ...   Dies hat mehrere Vorteile. Erstens verschiebt es einen Teil des Codes in eine eigene benannte Methode, was die Lesbarkeit und die Code-Organisation verbessert.

Ihr Attribut könnte also einen Standardwert definieren:

%Vor%

Ich verstehe nicht, warum das vom Standard getrennt sein muss. Könnten Sie nicht einfach einen Verweis auf eine benannte Unterroutine übergeben?

%Vor%

Und wäre das nicht eine bessere Programmierpraxis, da Sie garantiert nicht versehentlich auf eine Subroutine verweisen, die nicht existiert? Sie würden sich auf die Methode mit einer logischen Referenz anstelle einer symbolischen Referenz beziehen.

    
skiphoppy 18.02.2009, 16:10
quelle

3 Antworten

14

Wenn der Builder aufgerufen wird, geschieht Folgendes:

%Vor%

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

Wenn es sich um einen Verweis 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.

    
rjbs 18.02.2009, 16:15
quelle
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?

    
Dave Rolsky 18.02.2009 16:14
quelle
7

Unterklassierung.

Builder gibt einen Methodennamen zum Aufrufen an, also

%Vor%

würde Something :: -Unterroutine für einen Builder von 'Subroutine' aufgerufen haben, während, wenn Sie den Subref-Stil verwendet hätten, stattdessen die YourClass :: -Unterroutine aufgerufen würde, weil Sie einen direkten Bezug auf die Subroutine genommen haben durchlaufen Sie den Methodenversand.

    
Matt S Trout 18.02.2009 16:15
quelle

Tags und Links