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:
Complex classes like Unite 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 Unite, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 10 | class Unite { |
||
| 11 | private $coef_unite; |
||
| 12 | private $pour_recruter; |
||
| 13 | private $temps_recrutement; |
||
| 14 | |||
| 15 | |||
| 16 | //-------------------------- BUILDER ----------------------------------------------------------------------------// |
||
| 17 | public function __construct() { |
||
| 20 | //-------------------------- END BUILDER ----------------------------------------------------------------------------// |
||
| 21 | |||
| 22 | |||
| 23 | //-------------------------- GETTER ----------------------------------------------------------------------------// |
||
| 24 | |||
| 25 | /** |
||
| 26 | * @param $unite |
||
| 27 | * @param $niveau |
||
| 28 | * @param $type |
||
| 29 | * @return array |
||
| 30 | * récupère les caractéristiques de l'unité en fonction de son niveau |
||
| 31 | */ |
||
| 32 | public function getCaracteristiqueUnite($unite, $niveau, $type) { |
||
| 72 | |||
| 73 | /** |
||
| 74 | * @return array |
||
| 75 | * fonction qui renvoit tous les types d'unités qu'il est possible de recruter |
||
| 76 | */ |
||
| 77 | private function getAllType() { |
||
| 80 | |||
| 81 | /** |
||
| 82 | * @param $type |
||
| 83 | * fonction qui permet de récupérer les unités qu'i est possible de recruter en fonction |
||
| 84 | * du type (batiment sur lequel on a cliqué) |
||
| 85 | */ |
||
| 86 | public function getUnitePossibleRecruter($type) { |
||
| 98 | |||
| 99 | /** |
||
| 100 | * fonction qui renvoi les unité en cours de recrutement |
||
| 101 | */ |
||
| 102 | public function getRecrutement() { |
||
| 128 | |||
| 129 | /** |
||
| 130 | * @param null $id_base |
||
| 131 | * fonction qui récupère toutes les unités qui sont dans la base |
||
| 132 | */ |
||
| 133 | public function getAllUnites($id_base = null) { |
||
| 151 | |||
| 152 | /** |
||
| 153 | * @param $type |
||
| 154 | * @param $id_base |
||
| 155 | * @return mixed |
||
| 156 | * fonction qui récupère toutes les unités en fonction d'un type précis |
||
| 157 | */ |
||
| 158 | private function getAllUniteType($type, $id_base) { |
||
| 188 | |||
| 189 | /** |
||
| 190 | * @param $type |
||
| 191 | * @param $nom |
||
| 192 | * @return int |
||
| 193 | * renvoi le nombre d'unite en fonction d'un type et d'un nom qui ne sont ni dans un groupe ni |
||
| 194 | * en mission |
||
| 195 | */ |
||
| 196 | private function getNombreUniteNom($type, $nom) { |
||
| 210 | |||
| 211 | /** |
||
| 212 | * @return int |
||
| 213 | * fonction qui renvoi le nombre d'unité vivante dans la base qui consomme de la nourriture |
||
| 214 | */ |
||
| 215 | View Code Duplication | public function getNombreUniteHumaine() { |
|
| 225 | |||
| 226 | /** |
||
| 227 | * @param $id_mission |
||
| 228 | * @return int |
||
| 229 | * fonction qui renvoi le nombre d'unités envoyées sur une mission en particulier |
||
| 230 | */ |
||
| 231 | View Code Duplication | public function getUnitesMission($id_mission) { |
|
| 241 | |||
| 242 | /** |
||
| 243 | * @param $type |
||
| 244 | * @param $nom |
||
| 245 | * récupération du temmp de recrutement + les ressources nécéssaires |
||
| 246 | */ |
||
| 247 | private function getInfosRecrutementUnite($type, $nom) { |
||
| 264 | //-------------------------- END GETTER ----------------------------------------------------------------------------// |
||
| 265 | |||
| 266 | |||
| 267 | //-------------------------- SETTER ----------------------------------------------------------------------------// |
||
| 268 | /** |
||
| 269 | * @param $nom -> nom de l'unité à recruter |
||
| 270 | * @param $type -> type de l'unité à recruter |
||
| 271 | * @param $nombre -> nombre d'unité à recruter |
||
| 272 | * fonction qui permet d'initialiser le début du recrutement d'unités |
||
| 273 | */ |
||
| 274 | public function setCommencerRecruter($nom, $type, $nombre) { |
||
| 312 | |||
| 313 | /** |
||
| 314 | * @param $id_recrutement |
||
| 315 | * fonction appellée dans celle qui récupère les recrutement uniquement quand celui ci est finit |
||
| 316 | * fonction qui sert à terminer un rcrutement et ajouter les unités dans la base |
||
| 317 | */ |
||
| 318 | private function setTerminerRecrutement($id_recrutement) { |
||
| 341 | |||
| 342 | /** |
||
| 343 | * @param $nombre_unite |
||
| 344 | * @param $nom_unite |
||
| 345 | * @param $type_unite |
||
| 346 | * @param $id_mission |
||
| 347 | * @return bool |
||
| 348 | * permet de lancer des unites en expédition en ajoutant à chaque unité un id_mission |
||
| 349 | */ |
||
| 350 | public function setCommencerExpedition($nombre_unite, $nom_unite, $type_unite, $id_mission) { |
||
| 370 | |||
| 371 | /** |
||
| 372 | * @param $id_mission |
||
| 373 | * @param $pourcentage_perte |
||
| 374 | * @return int |
||
| 375 | * fonction qui termine une expdedition au niveau des troupes, cette fonction s'occupe d'en |
||
| 376 | * supprimer de la bdd en fonction du nombre de troupe envoyé et du cpourcentage de perte |
||
| 377 | */ |
||
| 378 | public function setTerminerExpedition($id_mission, $pourcentage_perte) { |
||
| 411 | |||
| 412 | /** |
||
| 413 | * @param $nombre |
||
| 414 | * fonction qui permet de tuer des unites |
||
| 415 | */ |
||
| 416 | public function setTuerUnites($nombre) { |
||
| 429 | //-------------------------- END SETTER ----------------------------------------------------------------------------// |
||
| 430 | } |
If you define a variable conditionally, it can happen that it is not defined for all execution paths.
Let’s take a look at an example:
In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.
Available Fixes
Check for existence of the variable explicitly:
Define a default value for the variable:
Add a value for the missing path: