Complex classes like DAO 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 DAO, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 18 | class DAO { |
||
| 19 | public static $db; |
||
| 20 | |||
| 21 | private static function getCondition($keyValues,$classname=NULL) { |
||
| 38 | |||
| 39 | /** |
||
| 40 | * Charge les membres associés à $instance par une relation de type ManyToOne |
||
| 41 | * @param object $instance |
||
| 42 | * @param mixed $value |
||
| 43 | * @param array $annotationArray |
||
| 44 | * @param boolean $useCache |
||
| 45 | */ |
||
| 46 | private static function getOneManyToOne($instance, $value, $annotationArray, $useCache=NULL) { |
||
| 61 | |||
| 62 | /** |
||
| 63 | * Affecte/charge les enregistrements fils dans le membre $member de $instance. |
||
| 64 | * Si $array est null, les fils sont chargés depuis la base de données |
||
| 65 | * @param object $instance |
||
| 66 | * @param string $member Membre sur lequel doit être présent une annotation OneToMany |
||
| 67 | * @param array $array paramètre facultatif contenant la liste des fils possibles |
||
| 68 | * @param boolean $useCache |
||
| 69 | * @param array $annot used internally |
||
| 70 | */ |
||
| 71 | public static function getOneToMany($instance, $member, $array=null, $useCache=NULL, $annot=null) { |
||
| 90 | |||
| 91 | private static function getOneToManyFromArray(&$ret, $array, $fkv, $annot) { |
||
| 102 | |||
| 103 | private static function setToMember($member, $instance, $value, $class, $part) { |
||
| 112 | |||
| 113 | /** |
||
| 114 | * |
||
| 115 | * @param object $instance |
||
| 116 | * @param ManyToManyParser $parser |
||
| 117 | * @return PDOStatement |
||
| 118 | */ |
||
| 119 | private static function getSQLForJoinTable($instance, ManyToManyParser $parser) { |
||
| 125 | |||
| 126 | /** |
||
| 127 | * Affecte/charge les enregistrements fils dans le membre $member de $instance. |
||
| 128 | * Si $array est null, les fils sont chargés depuis la base de données |
||
| 129 | * @param object $instance |
||
| 130 | * @param string $member Membre sur lequel doit être présent une annotation ManyToMany |
||
| 131 | * @param array $array paramètre facultatif contenant la liste des fils possibles |
||
| 132 | * @param boolean $useCache |
||
| 133 | */ |
||
| 134 | public static function getManyToMany($instance, $member, $array=null, $useCache=NULL) { |
||
| 135 | $ret=array (); |
||
| 136 | $class=get_class($instance); |
||
| 137 | $parser=new ManyToManyParser($instance, $member); |
||
| 138 | if ($parser->init()) { |
||
| 139 | if (is_null($array)) { |
||
| 140 | $joinTableCursor=self::getSQLForJoinTable($instance, $parser); |
||
| 141 | foreach ( $joinTableCursor as $row ) { |
||
| 142 | $fkv=$row[$parser->getFkField()]; |
||
| 143 | $tmp=self::getOne($parser->getTargetEntity(), "`" . $parser->getPk() . "`='" . $fkv . "'", false, false, $useCache); |
||
| 144 | array_push($ret, $tmp); |
||
| 145 | } |
||
| 146 | } else { |
||
| 147 | self::getManyToManyFromArray($ret, $instance, $array, $class, $parser); |
||
| 148 | } |
||
| 149 | self::setToMember($member, $instance, $ret, $class, "getManyToMany"); |
||
| 150 | } |
||
| 151 | return $ret; |
||
| 152 | } |
||
| 153 | |||
| 154 | private static function getManyToManyFromArray(&$ret, $instance, $array, $class, $parser) { |
||
| 178 | |||
| 179 | /** |
||
| 180 | * Retourne un tableau d'objets de $className depuis la base de données |
||
| 181 | * @param string $className nom de la classe du model à charger |
||
| 182 | * @param string $condition Partie suivant le WHERE d'une instruction SQL |
||
| 183 | * @param boolean $loadManyToOne |
||
| 184 | * @param boolean $loadOneToMany |
||
| 185 | * @param boolean $useCache |
||
| 186 | * @return array |
||
| 187 | */ |
||
| 188 | public static function getAll($className, $condition='', $loadManyToOne=true, $loadOneToMany=false, $useCache=NULL) { |
||
| 211 | |||
| 212 | private static function loadObjectFromRow($row, $className, $invertedJoinColumns, $oneToManyFields, $members,$useCache=NULL) { |
||
| 231 | |||
| 232 | /** |
||
| 233 | * Retourne le nombre d'objets de $className depuis la base de données respectant la condition éventuellement passée en paramètre |
||
| 234 | * @param string $className nom de la classe du model à charger |
||
| 235 | * @param string $condition Partie suivant le WHERE d'une instruction SQL |
||
| 236 | */ |
||
| 237 | public static function count($className, $condition='') { |
||
| 243 | |||
| 244 | /** |
||
| 245 | * Retourne une instance de $className depuis la base de données, à partir des valeurs $keyValues de la clé primaire |
||
| 246 | * @param String $className nom de la classe du model à charger |
||
| 247 | * @param Array|string $keyValues valeurs des clés primaires ou condition |
||
| 248 | * @param boolean $useCache |
||
| 249 | */ |
||
| 250 | public static function getOne($className, $keyValues, $loadManyToOne=true, $loadOneToMany=false, $useCache=NULL) { |
||
| 264 | |||
| 265 | /** |
||
| 266 | * Supprime $instance dans la base de données |
||
| 267 | * @param Classe $instance instance à supprimer |
||
| 268 | */ |
||
| 269 | public static function remove($instance) { |
||
| 280 | |||
| 281 | /** |
||
| 282 | * Insère $instance dans la base de données |
||
| 283 | * @param object $instance instance à insérer |
||
| 284 | * @param $insertMany si vrai, sauvegarde des instances reliées à $instance par un ManyToMany |
||
| 285 | */ |
||
| 286 | public static function insert($instance, $insertMany=false) { |
||
| 307 | |||
| 308 | /** |
||
| 309 | * Met à jour les membres de $instance annotés par un ManyToMany |
||
| 310 | * @param object $instance |
||
| 311 | */ |
||
| 312 | public static function insertOrUpdateAllManyToMany($instance) { |
||
| 321 | |||
| 322 | /** |
||
| 323 | * Met à jour le membre $member de $instance annoté par un ManyToMany |
||
| 324 | * @param Object $instance |
||
| 325 | * @param String $member |
||
| 326 | */ |
||
| 327 | public static function insertOrUpdateManyToMany($instance, $member) { |
||
| 358 | |||
| 359 | /** |
||
| 360 | * Met à jour $instance dans la base de données. |
||
| 361 | * Attention de ne pas modifier la clé primaire |
||
| 362 | * @param Classe $instance instance à modifier |
||
| 363 | * @param $updateMany Ajoute ou met à jour les membres ManyToMany |
||
| 364 | */ |
||
| 365 | public static function update($instance, $updateMany=false) { |
||
| 382 | |||
| 383 | /** |
||
| 384 | * Réalise la connexion à la base de données en utilisant les paramètres passés |
||
| 385 | * @param string $dbType |
||
| 386 | * @param string $dbName |
||
| 387 | * @param string $serverName |
||
| 388 | * @param string $port |
||
| 389 | * @param string $user |
||
| 390 | * @param string $password |
||
| 391 | */ |
||
| 392 | public static function connect($dbType,$dbName, $serverName="127.0.0.1", $port="3306", $user="root", $password="", $cache=false) { |
||
| 396 | } |
||
| 397 |