2016-05-18 1 views
1

J'utilise un modèle de commande dans une application mon et j'ai le problème suivant: Certaines commandes nécessitent la création d'autres commandes avant leur exécution. La nécessité de créer de nouvelles commandes dépend de l'état de l'application. Je ne peux donc pas déterminer si vous souhaitez créer de nouvelles commandes lorsque vous ajoutez des commandes à la file d'attente, mais je dois les résoudre avant de les exécuter. Plus précisément, je fais des commandes pour contrôler un jeu de stratégie. J'ai la commande pour améliorer le bâtiment. Et cela prend des ressources. Lorsque le prix des ressources est supérieur à la capacité de stockage, le programme doit le résoudre et insérer des commandes pour la mise à niveau des stockages de ressources avant la mise à niveau effective du bâtiment. C'est pourquoi je ne peux pas résoudre le besoin de mettre à niveau les stockages lors de l'ajout de cette commande à la file d'attente, car la commande pourrait être exécutée après plusieurs jours et les niveaux de stockage changeront avec le temps. La seule option qui me vient à l'esprit est d'insérer de nouvelles commandes avant une commande qui nécessite plus de ressources que dans mes stockages, et de redémarrer l'exécution des commandes depuis le début, mais c'est vraiment une solution moche. Existe-t-il un modèle de conception pour résoudre les dépendances de commande uniquement lorsque la commande est la première dans la file d'attente à exécuter et pour insérer ces dépendances avant que cette commande ne soit exécutée? Je dois ajouter les commandes pour mettre à niveau les stockages vers la file d'attente, afin qu'ils puissent être conservés pour une exécution ultérieure lorsque je n'ai actuellement aucune ressource pour mettre à niveau les stockages. Mon QueueConsumer, où la logique Procesing de file d'attente est, ressemble à ceci:Motif de commande, nécessité de créer de nouvelles commandes avant l'exécution

public function processQueue() 
{ 
    $failedCommands = []; 
    $success = false; 
    $queue = $this->queueManager->getQueue(); 
    foreach ($queue as $key => $command) { 
     foreach ($this->processors as $processor) { 
      if ($processor->canProcessCommand($command)) { 
       $success = $processor->processCommand($command); 
       //in the processCommandMethod I am able to resolve whether I need new commands (need to upgrade storages) or not 
       break; 
      } 
     } 
     if ($success) { 
      $this->queueManager->removeFromQueue($command->getUuid()); 
     } else { 
      $failedCommands[] = $command; 
      break; 
     } 
    } 
    if (count($failedCommands) > 0) { 
    //determine when the failed commands could be processed succesfully (enough resources and so on). 
    } 
} 

Répondre

0

Pourriez-vous utiliser un conteneur IoC? Cela résoudrait toutes les dépendances pour vous.

+0

Je ne me suis probablement pas exprimé clairement. J'utilise le conteneur Dependency Injection, je n'ai pas de problème avec les dépendances en termes de classes de service, mais j'ai besoin de résoudre les dépendances en terme de commande à insérer dans la file d'attente (parce que j'ai besoin de la suite pour la traiter) avant la commande actuellement traitée et exécutée avant elle. –

+0

Peut être que vous pourriez déplacer votre logique vers une machine d'état. Vous pourriez considérer les commandes comme l'alphabet du SM –

+0

Dans les transitions, vous faites réellement la logique. –