Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
1 | <?php |
||
43 | class Oledrion_plugins |
||
|
|||
44 | { |
||
45 | /** |
||
46 | * Dictionnaire des évènements |
||
47 | */ |
||
48 | const EVENT_ON_PRODUCT_CREATE = 'onProductCreate'; |
||
49 | const EVENT_ON_CATEGORY_CREATE = 'onCategoryCreate'; |
||
50 | const EVENT_ON_PRODUCT_DOWNLOAD = 'onProductDownload'; |
||
51 | // ************************************************************** |
||
52 | |||
53 | /** |
||
54 | * Types d'évènements |
||
55 | */ |
||
56 | const PLUGIN_ACTION = 0; |
||
57 | const PLUGIN_FILTER = 1; |
||
58 | |||
59 | /** |
||
60 | * Nom du script Php inclut qui contient l'inscription des plugins |
||
61 | */ |
||
62 | const PLUGIN_SCRIPT_NAME = 'plugins.php'; |
||
63 | |||
64 | /** |
||
65 | * Dans le fichier Php qui contient l'inscription des plugins, méthode à appeler pour récupérer la liste des plugins |
||
66 | */ |
||
67 | const PLUGIN_DESCRIBE_METHOD = 'registerEvents'; |
||
68 | |||
69 | /** |
||
70 | * Nom de la variable de session qui contient la liste des plugins détachés |
||
71 | */ |
||
72 | const PLUGIN_UNPLUG_SESSION_NAME = 'oledrion_plugins'; |
||
73 | |||
74 | /** |
||
75 | * Priorités des plugins |
||
76 | * @var constant |
||
77 | */ |
||
78 | const EVENT_PRIORITY_1 = 1; // Priorité la plus haute |
||
79 | const EVENT_PRIORITY_2 = 2; |
||
80 | const EVENT_PRIORITY_3 = 3; |
||
81 | const EVENT_PRIORITY_4 = 4; |
||
82 | const EVENT_PRIORITY_5 = 5; // Priorité la plus basse |
||
83 | |||
84 | /** |
||
85 | * Utilisé pour construire le nom de la classe |
||
86 | */ |
||
87 | private $pluginsTypeLabel = array(self::PLUGIN_ACTION => 'Action', self::PLUGIN_FILTER => 'Filter'); |
||
88 | |||
89 | /** |
||
90 | * Nom des classes qu'il faut étendre en tant que plugin |
||
91 | */ |
||
92 | private $pluginsClassName = array( |
||
93 | self::PLUGIN_ACTION => 'oledrion_action', |
||
94 | self::PLUGIN_FILTER => 'oledrion_filter' |
||
95 | ); |
||
96 | |||
97 | /** |
||
98 | * Nom de chacun des dossiers en fonction du type de plugin |
||
99 | */ |
||
100 | private $pluginsTypesFolder = array(self::PLUGIN_ACTION => 'actions', self::PLUGIN_FILTER => 'filters'); |
||
101 | |||
102 | /** |
||
103 | * Contient l'unique instance de l'objet |
||
104 | * @var object |
||
105 | */ |
||
106 | private static $instance = false; |
||
107 | |||
108 | /** |
||
109 | * Liste des évènements |
||
110 | * @var array |
||
111 | */ |
||
112 | private static $events = array(); |
||
113 | |||
114 | /** |
||
115 | * Retourne l'instance unique de la classe |
||
116 | * |
||
117 | * @return object |
||
118 | */ |
||
119 | public static function getInstance() |
||
128 | |||
129 | /** |
||
130 | * Chargement des 2 types de plugins |
||
131 | * |
||
132 | */ |
||
133 | private function __construct() |
||
138 | |||
139 | /** |
||
140 | * Chargement des plugins (actions et filtres) |
||
141 | * @return void |
||
142 | */ |
||
143 | public function loadPlugins() |
||
148 | |||
149 | /** |
||
150 | * Vérifie que le fichier Php passé en paramètre contient bien une classe de filtre ou d'action et si c'est le cas, le charge dans la liste des plugins |
||
151 | * @param string $fullPathName Chemin complet vers le fichier (répertoire + nom) |
||
152 | * @param integer $type Type de plugin recherché (action ou filtre) |
||
153 | * @param string $pluginFolder Le nom du répertoire dans lequel se trouve le fichier (le "dernier nom") |
||
154 | * @return void |
||
155 | */ |
||
156 | private function loadClass($fullPathName, $type, $pluginFolder) |
||
177 | |||
178 | /** |
||
179 | * Part à la recherche d'un type de plugin dans les répertoires |
||
180 | * |
||
181 | * @param string $path La racine |
||
182 | * @param integer $type Le type de plugin recherché (action ou filtre) |
||
183 | * @return void |
||
184 | */ |
||
185 | private function loadPluginsFiles($path, $type) |
||
197 | |||
198 | /** |
||
199 | * Déclenchement d'une action et appel des plugins liés |
||
200 | * |
||
201 | * @param string $eventToFire L'action déclenchée |
||
202 | * @param object|Oledrion_parameters $parameters Les paramètres à passer à chaque plugin |
||
203 | * @return object L'objet lui même pour chaîner |
||
204 | */ |
||
205 | View Code Duplication | public function fireAction($eventToFire, Oledrion_parameters $parameters = null) |
|
232 | |||
233 | /** |
||
234 | * Déclenchement d'un filtre et appel des plugins liés |
||
235 | * |
||
236 | * @param string $eventToFire Le filtre appelé |
||
237 | * @param object|Oledrion_parameters $parameters Les paramètres à passer à chaque plugin |
||
238 | * @return object Le contenu de l'objet passé en paramètre |
||
239 | */ |
||
240 | View Code Duplication | public function fireFilter($eventToFire, Oledrion_parameters $parameters) |
|
269 | |||
270 | /** |
||
271 | * Indique si un plugin s'est détaché d'un évènement particulier |
||
272 | * |
||
273 | * @param integer $eventType |
||
274 | * @param string $eventToFire |
||
275 | * @param string $fullPathName |
||
276 | * @param string $className |
||
277 | * @param string $method |
||
278 | * @return boolean |
||
279 | */ |
||
280 | public function isUnplug($eventType, $eventToFire, $fullPathName, $className, $method) |
||
291 | |||
292 | /** |
||
293 | * Permet à un plugin de se détacher d'un évènement |
||
294 | * |
||
295 | * @param integer $eventType |
||
296 | * @param string $eventToFire |
||
297 | * @param string $fullPathName |
||
298 | * @param string $className |
||
299 | * @param string $method |
||
300 | * @return void |
||
301 | */ |
||
302 | public function unplugFromEvent($eventType, $eventToFire, $fullPathName, $className, $method) |
||
311 | } |
||
312 |
You can fix this by adding a namespace to your class:
When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.