03-08-2013, 06:14 PM
Oui, c'est vrai, j'ai pas fait gaffe pour l'unset.
Quand tu dis que ma bibliothèque gère "les livres et la traduction", je ne suis pas tout à fait d'accord. Pour moi, la bibliothèque gère le pack de Livres, dans sa globalité. Et le pack de livre peut être traduis (ce qui n'implique pas forcément la traduction de chaque livre). C'est pour cela que j'ai, dans cette bibliothèque, stocké des "propriétés" de livres et non les livres eux-mêmes: Ma Bibliothèque n'a pas vocation à être un conteneur de livre, mais à être l'objet "Ensemble de livres".
Quant à "forcément une porte de sortie", je demande à voir. S'il n'y a que des copies des propriétés qui sont envoyées vers ou depuis la classe, y'a pas de porte de sortie (évidemment, en considérant que je n'ai pas la possibilité de modifier le code de la classe).
Mon problème véritable n'est pas tant SOLID (je manque de pratique ok). Mon problème véritable, c'est la fuite d'informations qu'est l'envoi par une classe d'une référence à l'une de ses propriétés.
Par exemple, dans ce code
Quand tu dis que ma bibliothèque gère "les livres et la traduction", je ne suis pas tout à fait d'accord. Pour moi, la bibliothèque gère le pack de Livres, dans sa globalité. Et le pack de livre peut être traduis (ce qui n'implique pas forcément la traduction de chaque livre). C'est pour cela que j'ai, dans cette bibliothèque, stocké des "propriétés" de livres et non les livres eux-mêmes: Ma Bibliothèque n'a pas vocation à être un conteneur de livre, mais à être l'objet "Ensemble de livres".
Quant à "forcément une porte de sortie", je demande à voir. S'il n'y a que des copies des propriétés qui sont envoyées vers ou depuis la classe, y'a pas de porte de sortie (évidemment, en considérant que je n'ai pas la possibilité de modifier le code de la classe).
Mon problème véritable n'est pas tant SOLID (je manque de pratique ok). Mon problème véritable, c'est la fuite d'informations qu'est l'envoi par une classe d'une référence à l'une de ses propriétés.
Par exemple, dans ce code
Code PHP :
<?php
define ('_YOUDOITRIGHT', false);
interface Ifoo
{
public function echoValeur();
public function increment();
}
interface Ibar
{
}
class foo implements Ifoo
{
private $valeur = 0;
public function echoValeur()
{
echo('foo: ' . $this->valeur . '<br/>');
}
public function increment()
{
$this->valeur++;
}
}
class bar implements Ibar, Ifoo
{
private $objet;
public function __construct(Ifoo $p_obj)
{
if (_YOUDOITRIGHT)
$this->objet = clone $p_obj;
else
$this->objet = $p_obj;
}
public function echoValeur()
{
echo('bar: ');
$this->objet->echoValeur();
}
public function increment()
{
echo('You cannot increment bar objet.<br/>');
}
}
class Main
{
public static function run()
{
$myFoo = new foo();
$myFoo->echoValeur();
$myFoo->increment();
$myFoo->echoValeur();
$myBar = new bar($myFoo);
$myBar->echoValeur();
$myBar->increment();
$myFoo->increment();
$myBar->echoValeur();
}
}
Main::run();
?>
Lorsque je l'exécute, j'obtiens (si je ne fais pas _YOUDOITRIGHT = true):
Citation :foo: 0
foo: 1
bar: foo: 1
You cannot increment bar objet.
bar: foo: 2
Et donc, dans ma classe "Main", j'ai accès à l'objet "foo", qui est une propriété "private" de "bar". Ne devrais-je pas avoir l'interdiction d'accéder à une propriété "private" ailleurs que dans sa propre classe?!