Déjà, beau travail
Par simplicité, je redonne les specs.
Note d'abord que, pour les deux cas, c'est hyper-verbeux alors que le cas n'est pas si complexe (tu trouves pas?)
Dans le premier cas (West, sans instanceof):
"Conan (classe) doit donner tout son or si et seulement si c'est une Women + Kid qui le lui demande. Si c'est un Kid seul, il donne 1 pièce, si c'est une Women seule il donne 2 pièces. Un Kid seul et une Women seule ne doivent pas pouvoir lui taxer plus d'or que ça."
• J'ai demandé "si j'implémente Kid et Women", pas "Si j'implémente WomenKid". Dans ta structure, une classe externe qui implémenterait Women et Kid serait rejetée car elle n'implément pas WomenKid. Pourtant, elle implément Women et Kid, comme je l'ai demandé. Les specs ne sont pas respectées.
• Si ma classe implémente Women+Kid, et qu'elle appelle askWomenByGold, pour moi, elle devrait recevoir l'argent d'une Women+Kid. Dans ton code, la classe appelante doit savoir qu'il y a une séparation de cas entre Kid, Women, et KidWomen.
• Je trouve dommage de stocker le $gold->getValue() dans Conan. Pourquoi pas le $gold directement?
• Si t'es forcé de passer par un WomenKid pour faire du Women+Kid, tu ne sens pas l'explosion combinatoire qui arrive? il faudra implémenter les interfaces AB pour chaque couple utile? ABC pour les triplets? etc? Et si tu crées ABC, il faudra l'implémenter dans tous les codes dont la classe est A,B,C ? Rien ne va te le signaler.
Dans le second cas (East, avec ou sans instanceof):
Conan doit donner son argent à une Women si et seulement si celle-ci est majeure. Women ne doit avoir aucun moyen de taxer de l'argent si elle est mineure.
• Heu, c'est pas du East: j'ai return $this->value; dans Age
• T'as pas l'impression que executeIfGreaterOrEqualTo sera copié-collé dans d'autres classes (comme Gold) ?
• ageOfWomenIs peut être appelé dans l'ordre qu'on veut:
Tu te retrouves avec le même genre de faille que les sites amateurs où un formulaire HTML appelle un script PHP, qui le vérifies puis redirige l'utilisateur vers admin.php: si on appelle admin.php directement, on saute tous les checks.Par simplicité, je redonne les specs.
Note d'abord que, pour les deux cas, c'est hyper-verbeux alors que le cas n'est pas si complexe (tu trouves pas?)
Dans le premier cas (West, sans instanceof):
"Conan (classe) doit donner tout son or si et seulement si c'est une Women + Kid qui le lui demande. Si c'est un Kid seul, il donne 1 pièce, si c'est une Women seule il donne 2 pièces. Un Kid seul et une Women seule ne doivent pas pouvoir lui taxer plus d'or que ça."
• J'ai demandé "si j'implémente Kid et Women", pas "Si j'implémente WomenKid". Dans ta structure, une classe externe qui implémenterait Women et Kid serait rejetée car elle n'implément pas WomenKid. Pourtant, elle implément Women et Kid, comme je l'ai demandé. Les specs ne sont pas respectées.
• Si ma classe implémente Women+Kid, et qu'elle appelle askWomenByGold, pour moi, elle devrait recevoir l'argent d'une Women+Kid. Dans ton code, la classe appelante doit savoir qu'il y a une séparation de cas entre Kid, Women, et KidWomen.
• Je trouve dommage de stocker le $gold->getValue() dans Conan. Pourquoi pas le $gold directement?
• Si t'es forcé de passer par un WomenKid pour faire du Women+Kid, tu ne sens pas l'explosion combinatoire qui arrive? il faudra implémenter les interfaces AB pour chaque couple utile? ABC pour les triplets? etc? Et si tu crées ABC, il faudra l'implémenter dans tous les codes dont la classe est A,B,C ? Rien ne va te le signaler.
Dans le second cas (East, avec ou sans instanceof):
Conan doit donner son argent à une Women si et seulement si celle-ci est majeure. Women ne doit avoir aucun moyen de taxer de l'argent si elle est mineure.
• Heu, c'est pas du East: j'ai return $this->value; dans Age
• T'as pas l'impression que executeIfGreaterOrEqualTo sera copié-collé dans d'autres classes (comme Gold) ?
• ageOfWomenIs peut être appelé dans l'ordre qu'on veut:
Code PHP :
<?php
class PetitePeste implements Women {
public function ageIsAskedByHero(Hero $hero) {
}
public function racketer(Hero $hero) {
// Ca pourrait venir d'un autre bout de code:
// Dans un tel cas, bon courage pour débugger :)
$hero->ageOfWomenIs(new Age(42));
$hero->askGoldByWomen($this);
}
}
• ageOfWomenIs étant publique, elle peut également être appelée par n'importe quelle autre classe.
• Tu clones le héro, donc son or est infini. J'avais demandé à Conan de donner son argent, pas l'argent d'un clone
• Si, dans une autre méthode de Hero, il faut interroger l'age d'une Women, il faudra ajouter une méthode ageOfWomenIs, mais celle-ci existe déjà pour askGoldByWomen ?!