Perso, j'aurai placé un système d'interface (Mediator?) entre le code et le stockage des données (qui sera alors BDD ou classes).
Donc, des classes représentent les bâtiments. Elles peuvent hériter de classes mères, ou être faites par composition.
Elles contiennent les données du bâtiment, mais ces données ne sont pas initialisées dans la classe.
Un autre objet, le Mediator, est alors chargé d'initialiser ces données. Cet objet peut alors être ou bien la classe "DataFromMySQL", qui ira piocher les données dans la BDD et les injectera dans l'instance de la classe du bâtiment ou bien la classe "DataFromClasses", qui chargera une classe (Model) contenant uniquement des attributs avec la valeur des données, ou bien même la classe "DataFromXML" qui lira un fichier XML contenant les données du bâtiment.
Typiquement:
Code non testé
Après, on peut avoir d'autres approches, comme se passer de "DataFrom*" et utiliser directement PuitPetroleModelData. On aurait alors un PuitPetroleModelDataFromSQL et PuitPetroleModelDataFromClasses, chacun avec une méthode init(IPuitPetroleModel) qui pren en entrée un objet représentant les puits de pétrole standard (normalement donc, un PuitPetroleModel).
Là, le code est très extensible car on peut changer l'origine des données du puit de pétrole standard en ajoutant de nouvelles classes et en s'en servant pour initialiser ce puit de pétrole standard. On peut ajouter une classe pour charger depuis un XML ou un JSON par exemple...
Ca, c'était pour la réalisation de code extensible. Pour l'origine des données, je partirai sur ce qui existe déjà (SQL si j'ai bien compris?) et j'insèrerai, plus tard quand ca sera utile, un objet chargeant les données depuis une classe, et les classes contenant les données des batiments.
Donc, des classes représentent les bâtiments. Elles peuvent hériter de classes mères, ou être faites par composition.
Elles contiennent les données du bâtiment, mais ces données ne sont pas initialisées dans la classe.
Un autre objet, le Mediator, est alors chargé d'initialiser ces données. Cet objet peut alors être ou bien la classe "DataFromMySQL", qui ira piocher les données dans la BDD et les injectera dans l'instance de la classe du bâtiment ou bien la classe "DataFromClasses", qui chargera une classe (Model) contenant uniquement des attributs avec la valeur des données, ou bien même la classe "DataFromXML" qui lira un fichier XML contenant les données du bâtiment.
Typiquement:
// Modèles de données
interface IModel
{
}
//Modèle de données d'un batiment
interface IBatimentModel extends IModel
{
public $id=0; // j'ai un doute sur cette ligne... l'id pourrait être stocké ailleurs que dans la classe du batiment-model à initialiser
}
// Classe mère de N bâtiments
abstract class AUsine implements IBatimentModel
{
public $production = array(), $consommation = array(), $pointsVieMax = 0, $id = 0;
// méthodes / attributs communs
}
// Modèle de puit de pétrole (données de base des puits de pétole)
class PuitPetroleModel extends AUsine
{
public $id = 100; //Id du bâtiment
}
// Initialiseur des données du modèle
interface IDataFromSomewhere
{
public function init($modelToInitialize);
}
// Initialiseur via SQL
class DataFromMySQL implements IDataFromSomewhere
{
protected $mysql;
public function __construct($mysql)
{
$this->mysql = $mysql;
}
public function init(IBatimentModel $modelToInitialize)
{
// Do the SQL query
$data = $this->mysql->query('SELECT * FROM ... WHERE id='.(int)$modelToInitialize->id.' LIMIT 1');
foreach ($data as $key=>$value)
$modelToInitialize->$key = $value;
//Doute là-aussi sur le ->$key... On peut se tapper setter/getter si on veut, mais c'est lourd à l'exec
}
}
// Initialiseur via Classes
class DataFromClasses implements IDataFromSomewhere
{
public function init(IBatimentModel $modelToInitialize)
{
$loadDataFrom = get_class($modelToInitialize);
$className = $loadDataFrom . 'Data';
$objectToLoadDataFrom = new $className();
$objectToLoadDataFrom->loadTo($modelToInitialize);
}
}
// Injecte des données dans un modèle
interface IDataModel
{
public function loadTo(IModel $loadTo);
}
class PuitPetroleModelData implements IDataModel
{
protected $productions = array('petrole'=>6000, 'dechets'=>500);
protected $consommations = array('energie'=>50000);
protected $pointsVie = 5000;
public function loadTo(IModel $loadTo)
{
$loadTo->consommation = $this->consommations;
$loadTo->production = $this->productions;
$loadTo->pointsVieMax = $this->pointsVie;
}
}
$model = new PuitPetroleModel();
$dataFrom1 = new DataFromMySQL( new mysqli(...) );
$dataFrom2 = new DataFromClasses();
$dataFrom1->init( $model ); // le modèle sera initialisé par SQL
$dataFrom2->init( $model ); // le modèle sera initialisé par classe
// $model contient les données d'un puit de pétrole standard (peu importe l'origine de ces données)
Code non testé
Après, on peut avoir d'autres approches, comme se passer de "DataFrom*" et utiliser directement PuitPetroleModelData. On aurait alors un PuitPetroleModelDataFromSQL et PuitPetroleModelDataFromClasses, chacun avec une méthode init(IPuitPetroleModel) qui pren en entrée un objet représentant les puits de pétrole standard (normalement donc, un PuitPetroleModel).
Là, le code est très extensible car on peut changer l'origine des données du puit de pétrole standard en ajoutant de nouvelles classes et en s'en servant pour initialiser ce puit de pétrole standard. On peut ajouter une classe pour charger depuis un XML ou un JSON par exemple...
Ca, c'était pour la réalisation de code extensible. Pour l'origine des données, je partirai sur ce qui existe déjà (SQL si j'ai bien compris?) et j'insèrerai, plus tard quand ca sera utile, un objet chargeant les données depuis une classe, et les classes contenant les données des batiments.