03-02-2013, 12:55 AM
(Modification du message : 03-02-2013, 12:57 AM par Sephi-Chan.)
Selon moi, ce n'est pas l'endroit où il faut se rendre compte de cette erreur. Si tu te retrouves avec du négatif alors que ça ne devrait pas être le cas, tu dois t'en apercevoir bien avant : avant d'insérer la valeur.
Pour ça, la solution est simple : tout changement de valeur doit passer par un API qui tu auras défini. Ainsi, c'est dans cet API que tu peux déclencher une exception (et à toi de voir si tu l'attrapes où non à un niveau supérieur de l'application).
Le test peut déjà avoir été fait en amont ou non mais peu importe : il sera refait au dernière moment (ce qui ne devrait pas être coûteux en ressources système dans la mesure où la structure est déjà en mémoire).
Dans tous les cas, il faut que l'application plante rapidement (politique du fail fast), pour empêcher qu'elle ne se mette dans un état problématique.
Voilà ce que j'écrirais (en Ruby, mais j'ai codé ça de manière la plus universelle possible) :
Pour ça, la solution est simple : tout changement de valeur doit passer par un API qui tu auras défini. Ainsi, c'est dans cet API que tu peux déclencher une exception (et à toi de voir si tu l'attrapes où non à un niveau supérieur de l'application).
Le test peut déjà avoir été fait en amont ou non mais peu importe : il sera refait au dernière moment (ce qui ne devrait pas être coûteux en ressources système dans la mesure où la structure est déjà en mémoire).
Dans tous les cas, il faut que l'application plante rapidement (politique du fail fast), pour empêcher qu'elle ne se mette dans un état problématique.
Voilà ce que j'écrirais (en Ruby, mais j'ai codé ça de manière la plus universelle possible) :
class Character
# Usage: character.withdraw_resources(gold: 20, wood: 90)
def withdraw_resources(resources)
resources.each do |type, amount|
current_amount = self.read_attribute("#{type}_amount")
new_amount = current_amount - amount
if new_amount < 0
raise NotEnoughResource, "Character has #{current_amount} of #{type} and can not be debited of #{amount}."
else
self.write_attribute("#{type}_amount", new_amount)
end
end
self.save
end
# Define a custom exception.
class NotEnoughResource < StandardError; end
end