22-03-2020, 01:01 PM
Chez "certains" (pas des gens d'ici), cela aurait été fait sur le principe de micro services:
- Un service "playerAction" a la méthode "sacrifice" qui est appelée par le joueur quand il fait son action de jeu (/playerActionService/sacrifice)
- Ce service appelle un autre service "unitsService" qui a une méthode "deleteUnits" qui est appelée (/unitsService/deleteUnit) pour dire quelles unités supprimer (après, "évidemment", avoir appelé le /unitsService/getCityUnits qui retourne la liste des unités de la cité)
- Le service "sacrifice" appelle ensuite un autre service "resourcesService" qui a la méthode "saveResources" pour rajouter les nouvelles ressources
----
Pour MVC, je ne sais pas si tu classes ça dans "controlleur" ou dans "modèle" (je serait tenté de dire "controlleur" car cela contient de la logique) mais je rejoins l'approche de faire une autre "classe" (ou autre concept du langage) controlleur appelant les deux "classes" de modèles pour que ce controlleur dise aux deux modèles de faire la suppression d'unité et l'ajout de ressources
----
Et du côté de mes archis, la page "/game/action/city/sacrifice" serait un endpoint qui appelle sa procédure stockée dédiée, dans laquelle on aurait bêtement:
Je te laisse choisir quels noms de formalisme tu veux donner à cette dernière approche (sans l'auto-complétion, c'est un peu plus chiant de tapper du SQL dans le navigateur que dans l'IDE )
- Un service "playerAction" a la méthode "sacrifice" qui est appelée par le joueur quand il fait son action de jeu (/playerActionService/sacrifice)
- Ce service appelle un autre service "unitsService" qui a une méthode "deleteUnits" qui est appelée (/unitsService/deleteUnit) pour dire quelles unités supprimer (après, "évidemment", avoir appelé le /unitsService/getCityUnits qui retourne la liste des unités de la cité)
- Le service "sacrifice" appelle ensuite un autre service "resourcesService" qui a la méthode "saveResources" pour rajouter les nouvelles ressources
----
Pour MVC, je ne sais pas si tu classes ça dans "controlleur" ou dans "modèle" (je serait tenté de dire "controlleur" car cela contient de la logique) mais je rejoins l'approche de faire une autre "classe" (ou autre concept du langage) controlleur appelant les deux "classes" de modèles pour que ce controlleur dise aux deux modèles de faire la suppression d'unité et l'ajout de ressources
----
Et du côté de mes archis, la page "/game/action/city/sacrifice" serait un endpoint qui appelle sa procédure stockée dédiée, dans laquelle on aurait bêtement:
CREATE PROCEDURE game_action_city_sacrifice(
IN idPlayer INT UNSIGNED,
IN idCity INT UNSIGNED,
IN idSacrifiedUnit SMALLINT UNSIGNED
) BEGIN
INSERT INTO city_resources (id_resource, id_city, quantity)
(SELECT
uic.id,
ur.id_resource,
0.5 * ur.construct_quantity * uic.units_count
FROM units_resources AS ur
INNER JOIN units_in_city AS uic ON uic.id_unit = ur.id AND uic.id_player = idPlayer AND uic.id = idCity
WHERE id_unit = idSacrifiedUnit)
ON DUPLICATE KEY UPDATE
city_resources.id_city = city_resources.id_city,
city_resources.id_resource = city_resources.id_resource,
city_resources.quantity = city_resources.quantity + VALUES(city_resources.quantity)
;
DELETE FROM units_in_city
WHERE id_unit = idSacrifiedUnit
AND id_city = idCity;
END
$$
Je te laisse choisir quels noms de formalisme tu veux donner à cette dernière approche (sans l'auto-complétion, c'est un peu plus chiant de tapper du SQL dans le navigateur que dans l'IDE )