21-05-2015, 02:08 PM
Donc, dans le Cas 5, il suffit d'appliquer la règle je passe toujours l'appelant en paramètre à mes méthodes, sans forcément faire de East.
Mais du coup, tu passes l'appelant partout, même s'il n'y en a pas besoin: cela va surcharger le nombre de paramètres inutiles des méthodes. Ne passer que ce qui sert a l'avantage de limiter le contexte auquel l'objet appelé peut accéder.
East obligerait donc l'appelé à se plier aux choix de l'appelant? En quoi est-ce une bonne chose?
Exemple d'explosion combinatoire des méthodes:
Si Policier et Douanier peuvent demander les papiers, alors on a:
• TypeNormal donne toujours ses Papiers au Policier et au Douanier
• Delinquant se base sur le matricule du Policier, son grade, son âge, et son sexe; pour le Douanier, il se base sur son grade, le n° de son poste frontière, sa corpulence, et sa position géographique.
• Mafieux se base sur le matricule et le grade du Policier ou du Douanier
• Policier et Douanier ne donnent leurs papiers que si le grade de celui qui les demande est supérieur
→ En West, 1 getPapiers() pour chaque classe, 4 getters sur Policier, 4 getters sur Douanier
En East, tu fais cela comment? Parce que si Policier et Douanier ont un machinAskedByDelinquant et machinAskedByMafieux, cela va faire... 16 méthodes ?!
Policier->matriculeAskedByDelinquant, Policier->matriculeAskedByMafieux, Policier->gradeAskedByDelinquant, Policier->gradeAskedByMafieux, Policier->gradeAskedByPolicier, Policier->gradeAskedByDouanier, Policier->ageAskedByDelinquant, Policier->sexeASkedByDelinquant, Douanier->matriculeAskedByMafieux, Douanier->gradeAskedByDelinquant, Douanier->numeroPosteAskedByDelinquant, Douanier->corpulenceAskedByDelinquant, Douanier->positionGeoAskedByDelinquant, Douanier->gradeAskedByMafieux, Douanier->gradeAskedByPolicier, Douanier->gradeAskedByDouanier
Et encore, je ne compte pas les méthodes de "retour" où l'information revient à l'appeleur, type $delinquant->askPapiers(Policier $policier) → $policier->gradeAskedByDelinquant(Delinquant $delinquant) → $deliquant->voiciMonGrade(Policier $policier, Grade $grade
Mais du coup, tu passes l'appelant partout, même s'il n'y en a pas besoin: cela va surcharger le nombre de paramètres inutiles des méthodes. Ne passer que ce qui sert a l'avantage de limiter le contexte auquel l'objet appelé peut accéder.
Citation :Le délinquant est obligé de parler avec Policier selon le choix du dialogue du Policier (via l'interface Policier)Je ne vois pas l'intérêt: d'un part, tu te places dans un système de transitions, et non un système d'états (si Delinquant est contraint par l'origine du message qu'il a reçu, alors il faudra autant de méthodes que d'origine de message possible...), d'autre part cela crée une dépendance circulaire (au moins par la déclaration des classes) entre Policier→Delinquant (car le Policier demande les papiers au Delinquant) et entre Delinquant→Policier (car le Delinquant doit retourner "manuellement" ses papiers ou son pot de vin).
East obligerait donc l'appelé à se plier aux choix de l'appelant? En quoi est-ce une bonne chose?
Exemple d'explosion combinatoire des méthodes:
Si Policier et Douanier peuvent demander les papiers, alors on a:
• TypeNormal donne toujours ses Papiers au Policier et au Douanier
• Delinquant se base sur le matricule du Policier, son grade, son âge, et son sexe; pour le Douanier, il se base sur son grade, le n° de son poste frontière, sa corpulence, et sa position géographique.
• Mafieux se base sur le matricule et le grade du Policier ou du Douanier
• Policier et Douanier ne donnent leurs papiers que si le grade de celui qui les demande est supérieur
→ En West, 1 getPapiers() pour chaque classe, 4 getters sur Policier, 4 getters sur Douanier
En East, tu fais cela comment? Parce que si Policier et Douanier ont un machinAskedByDelinquant et machinAskedByMafieux, cela va faire... 16 méthodes ?!
Policier->matriculeAskedByDelinquant, Policier->matriculeAskedByMafieux, Policier->gradeAskedByDelinquant, Policier->gradeAskedByMafieux, Policier->gradeAskedByPolicier, Policier->gradeAskedByDouanier, Policier->ageAskedByDelinquant, Policier->sexeASkedByDelinquant, Douanier->matriculeAskedByMafieux, Douanier->gradeAskedByDelinquant, Douanier->numeroPosteAskedByDelinquant, Douanier->corpulenceAskedByDelinquant, Douanier->positionGeoAskedByDelinquant, Douanier->gradeAskedByMafieux, Douanier->gradeAskedByPolicier, Douanier->gradeAskedByDouanier
Et encore, je ne compte pas les méthodes de "retour" où l'information revient à l'appeleur, type $delinquant->askPapiers(Policier $policier) → $policier->gradeAskedByDelinquant(Delinquant $delinquant) → $deliquant->voiciMonGrade(Policier $policier, Grade $grade