Bonjour,

J'essaye depuis quelques temps de me mettre un peu à jour en POO et de comprendre les concepts de la programmation SOLID.

J'essaye donc de réaliser un exemple simple, où des utilisateurs d'une l'appli sont reliés à une table pays. En programmation stupid, j'aurais donc une class country et une class user.

Niveau code, j'ai écrit ça (j'ai pas fait les méthodes de manipulation des paramètres scalaires, mais osef) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
 
 
abstract class CDomainObject
{
	protected $__data = array('id' => false); 
	public function __construct() {}
}
 
abstract class CMapper implements IMapper
{
	protected $bdd = NULL;
	public function __construct(\PDO $bdd) {$this->bdd = $bdd;}
}
 
interface IMapper
{
	public function Load(CDomainObject $obj);
	public function Save(CDomainObject $obj);
	public function Delete(CDomainObject $obj);
}
 
interface ICountry
{
	public function GetID();
	public function GetName();
	public function GetCode();
	public function SetName($name);
	public function SetCode($code);
}
 
class MCountry extends CMapper
{
	public function Load(CDomainObject $obj) {}
	public function Save(CDomainObject $obj) {/*update l'enregistyrement en BDD si ID existe ou cree l'enregistrement si id existe pas*/}
	public function Delete(CDomainObject $obj) {}
}
 
class CCountry extends CDomainObject implements ICountry
{
	public function GetID() {return $this->__data['id'];}
	public function GetName(){return $this->__data['name'];}
	public function GetCode(){return $this->__data['int_code'];}
	public function SetName($name){return $this->__data['name'] = $name;}
	public function SetCode($code){return $this->__data['int_code'] = $code;}
 
}
 
 
interface IUser
{
	public function GetID();
	public function SetData($data);
 
	public function GetFullName();
	public function GetGender();
	public function GetFirstName();
	public function GetLastName();
	public function GetMaidenName();
	public function GetAddress();
	public function GetZIP();
	public function GetCity();
	public function GetState();
	public function GetCountry();
	public function GetGSM();
	public function GetTel();
 
	public function SetGender($gender);
	public function SetFirstName($first_name);
	public function SetLastName($last_name);
	public function SetMaidenName($maiden_name);
	public function SetAddress($address);
	public function SetZIP($zip);
	public function SetCity($city);
	public function SetState($state);
	public function SetCountry(ICountry $country);
	public function SetGSM($gsm);
	public function SetTel($tel);
 
	public function Save();
	public function Delete();
}
 
 
class MUser extends CMapper
{
 
	public function Load(CDomainObject $obj)
	{
		$pdoStatement = $bdd->prepare('select * from user where id_user = :id limit 1');
		$pdoStatement->execute(array(':id' => $user->GetID()));
		if($res = $pdoStatement->fetch())
		{
			if($res['country'])
			{
				$res['country'] = new CCountry();
				$MCountry = new MCountry();
				$res['country'] = $MCountry->Load($res['country']);
			}
			else
				$res['country'] = NULL;
 
			$user->SetData($res);
		}
		$pdoStatement->closeCursor();
	}
 
	public function Save(CDomainObject $obj) {}
	public function Delete(CDomainObject $obj) {}
 
}
 
class CUser extends CDomainObject implements IUser
{
	public function __construct() {}
	public function SetData($data){ $this->__data = $data; }
 
	public function GetID(){return $this->__data['id'];}
 
	public function GetFullName(){}
	public function GetGender(){}
	public function GetFirstName(){}
	public function GetLastName(){}
	public function GetMaidenName(){}
	public function GetAddress(){}
	public function GetZIP(){}
	public function GetCity(){}
	public function GetState(){}
	public function GetGSM(){}
	public function GetTel(){}
	public function GetCountry()
	{
		return $this->__data['country'];
	}
 
	public function SetGender($gender){}
	public function SetFirstName($first_name){}
	public function SetLastName($last_name){}
	public function SetMaidenName($maiden_name){}
	public function SetAddress($address){}
	public function SetZIP($zip){}
	public function SetCity($city){}
	public function SetState($state){}
	public function SetGSM($gsm){}
	public function SetTel($tel){}
	public function SetCountry(ICountry $country)
	{
		$this->__data['country'] = $country;
	}
 
	public function Save(){}
	public function Delete(){}
 
}
Désolé pour le pavé...

Est-ce que j'ai réussi à faire un truc à peu près SOLID ?

Pour moi, il est au moins évident que la méthode Load() ligne 87 de la class MUser est foireuse et ne respecte pas le D de SOLID. J'en profite pour glisser une parenthèse et poser une 1er question, à votre avis, vaut il mieux stocker dans la class CUser un objet de type CCountry, ou juste l'ID de CCountry et l'instancier au moment ou ont fait un GetCountry() ?

Ensuite, j'ai lu pour le D de solid dans un article sur developpez :

Enfin, Dependency Injection : Ne laissez jamais vos objets créer eux-mêmes les objets dont ils ont besoin pour fonctionner : injectez-les leur. Ce principe peut se traduire concrètement par "Jamais de mot-clé 'new' écrit au sein d'une classe".
et j'ai quand même bien l'impression d'avoir les 2 pieds dedans... Pour ce point, je compte regarder comment fonctionne pimple (qui m'a été conseillé sur ce forum), mais avant, j'aurais bien aimé comprendre ce concept sans librairie... Pourriez vous m'éclairez et me dire comment corriger ce code pour être SOLID ?

En vous remerciant !