Verwendung des Strategiemusters zur Steuerung der Gruppierung von Daten
Von Allen Fung und Ajay Lakshminarayanarao
Ein wichtiges ShareThis Produkt ist der Social Data Feed, mit dem unsere Kunden über das Internet auf soziale Signale zugreifen und Daten auf Länderebene über soziale Ereignisse auf der ganzen Welt konsumieren können. Der Social Data Feed ist eine Datei, die ein Ereignis für jede Webseite enthält, die unsere Benutzer gesehen haben. Diese Datei enthält täglich etwa 500 Millionen Ereignisse. Ein Ereignis enthält Informationen wie URL, Geo und Zeitstempel. Ein Kunde hat kürzlich darum gebeten, dass wir die Ereignisse in mehreren Dateien, basierend auf dem Herkunftsland, statt in einer einzigen Datei speichern.
Wir haben das Strategiemuster verwendet, um dieses Problem zu lösen. Dies ermöglicht es uns, die neue Funktionalität zu unterstützen und die ursprüngliche zu erhalten. Das Strategiemuster ermöglicht es einem Objekt, einen Teil seines Verhaltens in Form eines anderen Objekts zu definieren, das einem Interface folgt. Wir haben das Strategiemuster verwendet, indem wir zwei neue Objekte erstellt haben. Einer von ihnen hatte eine Methode, die das Land eines Ereignisses zurückgab. Die andere hatte eine Methode, die immer eine leere Zeichenkette zurückgab, egal welches Ereignis angegeben wurde.
Hier ist die Strategie, die das Land zurückgebracht hat:
class GroupByCountry:
def doOperation(self, json):
return json[‘geo’][‘ISO’]
Hier ist die Strategie, die immer die leere Zeichenkette zurückgab:
class NoGroupBy:
def doOperation(self, json):
return “”
Der folgende Code zeigt, wie diese Strategien in der Anwendung verwendet werden, die den Social Data Feed erstellt. Diese Anwendung nimmt eine Protokolldatei von einem Webserver, fügt Informationen zu jedem Ereignis hinzu und gibt Dateien mit den hinzugefügten Informationen aus. Sie sehen das in Zeile 5 des Codes verwendete Strategiemuster. Die Anwendung erzeugt entweder mehrere Dateien oder eine einzelne Datei, je nachdem, welche Strategie an die Run-Methode übergeben wird.
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()
Die wichtigste Alternative zu Strategien sind Lambdas. Lambdas sind prägnanter als Strategien, unterstützen aber nicht so leicht das Hinzufügen von Methoden oder Zuständen. Wir wollten auch jede Strategie in ein eigenes Modul trennen und die Strategie auf der Kommandozeile spezifizieren lassen. Mit dieser Anforderung wurden Lambdas genauso ausführlich wie Strategien, also haben wir am Ende Strategien verwendet.