Newsgroup: it.comp.www.php
Titolo: wrapper o decoratore

Differenza?
Un wrapper secondo me non modifica il wrapped (il valore in esso 
contenuto), ma al massimo esegue dei controlli per controllarne la 
validità, ed in caso contrario genera delle apposite eccezioni.
Poi invece un decoratore è anch'esso un wrapper, che però può modicare 
il wrapped aggiungendo delle decorazioni, ad es.:
 
$wrapped = '<b>'.$wrapped.'</b>';
parent::__construct($wrapped);
 
Cosa ne pensate delle definizioni che ho esposto?

 Cosa ne pensate delle definizioni che ho esposto?
 
Stai compilando il Novissimo Melzi dell'Informatica?
 
-- 
Andrea
 


Affermazione di carattere forse un po' troppo enfatizzante :)
Con tutto il rispetto per Giovanni Battista, direi che forse non sono 
l'unico a pormi la domanda
http://forums.codeguru.com/showthread.php?411166-wrapper-vs-decorator
 

 
http://forums.codeguru.com/showthread.php?411166-wrapper-vs-decorator
 
 
Pare che nessuno sia d'accordo sulla definizione di decorator, wrapper e 
adapter. Forse dipende dal linguaggio o dal background di chi ne parla.
 
Per quanto mi riguarda, un decorator è un wrapper che non modifica 
l'interfaccia dell'oggetto wrappato, mentre un adapter è un wrapper che 
implementa un'interfaccia diversa per l'oggetto wrappato.
 
Bye.
 

 l'interfaccia dell'oggetto wrappato,
 
Quindi se ad es. esegue solo dei controlli del tipo
if (is_null($wrapped)) throw new ...
senza decorare niente di niente, è comunque da considerare un decoratore 
(che non decora)?
 
 


Non direi...
 
Spesso la confusione nasce dal fatto che sia il decorator pattern che lo
adapter pattern sono chiamati a volte "wrapper pattern", per motivi a me
ignoti.
 
Oltre a quello che ha già scritto Alessandro, aggiungerei che dipende anche
dal concetto che deve esprimere, lo dicono i nomi stessi:
 
wrapper: impacchetta una classe o libreria attorno a un layer extra. Lo puoi
fare per qualsiasi motivo, tipo isolare componenti o librerie, o solo perché
non ti piacciono i nomi di funzioni o metodi :)
decorator: aggiunge funzionalità ad un componente. Lo usi per estendere una
classe a runtime senza modificare la classe stessa.
adapter: permette di usare un interfaccia al posto di un'altra. Lo usi per
far lavorare insieme più classi che non erano state disegnate per farlo,
senza modificarle.
 
Ciao!

 (is_null($wrapped)) throw new ...
 
Un decoratore non dovrebbe mai wrappare null (così come un adapter), 
quindi questo tipo di controllo non ha senso.
 
Se intendevi altri controlli, fai un esempio.
 
Bye.


class ValidString {
    function __construct($wrapped) {
        if (is_null($wrapped)) throw new ...;
        $this->wrapped = $wrapped;
    }
}
 
E' stata applicata qualche decorazione, quindi ha senso parlare di 
decoratore?
Oppure è stato fatto ***soltanto*** un checking?

 Oppure è stato fatto ***soltanto*** un checking?
 
Anche se in effetti...
è stata applicata una decorazione funzionale (alla classe), pur 
lasciando immutato il contenuto (wrapped).

     function __construct($wrapped) {
 
function __construct(BaseString $wrapped) {
 
In questo modo non puoi passare null (ti dà errore in fase di compilazione 
del file) e forzi il tipo base (che è quello che deve fare un decoratore).
 
Se passi il tipo sbagliato, ti dà errore in fase di esecuzione.
 
Bye.


Ovvio.
Quindi alla fine possiamo dire che **wrapper** è un appellativo 
piuttosto generico, che può indicare un decorator o un adapter?

 piuttosto generico, che può indicare un decorator o un adapter?
 
E anche altre cose, volendo, tipo Proxy e forse anche Facade.
 
Bye.
 


Facade, cioè ad esempio un Helper?