Si tratta di un'implementazione del modello Proxy o Decorator?

1

Il modo in cui molti modelli di design sono descritti nella letteratura classica è in qualche modo diverso dalla loro implementazione in linguaggi dinamici come Javascript.

La presenza di alcune funzioni come le funzioni di prima classe rende strutturalmente uguali le implementazioni di pattern, cosa che a volte rende più difficile distinguerle.

Ho avuto questo pezzo di codice legacy che si basa su Amazon S3 per l'archiviazione. Ci sono alcune funzioni di facciata che mirano a semplificarne l'uso: getS3 , putS3 , listS3 e così via ...

Non disponevamo di un'adeguata configurazione di sviluppo e mentre cercavo di crearlo, ho sentito la necessità di scrivere dati in diverse posizioni in S3 per ambienti di produzione e sviluppo.

La mia idea era di anteporre un bucket di sviluppo predefinito al percorso S3. Poiché non volevo toccare le funzioni originali, ho pensato ad una funzione wrapper che inizialmente ho chiamato environmentDecorator come allusione al pattern Decorator.

È più o meno come:

function environmentDecorator(fn) {
  return function(bucket, key, ...rest) {
    if (environment === 'development') {
      key = bucket + '/' key
      bucket = 'development-bucket'
    }
    return fn(bucket, key, ...rest)   
  }
}

Il motivo per cui ho pensato al Decorator Pattern è stata la "capacità di aggiungere responsabilità dinamicamente [alle funzioni]" senza cambiare la loro interfaccia.

Tuttavia, alcuni giorni dopo, mentre stavo rivedendo questo codice, ho pensato che sarebbe stato più adatto per il Pattern Proxy definizione: "Fornisci un surrogato o segnaposto per un altro oggetto per controllarne l'accesso" e "Aggiungi un wrapper e una delega per proteggere il componente reale da una complessità eccessiva" . Se è così, dovrei chiamare il mio wrapper environmentProxy .

Vedo che questa è una domanda teorica e l'importante è risolvere il problema, ma non ho potuto fare a meno di incuriosirlo.

    
posta Henrique Barcelos 29.11.2016 - 16:01
fonte

1 risposta

1

Anche in c ++ o java alcuni modelli sono strutturalmente identici. Diamine, potrei chiamarla fabbrica. La differenza è l'intento.

Lo vedo più come un decoratore. L'intento è di decorare i parametri di input con i dettagli di distribuzione. Certo, potresti vederlo dall'altra parte, ma il decoratore sembra il modo più semplice per vederlo e questo è abbastanza buono.

Ricorda che il punto non è implementare la purezza strutturale. È per comunicare un buon modo di pensare a come funziona il codice. Dammi quello e posso perdonare molto.

    
risposta data 29.11.2016 - 17:08
fonte

Leggi altre domande sui tag