Complex classes like Modules often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Modules, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
14 | class Modules implements \BFWInterface\IModules |
||
15 | { |
||
16 | /** |
||
17 | * @var $_kernel L'instance du Kernel |
||
18 | */ |
||
19 | protected $_kernel; |
||
20 | |||
21 | /** |
||
22 | * @var $modList Liste des modules inclus |
||
23 | */ |
||
24 | protected $modList = array(); |
||
25 | |||
26 | /** |
||
27 | * @var $modLoad Liste des modules chargé |
||
28 | */ |
||
29 | protected $modLoad = array(); |
||
30 | |||
31 | /** |
||
32 | * @var $notLoad Liste des modules qui n'ont pas été chargé. |
||
33 | */ |
||
34 | protected $notLoad = null; |
||
35 | |||
36 | /** |
||
37 | * @var array $loadOrder Liste de l'ordre de chargement des modules pour chaque temps de chargement |
||
38 | */ |
||
39 | protected $loadOrder = array(); |
||
40 | |||
41 | /** |
||
42 | * Constructeur |
||
43 | */ |
||
44 | public function __construct() |
||
48 | |||
49 | /** |
||
50 | * Permet de déclarer un nouveau module depuis un fichier json |
||
51 | * |
||
52 | * @param string $path : Le chemin vers le fichier json |
||
53 | * |
||
54 | * @throws \Exception Erreur sur la déclaration des options |
||
55 | */ |
||
56 | public function newFromJson($path) |
||
57 | { |
||
58 | $filePath = $path.'/module.json'; |
||
59 | $jsonInfo = file_get_contents($filePath); |
||
60 | $modInfo = json_decode($jsonInfo, true); |
||
61 | |||
62 | if(!isset($modInfo['name'])) |
||
63 | { |
||
64 | throw new \Exception('Le nom du module n\'est pas déclaré (path: '.$path.').'); |
||
65 | } |
||
66 | |||
67 | if(isset($modInfo['params']) && !is_array($modInfo['params'])) |
||
68 | { |
||
69 | throw new \Exception('Les paramètres du module '.$name.' n\'est pas au bon format.'); |
||
70 | } |
||
71 | |||
72 | $name = $modInfo['name']; |
||
73 | $params = $modInfo['params']; |
||
74 | |||
75 | $this->initMod($name, $params); |
||
76 | $this->addPath($name, $path); |
||
77 | } |
||
78 | |||
79 | /** |
||
80 | * Permet de déclarer un nouveau modules |
||
81 | * |
||
82 | * @param string $name Le nom du modules |
||
83 | * @param array $params Options pour le chargement des modules. |
||
84 | * Liste des clés du tableau : |
||
85 | * - time (string, constante) : Le moment auquel sera chargé le module. Plusieurs valeurs possible. Ce sont des constantes |
||
86 | * modulesLoadTime_Module : Chargement immédiat. Avant la classe visiteur et les path en constante |
||
87 | * modulesLoadTime_Visiteur : Après la classe Visiteur. Les path en constante n'existe pas |
||
88 | * modulesLoadTime_EndInit : A la fin de l'initialisation du framework (défaut) |
||
89 | * - require (string, array) : Si le module doit avoir d'autre module de chargé avant. |
||
90 | * |
||
91 | * @throws \Exception Erreur sur la déclaration des options |
||
92 | */ |
||
93 | public function newMod($name, $params=array()) |
||
98 | |||
99 | /** |
||
100 | * Permet de déclarer un nouveau modules |
||
101 | * |
||
102 | * @param string $name Le nom du modules |
||
103 | * @param array $params Options pour le chargement des modules. |
||
104 | * Liste des clés du tableau : |
||
105 | * - time (string, constante) : Le moment auquel sera chargé le module. Plusieurs valeurs possible. Ce sont des constantes |
||
106 | * modulesLoadTime_Module : Chargement immédiat. Avant la classe visiteur et les path en constante |
||
107 | * modulesLoadTime_Visiteur : Après la classe Visiteur. Les path en constante n'existe pas |
||
108 | * modulesLoadTime_EndInit : A la fin de l'initialisation du framework (défaut) |
||
109 | * - require (string, array) : Si le module doit avoir d'autre module de chargé avant. |
||
110 | * |
||
111 | * @throws \Exception Erreur sur la déclaration des options |
||
112 | */ |
||
113 | protected function initMod($name, $params=array()) |
||
114 | { |
||
115 | 1 | if($this->exists($name)) |
|
116 | 1 | { |
|
117 | 1 | throw new \Exception('Le module '.$name.' existe déjà.'); |
|
118 | } |
||
119 | |||
120 | 1 | if(!is_array($params)) |
|
121 | 1 | { |
|
122 | 1 | throw new \Exception('Les options du module '.$name.' doivent être déclarer sous la forme d\'un array.'); |
|
123 | } |
||
124 | |||
125 | 1 | $time = $this->initParameters($params, 'time', modulesLoadTime_EndInit); |
|
126 | 1 | $require = $this->initParameters($params, 'require', array()); |
|
127 | 1 | $priority = $this->initParameters($params, 'priority', 0); |
|
128 | 1 | $runFile = $this->initParameters($params, 'runFile', false); |
|
129 | |||
130 | 1 | $this->modList[$name] = array( |
|
131 | 1 | 'name' => $name, |
|
132 | 1 | 'time' => $time, |
|
133 | 1 | 'require' => $require, |
|
134 | 1 | 'priority' => $priority, |
|
135 | 'runFile' => $runFile |
||
136 | 1 | ); |
|
137 | 1 | } |
|
138 | |||
139 | /** |
||
140 | * Permet d'initialiser un paramètre |
||
141 | * |
||
142 | * @param array &$params : Les paramètres du module |
||
143 | * @param string $key : La clé du paramètre à initialiser |
||
144 | * @param mixed $default : La valeur par défaut |
||
145 | */ |
||
146 | protected function initParameters(&$params, $key, $default) |
||
147 | { |
||
148 | 1 | if(!is_array($params)) {return;} |
|
149 | |||
150 | 1 | if(!isset($params[$key])) |
|
151 | 1 | { |
|
152 | 1 | $params[$key] = $default; |
|
153 | 1 | } |
|
154 | |||
155 | 1 | if(is_int($default)) |
|
156 | 1 | { |
|
157 | 1 | $params[$key] = (int) $params[$key]; |
|
158 | 1 | } |
|
159 | |||
160 | 1 | if(is_array($default) && !is_array($params[$key])) |
|
161 | 1 | { |
|
162 | 1 | $params[$key] = array($params[$key]); |
|
163 | 1 | } |
|
164 | |||
165 | 1 | return $params[$key]; |
|
166 | } |
||
167 | |||
168 | /** |
||
169 | * Permet de vérifier si un module existe |
||
170 | * |
||
171 | * @param string $name Le nom du module |
||
172 | * |
||
173 | * @return bool true s'il existe, false sinon |
||
174 | */ |
||
175 | public function exists($name) |
||
176 | { |
||
177 | 1 | return array_key_exists($name, $this->modList); |
|
178 | } |
||
179 | |||
180 | /** |
||
181 | * Permet de vérifier si un module est chargé |
||
182 | * |
||
183 | * @param string $name Le nom du module |
||
184 | * |
||
185 | * @return bool true s'il est chargé, false sinon |
||
186 | */ |
||
187 | public function isLoad($name) |
||
188 | { |
||
189 | 1 | return in_array($name, $this->modLoad); |
|
190 | } |
||
191 | |||
192 | /** |
||
193 | * Permet de définir un module comme chargé |
||
194 | * |
||
195 | * @param string $name Le nom du module |
||
196 | * |
||
197 | * @throws \Exception : Si le module n'existe pas |
||
198 | * |
||
199 | * @return void |
||
200 | */ |
||
201 | public function loaded($name) |
||
202 | { |
||
203 | 1 | if(!$this->exists($name)) |
|
204 | 1 | { |
|
205 | 1 | throw new \Exception('Module '.$name.' not exists.'); |
|
206 | } |
||
207 | |||
208 | 1 | $this->modLoad[] = $name; |
|
209 | 1 | } |
|
210 | |||
211 | /** |
||
212 | * Ajoute le path pour un module donné |
||
213 | * |
||
214 | * @param string $name Le nom du module |
||
215 | * @param string $path Le chemin réel du module |
||
216 | * |
||
217 | * @throws \Exception Le module n'existe pas |
||
218 | */ |
||
219 | public function addPath($name, $path) |
||
224 | |||
225 | /** |
||
226 | * Liste des modules à charger à un moment précis. |
||
227 | * |
||
228 | * @param string $timeToLoad Le temps auquel doivent être chargé les modules |
||
229 | * |
||
230 | * @throws \Exception Erreur au chargement d'un module |
||
231 | * |
||
232 | * @return array Liste des modules à charger |
||
233 | */ |
||
234 | public function listToLoad($timeToLoad) |
||
266 | |||
267 | protected function sortPriority($mod1, $mod2) |
||
279 | |||
280 | /** |
||
281 | * Permet de vérifier si un module peut être chargé |
||
282 | * |
||
283 | * @param array $mod Le module à vérifier pour le chargement |
||
284 | * @param array $arrayToLoad (ref) Liste des modules à charger |
||
285 | * |
||
286 | * @throws \Exception Erreur avec les dépendances |
||
287 | * |
||
288 | * @return bool Si le module peut être chargé ou non. |
||
289 | */ |
||
290 | protected function modToLoad(&$mod, &$arrayToLoad, $waitToLoad=array()) |
||
323 | |||
324 | /** |
||
325 | * Liste les modules non chargé |
||
326 | * |
||
327 | * @param bool $regen (default: false) Permet de regénérer la liste ou non |
||
328 | * |
||
329 | * @return array Liste des modules non chargé |
||
330 | */ |
||
331 | public function listNotLoad($regen=false) |
||
340 | |||
341 | /** |
||
342 | * Permet de savoir si des modules n'ont pas pu être chargé |
||
343 | * |
||
344 | * @return bool True si des modules n'ont pas pu être chargé, false sinon. |
||
345 | */ |
||
346 | public function isModulesNotLoad() |
||
353 | |||
354 | /** |
||
355 | * Retourne les infos sur un module |
||
356 | * |
||
357 | * @param string $name Le nom du module dont on veux les infos |
||
358 | * |
||
359 | * @throws \Exception Le module n'existe pas. |
||
360 | * |
||
361 | * @return array Les infos sur le module |
||
362 | */ |
||
363 | public function getModuleInfos($name) |
||
368 | |||
369 | /** |
||
370 | * Retourne le tableau loggant l'ordre de chargements des modules |
||
371 | * |
||
372 | * @return array |
||
373 | */ |
||
374 | public function getLoadOrder() |
||
378 | } |
||
379 |