Dans cet article nous allons aborder une autre prose de la programmation objet : le modèle de conception « Patron de méthode » (Template method).
Ce pattern (fréquemment utilisé dans les classes abstraites) propose de développer un algorithme basé sur des primitives que l’on trouvera uniquement dans les classes filles.
Dans notre exemple nous allons développer un système de validation de données basique qui met en avant ce modèle.
interface IValidator {
public function assert ($pValue);
}
abstract class AbstractValidator implements IValidator {
/**
* La "template method"
*
* la fonction vérifie que $pValue est correcte,
* lève une exception sinon
*/
public function assert ($pValue){
if (($result = $this->_validate ($pValue)) !== true){
throw new Exception (
'Erreur de validation de donnée '.
(is_array($result) ? implode(',', $result) : $result)
);
}
return true;
}
/**
* Fonction "primitive" faisant parti de l’algorithme
* que les fils devront implémenter
*
* @return true|mixed $pValue true en cas de succès,
* un tableau ou une chaine de caractère sinon, qui
* contiendra le ou les messages d'erreur
*/
abstract protected function _validate ($pValue);
}
L’exemple est ici particulièrement simple avec un patron de méthode qui se base sur une seule primitive. Il est bien sûr possible de trouver des formes plus complexes mettant en oeuvre X primitives.
Déclinaison de l’algorithme
Nous pouvons maintenant décliner l’algorithme sur plusieurs tâches comme vérifier que l’élément donné est un tableau, un objet, … ou n’importe quel type de donnée complexe à valider comme un compte épargne créditeur.
class ValidatorObject extends AbstractValidator {
protected function _validate ($pValue){
return is_object($pValue) ? true : 'La valeur n\'est pas un objet';
}
}
class ValidatorArray extends AbstractValidator {
protected function _validate ($pValue){
return is_array($pValue) ? true : 'La valeur n\'est pas un tableau';
}
}
class ValidatorCompteEpargneCrediteur extends AbstractValidator {
protected function _validate ($pValue){
if (is_object($pValue)){
if ($pValue instanceof ICompteEpargne){
if ($pValue->getSolde () > 0){
return true;
}
}
}
return 'Ce n\est pas un compte épargne au solde créditeur';
}
}
//Pour la forme, un code exemple d'appel
$validator = new ValidatorCompteEpargneCrediteur();
$validator->assert(new StdClass());//lancera une exception
Articles sur le même sujet :
3 Comments.