J'ai une bonne nouvelle : pour mon jeu, j'ai exactement le même problème ^^
Et j'ai donc retenu une certaine architecture, que je vais résumer.
Mes bâtiments ont tous les mêmes caractéristiques :
Nom, type, description, niveau, etc.
Par ailleurs ils ont besoin de ressources variées
Et ils peuvent selon leur type avoir d'autres caractéristiques par exemple
Transport : voie de communication (air, terre, mer), distance, coût de base, bonus de déplacement
Production : type, cadence, coût de production..
Soin : cadence, coût de base, limite de niveau.
évidemment pas de quoi faire une table unique, donc ce que je fais :
j'ai la table des instances de structures et celle des définition de structures : nous allons parler de cette dernière.
Elle a donc un champ type qui va permettre de savoir dans quelle table secondaire piocher. Tables secondaires de la forme
struct_trans : id_struct, range, type, cost, bonus...
struct_stock : id_struct, max_size, cluster_size, type..
struct_prod : id_struct, prod_type, cost, prod_val...
et à côté une table de liaison de ressources : id_ressources, id_structure, quantity... pas besoin d'expliquer ^^
Maintenant côté code comment ça se passe. Déjà je suis en POO.
J'ai une classe structure qui va chercher dans la DB les infos de l'instance et du type de structure, avec les caractéristiques communes.
Ensuite pour chaque spécialité j'ai une classe dérivée de structure, qui va chercher les infos particulières de la table secondaire, et possède les méthodes adaptées. Seulement, pour savoir construire un tel objet il faut déjà savoir la valeur de type pour une structure. J'ai donc adapté le constructeur de ces classes dérivée, pour qu'il prenne en entrée une structure déjà existance, recopie les infos de base et ajoute les siennes. Ce qu'il se passe donc en pratique, dans mon générateur de structures :
->On construit une structure -> on lit son type -> s'il existe on construit la structure spécialisée en lui passant la structure initiale (qui est détruite)
Et j'ai donc retenu une certaine architecture, que je vais résumer.
Mes bâtiments ont tous les mêmes caractéristiques :
Nom, type, description, niveau, etc.
Par ailleurs ils ont besoin de ressources variées
Et ils peuvent selon leur type avoir d'autres caractéristiques par exemple
Transport : voie de communication (air, terre, mer), distance, coût de base, bonus de déplacement
Production : type, cadence, coût de production..
Soin : cadence, coût de base, limite de niveau.
évidemment pas de quoi faire une table unique, donc ce que je fais :
j'ai la table des instances de structures et celle des définition de structures : nous allons parler de cette dernière.
Elle a donc un champ type qui va permettre de savoir dans quelle table secondaire piocher. Tables secondaires de la forme
struct_trans : id_struct, range, type, cost, bonus...
struct_stock : id_struct, max_size, cluster_size, type..
struct_prod : id_struct, prod_type, cost, prod_val...
et à côté une table de liaison de ressources : id_ressources, id_structure, quantity... pas besoin d'expliquer ^^
Maintenant côté code comment ça se passe. Déjà je suis en POO.
J'ai une classe structure qui va chercher dans la DB les infos de l'instance et du type de structure, avec les caractéristiques communes.
Ensuite pour chaque spécialité j'ai une classe dérivée de structure, qui va chercher les infos particulières de la table secondaire, et possède les méthodes adaptées. Seulement, pour savoir construire un tel objet il faut déjà savoir la valeur de type pour une structure. J'ai donc adapté le constructeur de ces classes dérivée, pour qu'il prenne en entrée une structure déjà existance, recopie les infos de base et ajoute les siennes. Ce qu'il se passe donc en pratique, dans mon générateur de structures :
->On construit une structure -> on lit son type -> s'il existe on construit la structure spécialisée en lui passant la structure initiale (qui est détruite)
Code PHP :
<?php
$struct = new Structure($id);
switch ($struct->GetType())
{...
case 'transport' :
$struct = new TransportStructure($struct);
break;
...
}
L'avantage, c'est de pouvoir gérer plus tard des structures hybrides... Si j'ai un siège de guilde qui fait à la fois office d'auberge et d'atelier, j'airai taper dans les tables secondaires des deux fonctions. Par contre, je ne sais pas si l'héritage multiple est possible en php, donc la forme de la classe finale est encore à chercher.
PS : en réalité les constructeurs des classes dérivées possèdent un autre mode (indiqué par un flag true/false) qui permet de construire directement depuis la BDD (avec un JOIN en plus). Cela permet de générer directement l'objet que l'on veut si l'on sait déjà à quel sous famille il appartient.