Utilizzare lo schema strategico per controllare il raggruppamento dei dati

Di Allen Fung e Ajay Lakshminarayanarao

Un prodotto importante ShareThis è il Social Data Feed, che i nostri clienti utilizzano per accedere ai segnali sociali su Internet e consumare i dati a livello nazionale sugli eventi sociali generati in tutto il mondo. Il Social Data Feed è un file che contiene un evento per ogni pagina web che i nostri utenti hanno visto. Questo file contiene circa 500 milioni di eventi al giorno. Un evento contiene informazioni, come URL, geo e timestamp. Un cliente ci ha recentemente richiesto di inserire gli eventi in più file, in base al paese di origine, invece di un singolo file.

Abbiamo usato lo schema della Strategia per risolvere questo problema. Questo ci permette di supportare la nuova funzionalità e di preservare quella originale. Il modello di strategia permette ad un oggetto di avere alcuni dei suoi comportamenti definiti in termini di un altro oggetto che segue un'interfaccia. Abbiamo usato lo Strategy pattern creando due nuovi oggetti. Uno di essi aveva un metodo che restituiva il paese di un evento. L'altro aveva un metodo che restituiva sempre una stringa vuota, indipendentemente dall'evento fornito.

Ecco la Strategia che ha restituito il Paese:

class GroupByCountry: def doOperation(self, json): return json[‘geo’][‘ISO’]

Ecco la Strategia che restituiva sempre la stringa vuota:

class NoGroupBy: def doOperation(self, json): return “”

Il codice sottostante mostra come queste strategie vengono utilizzate nell'applicazione che crea il Social Data Feed. Questa applicazione prende un file di log da un server web, aggiunge informazioni ad ogni evento e produce file con le informazioni aggiunte. Si può vedere il modello di Strategia utilizzato nella riga 5 del codice. L'applicazione produrrà o più file o un singolo file a seconda di quale strategia viene passata nel metodo di esecuzione.

def run(file, writer, worker, outFilename, strategy): with open(file) as f: for line in f: json = worker.addInfo(f) country = strategy.doOperation(json) writer.write(outFilename + ”.” + country, json) writer.close()

L'alternativa principale alle Strategie sono le lambda. Le lambda sono più concise delle Strategie, ma non supportano facilmente l'aggiunta di metodi o stati. Abbiamo anche voluto separare ogni Strategia in un proprio modulo e permettere che la Strategia sia specificata sulla riga di comando. Con questo requisito, le lambda sono diventate tanto verbose quanto le Strategie, quindi alla fine abbiamo usato le Strategie.

Informazioni sull'autore
ShareThis

ShareThis ha sbloccato il potere del comportamento digitale globale sintetizzando i dati di condivisione sociale, interesse e intenzione dal 2007. Alimentato dal comportamento dei consumatori su oltre tre milioni di domini globali, ShareThis osserva le azioni in tempo reale di persone reali su destinazioni digitali reali.

Chi siamo

ShareThis ha sbloccato il potere del comportamento digitale globale sintetizzando i dati di condivisione sociale, interesse e intenzione dal 2007. Alimentato dal comportamento dei consumatori su oltre tre milioni di domini globali, ShareThis osserva le azioni in tempo reale di persone reali su destinazioni digitali reali.