Modérateur PHPfrance |
2575 Messages
28 nov. 2008, 23:32
Une classe doit normalement suivre le modèle d'une base de données, donc l'un et l'autre sont complémentaires. Alors que la base de données mémorise les données de l'application et quelques requêtes nécessaires, les classes de programme objets constituent les traitement spécifiques à chaque entité.
Voici ma contribution qui reprend la solution de katagoto et qui implémente les données au niveau du contexte de l'objet et non de sa classe. Car une classe ne doit pas être contenir des données en dur. Elle doit être conçue pour en consommer.
<pre>
<?php
class Batiment
{
// Propriétés
public $coutPopulation;
public $coutBois;
public $coutPierre;
public $coutFer;
public $pointsObtenus;
// Constructeur de l'objet
public function __construct($couts=array(), $points=array())
{
$this->coutPopulation = $couts['population'];
$this->coutBois = $couts['bois'];
$this->coutPierre = $couts['pierre'];
$this->coutFer = $couts['fer'];
$this->pointsObtenus = $points;
}
// Méthodes setter pour écrire dans les propriétés
public function setCoutPopulation($niveau, $valeur){
$this->coutPopulation[$niveau] = $valeur;
}
public function setCoutBois($niveau, $valeur){
$this->coutBois[$niveau] = $valeur;
}
public function setCoutPierre($niveau, $valeur){
$this->coutPierre[$niveau] = $valeur;
}
public function setCoutFer($niveau, $valeur){
$this->coutFer[$niveau] = $valeur;
}
public function setPointsObtenus($niveau, $valeur){
$this->pointsObtenus[$niveau] = $valeur;
}
// Méthodes init pour remettre à zéro des valeurs
public function initCoutPopulation(){
foreach ($this->coutPopulation as $niveau=>$valeur) $this->setCoutPopulation($niveau, 0);
}
public function initCoutBois(){
foreach ($this->coutBois as $niveau=>$valeur) $this->setCoutBois($niveau, 0);
}
public function initCoutPierre(){
foreach ($this->coutPierre as $niveau=>$valeur) $this->setCoutPierre($niveau, 0);
}
public function initCoutFer(){
foreach ($this->coutFer as $niveau=>$valeur) $this->setCoutFer($niveau, 0);
}
public function initPointsObtenus(){
foreach ($this->pointsObtenus as $niveau=>$valeur) $this->setPointsObtenus($niveau, 0);
}
// Méthodes getter pour lire le contenu des propriétés
public function getCoutPopulation($niveau=null){ // null pour retourner tous les niveaux
return $niveau==null ? $this->coutPopulation : (isset($this->coutPopulation[$niveau]) ? $this->coutPopulation[$niveau] : null);
}
public function getCoutBois($niveau=null){
return $niveau==null ? $this->coutBois : (isset($this->coutBois[$niveau]) ? $this->coutBois[$niveau] : null);
}
public function getCoutPierre($niveau=null){
return $niveau==null ? $this->coutPierre : (isset($this->coutPierre[$niveau]) ? $this->coutPierre[$niveau] : null);
}
public function getCoutFer($niveau=null){
return $niveau==null ? $this->coutFer : (isset($this->coutFer[$niveau]) ? $this->coutFer[$niveau] : null);
}
public function getPointsObtenus($niveau=null){
return $niveau==null ? $this->pointsObtenus : (isset($this->pointsObtenus[$niveau]) ? $this->pointsObtenus[$niveau] : null);
}
}
//
// PROGRAMME DE TEST DE LA CLASSE
//
// Configuration des paramètres utiles
$couts['population'] = array(1=>10, 2=>12, 3=>14, 4=>16);
$couts['bois'] = array(1=>180, 2=>226, 3=>286, 4=>360);
$couts['pierre'] = array(1=>160, 2=>204, 3=>260, 4=>332);
$couts['fer'] = array(1=>140, 2=>176, 3=>222, 4=>280);
$points = array(1=>20, 2=>24, 3=>28, 4=>34);
// Création d'un objet Batiment
$batiment1 = new Batiment($couts, $points);
// Afficher les valeurs actuelles de ses propriétés
print_r( $batiment1->getCoutPopulation() ); // pour tous les niveaux
echo "<br />";
echo $batiment1->getCoutPopulation(1); // pour le niveau 1
echo "<br />";
echo $batiment1->getCoutPopulation(2); // pour le niveau 2
echo "<br />";
$batiment1->initCoutPopulation(); // Efface tous les couts
$batiment1->setCoutPopulation(2, 700); // mettre à jour un cout
$batiment1->setCoutPopulation(1, 25); // mettre à jour un cout
echo "<br />";
// autre façon pour accéder aux couts niveau/niveau
foreach ($batiment1->getCoutPopulation() as $niveau=>$cout){
echo "Coût population du niveau " . $niveau . " = " . $cout . "<br />";
}
echo "<br />";
print_r( $batiment1->getPointsObtenus() ); //tous les points
$batiment1->initPointsObtenus(); // Efface tous les points
$batiment1->setPointsObtenus(1, 25); // mettre à jour un point par niveau
echo "<br />";
// autre façon pour accéder aux points niveau/niveau
foreach ($batiment1->getPointsObtenus() as $niveau=>$point){
echo "Point du niveau " . $niveau . " = " . $point . "<br />";
}
// ect ...
?>
</pre>
--------
//////----
//---
//----
//////
-------
//---
//----
//---
//----
//---
//
------
//////----
//////-----
//////
-----
||--------
||--
||---
||
Prendre le recul n'est pas une perte de temps.
ps:
Affrontez moi dans l'arène