Utilisation du modèle de stratégie pour contrôler le regroupement des données
Par Allen Fung et Ajay Lakshminarayanarao
Un produit important ShareThisest le Social Data Feed, que nos clients utilisent pour accéder à des signaux sociaux sur Internet et consommer des données au niveau national sur les événements sociaux générés dans le monde entier. Le flux de données sociales est un fichier qui contient un événement pour chaque page Web que nos utilisateurs ont vue. Ce fichier contient environ 500 millions d'événements par jour. Un événement contient des informations, telles que l'URL, le géo et l'horodatage. Un client a récemment demandé que nous placions les événements dans plusieurs fichiers, en fonction du pays d'origine, au lieu d'un seul fichier.
Nous avons utilisé le modèle de stratégie pour résoudre ce problème. Cela nous permet de soutenir la nouvelle fonctionnalité et de préserver l'original. Le modèle de stratégie permet à un objet d'avoir une partie de son comportement défini en termes d'un autre objet qui suit une interface. Nous avons utilisé le modèle de stratégie en créant deux nouveaux objets. L'un d'eux avait une méthode qui retournait le pays d'un événement. L'autre avait une méthode qui retournait toujours une chaîne vide, peu importe quel événement a été fourni.
Voici la stratégie qui a rendu le pays:
class GroupByCountry:
def doOperation(self, json):
return json[‘geo’][‘ISO’]
Voici la stratégie qui a toujours retourné la chaîne vide:
class NoGroupBy:
def doOperation(self, json):
return “”
Le code ci-dessous montre comment ces stratégies sont utilisées dans l'application qui crée le flux de données sociales. Cette application prend un fichier journal à partir d'un serveur Web, ajoute des informations à chaque événement et génère des fichiers avec les informations ajoutées. Vous pouvez voir le modèle de stratégie utilisé dans la ligne 5 du code. L'application produira plusieurs fichiers ou un seul fichier en fonction de la stratégie qui est passée dans la méthode Run.
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()
La principale alternative aux stratégies sont les lambdas. Les lambdas sont plus concis que les stratégies, mais ne supportent pas facilement l'ajout de méthodes ou d'État. Nous voulions également séparer chaque stratégie dans son propre module et permettre à la stratégie d'être spécifiée sur la ligne de commande. Avec cette exigence, les lambdas sont devenus tout aussi verbeux que les stratégies, nous avons donc utilisé des stratégies à la fin.