J'ai deux méthodes (en C #):
List<Pizza> CookPizza(List<Order>); List<HappyCustomers> DeliverPizza(List<Pizza>);
Je connais toutes les commandes au début (par exemple, j'en ai 100 000 d'entre eux). Une commande peut être composée de plusieurs pizzas et je ne sais pas combien de pizzas sont dans n'importe quel ordre avant que ces pizzas soient cuites. (Wierd je sais). Généralement, une commande a 1 pizza, mais il peut y en avoir jusqu'à 10. P> Li>
Le nombre de pizzas actives ne doit généralement pas dépasser 100. Cela inclut des pizzas fraîchement cuites et des pizzas étant livrées. Ceci est une limite douce, je peux donc le dépasser (par exemple, lorsqu'un gros ordre a été cuit). La limite dure est probablement plus proche de 500. P> li>
Les deux opérations sont plus efficaces lorsqu'elles reçoivent beaucoup de travail. Généralement, CookPizza est plus efficace lorsqu'il est donné au moins 20 commandes. Livrer la pizza est très efficace lorsqu'il est donné au moins 50 pizzas. C'est-à-dire que je verrai la performance dégrader si je donne moins d'articles à ces méthodes que ces montants. C'est bien d'utiliser moins d'articles si c'est tout ce qui reste. P> li> ul>
Le problème principal que je vais abriter est de savoir comment les méthodes peuvent avoir besoin de vous attendre. p>
4 Réponses :
une pensée p>
Ajouter une variable de membre à la pizza à piste IS_COOKED. Ensuite, pendant la cuissonzza, définissez ce membre pour vrai lors de la fin, Ensuite, pendant la livraison, vérifiez que le membre avant de continuer. P>
Mieux je pense suivre l'état de la pizza par quelle file d'attente il est sur. Lorsque livré, supprimez simplement l'objet de pizza ou la place sur une file d'attente livrée.
Vous voulez une tampon simultanée - probablement une file d'attente simultanée, et vous pourriez avoir besoin de plusieurs. Vous voulez une file d'attente simultanée des commandes. Vous appelez COOKODER avec la file d'attente simultanée. Lorsque CookOrder retourne, vous l'appelez à nouveau avec le nouveau contenu de la file d'attente. Ici, vous ne pouvez poster que les 100 premiers articles ou quelque chose si vous voulez. Ici, les commandes sont efficacement par lots par la file d'attente et la vérification est toujours en cours d'exécution. Ensuite, vous répétez à nouveau le processus avec des pizzas. P>
J'ai suscité ceci, mais ... simplement avoir une collection Threadsafe n'entraîne pas vraiment avec la signalisation que je dois faire.
J'approche ce problème à l'aide d'un modèle basé sur des événements pour commencer. P>
Disons que nous avons un Le Ceci peut être refacturé à utiliser des événements au lieu de rappels, etc., mais je le pose pour l'idée, pas les spécificités de la mise en œuvre. P> pizzadispatcher code> à l'objet qui reçoit les commandes. Le répartiteur commence à appeler cookpizza code> avec un nombre défini de commandes de l'état vide initial. Lorsque des pizzas sont cuits, la fonction cookpizza code> notifie le répartiteur qu'une pizza a été cuite (peut-être par un rappel que vous fournissez en tant que paramètre). Quand une pizza est livrée la fonction livringpizza code> est la même. P>
pizzadispatcher code> aurait désormais suffisamment d'informations pour décider quand et combien de pizzas doivent être activées pour la cuisson ou la livraison en fonction du nombre de pizzas cuites et de livraisons en suspens. P>
Il semble que tout ce que vous avez besoin est un Pizzamanager Code> qui décide de ce que décide de ce que pizza code> Pour cuire d'abord, puis les transmet à la Deliveryboy code> pour eux d'être livrés. Ensuite, une fois que le Deliveryboy code> délivrepizza code>, il rapporte-il à la Pizzamanager code> pour récupérer le prochain pizza code>. Le Pizzamanager Code> prend en charge toutes les mathématiques liées à l'optimisation de la priorité de laquelle les commandes de cuisson et de livraison. Le Deliverboy CODE> aurait probablement le Pizzamanager Code> en tant que délégué code>. P>
Les méthodes doivent-elles avoir ces signatures?
+1 Si vous avez cliqué sur ce lien à cause du mot pizza
@jgauffin, non. À quoi penses-tu?