2009-09-16 10 views

risposta

6

Se inizi a utilizzare , troverai MooseX::Types di tuo gradimento. I tipi hanno automaticamente is_ $ type() e to_ $ type(). Questi sono per assicurarsi che tu inserisca i vincoli di tipo pass, o che il tuo input abbia una coercizione valida per il tipo. Mi piacciono anche per questi tipi di cose, perché puoi garantire che lo stato del tuo oggetto abbia i suddetti tipi senza costi aggiuntivi.

use Moose; 
has 'foo' => (isa => MyType, is => ro); 

sub _check_my_type { 
    my ($self, $type) = @_; 
    is_MyType($type); 
}; 

Potrebbe mancare qualche supporto per i tipi di profonde/ricorsivi, ma se la vostra utilizzando questa roba in Perl moderno probabilmente stai "facendo male." Usa invece un oggetto che ha i suoi controlli di coerenza (come il mio sopra con MyType), e passa semplicemente l'oggetto.

+0

L'alce non è un cattivo suggerimento se è possibile utilizzarlo. Se non puoi, Mouse è Moose-light. Questo ti permetterà di controllare il tipo e alcune altre cose senza tutte le dipendenze di Moose e senza lo stesso successo in termini di compilazione. Per essere chiari, I <3 Moose, ma per CGI e simili non è sempre la scelta migliore. – mikegrb

+2

Il mouse non viene sviluppato attivamente. È un progetto morto (per i documenti di Mouse.pm Usa Moose invece di Mouse.). Sfortunatamente, i documenti Mouse non lo suggeriscono nemmeno per CGI! Invece, dicono "Sebbene siano stati compiuti progressi significativi nel corso degli anni, la penalità del tempo di compilazione è un non-starter per alcune applicazioni molto specifiche: se stai scrivendo un'applicazione da riga di comando o uno script CGI in cui il tempo di avvio è essenziale, puoi non essere in grado di utilizzare Moose. Ti consigliamo invece di utilizzare HTTP :: Engine e FastCGI per quest'ultimo, se possibile. " http://rt.cpan.org/Public/Bug/Display.html?id=42203 –

5

Dai uno sguardo allo MooseX::Method::Signatures che fornisce un po 'di più della semplice validazione degli argomenti.

Esempio da POD:

package Foo; 

use Moose; 
use MooseX::Method::Signatures; 

method morning (Str $name) { 
    $self->say("Good morning ${name}!"); 
} 

method hello (Str :$who, Int :$age where { $_ > 0 }) { 
    $self->say("Hello ${who}, I am ${age} years old!"); 
} 

method greet (Str $name, Bool :$excited = 0) { 
    if ($excited) { 
     $self->say("GREETINGS ${name}!"); 
    } 
    else { 
     $self->say("Hi ${name}!"); 
    } 
} 

MooseX::Method::Signatures dotazione standard con MooseX::Declare che porta sintassi ancora più sexy alla piastra Perl. Quanto sopra potrebbe essere scritta in questo modo (solo mostrando primo metodo per brevità):

use MooseX::Declare; 

class Foo { 

    method morning (Str $name) { 
     $self->say("Good morning ${name}!"); 
    } 
} 

C'è anche un modulo CPAN corollario signatures per le subroutine semplici ma purtroppo non è così ricco di funzionalità come sopra.

2

Attualmente sto ricercando la stessa domanda del PO

ho notato che Dave Rolsky - programmatore iper-produttiva della fama Moose - ha recentemente (2009) assunto la manutenzione dei Parametri :: Convalida, quindi credo che questo un buon segno Il modulo non è stato aggiornato dal 2003. Quindi immagino che possa ancora essere usato per controllare i parametri di subroutine.

+0

Mi piace Params :: Validate, ma sembra preferire morire piuttosto che segnalare i parametri non validi in qualche modo e lasciare che lo script continui a funzionare ... – Marcus

Problemi correlati