Discussione:
wrapper o decoratore
(troppo vecchio per rispondere)
alex
2016-03-05 08:55:57 UTC
Permalink
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?
Andrea D'Amore
2016-03-05 12:41:39 UTC
Permalink
Post by alex
Cosa ne pensate delle definizioni che ho esposto?
Stai compilando il Novissimo Melzi dell'Informatica?
--
Andrea
alex
2016-03-05 13:17:09 UTC
Permalink
Post by Andrea D'Amore
Post by alex
Cosa ne pensate delle definizioni che ho esposto?
Stai compilando il Novissimo Melzi dell'Informatica?
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
Alessandro Pellizzari
2016-03-05 13:30:33 UTC
Permalink
Post by alex
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
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.
alex
2016-03-05 13:56:08 UTC
Permalink
Post by Alessandro Pellizzari
Per quanto mi riguarda, un decorator è un wrapper che non modifica
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)?
Alessandro Pellizzari
2016-03-05 14:18:03 UTC
Permalink
Quindi se ad es. esegue solo dei controlli del tipo if
(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.
alex
2016-03-05 14:44:02 UTC
Permalink
Post by Alessandro Pellizzari
Quindi se ad es. esegue solo dei controlli del tipo if
(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?
alex
2016-03-05 14:58:00 UTC
Permalink
Post by alex
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?
Anche se in effetti...
è stata applicata una decorazione funzionale (alla classe), pur
lasciando immutato il contenuto (wrapped).
Alessandro Pellizzari
2016-03-05 15:20:56 UTC
Permalink
Post by alex
class ValidString {
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.
alex
2016-03-05 15:42:34 UTC
Permalink
Post by Alessandro Pellizzari
Post by alex
class ValidString {
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?
Alessandro Pellizzari
2016-03-07 10:20:03 UTC
Permalink
Post by alex
Quindi alla fine possiamo dire che **wrapper** è un appellativo
piuttosto generico, che può indicare un decorator o un adapter?
E anche altre cose, volendo, tipo Proxy e forse anche Facade.

Bye.
alex
2016-03-07 16:35:12 UTC
Permalink
Post by Alessandro Pellizzari
Post by alex
Quindi alla fine possiamo dire che **wrapper** è un appellativo
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?

f***@gmail.com
2016-03-05 14:15:06 UTC
Permalink
Post by alex
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
$wrapped = '<b>'.$wrapped.'</b>';
parent::__construct($wrapped);
Cosa ne pensate delle definizioni che ho esposto?
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!
Continua a leggere su narkive:
Loading...