04-06-2015, 06:09 PM
(04-06-2015, 04:42 PM)Xenos a écrit :Citation :Avec getAge() je ne peux pas faire ce genre de choses. Je ne suis pas soupleJe te le redis: oui, tu le peux (à condition de passer l'appelant en paramètre du getAge; sinon, ça repose sur la stacktrace, et c'est plutôt lent), et c'est la responsabilité de la classe appelée (et non de l'appelante) qui est engagée (via instanceof ou n'importe quel autre mécanique interne).
Exemple:
Code PHP :<?php
class Client implements IClient {
private $combienDeFoisLINSEEMaDemande = 0;
public function getAge($caller) {
// discriminer via instanceof
// ou via n'importe quel autre critère
// comme le nombre de sollicitations de l'INSEE
}
}
class Barman {
//...
$client->getAge($this);
}
Dans cet exemple tu ne peux RIEN faire avec $caller.
Sauf si tu t'amuses à faire des "$caller instanceof", mon dieu... Ca t'impose de connaître le monde extérieur et plus que toi.
Si j'ajoute une nouvelle classe, je dois rajouter un cas instanceof, mon objet Client doit donc avoir connaissance de tout le monde extérieur. Nettement pire qu'avec une interface ou ça va casser directement et tu vas le voir, là tu ne le verra pas.
(04-06-2015, 04:42 PM)Xenos a écrit : D'ailleurs, en East, tu exposes le fait que le Client peut répondre différemment suivant si un Barman, un Policier, ou l'INSEE demande l'age. Tu en sais finalement plus que tu ne le crois sur cet appelé. En approche classique, t'en sais rien. Si cela se trouve, l'appelé ignorera complètement le typage de l'appelant, ou alors il se basera sur des critères externes à l'appelant, etc.Tu sais quel type d'objet sait et à quel type de message il sait répondre, ce qui est définis par un contrat (l'interface).
Ton objet ne doit donc pas deviner le monde extérieur. Et n'a donc aucune dépendance à l'extérieur. Puisque tout ce qu'il doit connaitre est définis dans sa classe à lui. Quand on a getAgeByBarman(Barman $age) ton objet à connaissance qu'il va travailler avec un Barman, tout est bien déterminé.
(04-06-2015, 04:42 PM)Xenos a écrit : Attends, là, le problème du askAge peut retourner ce qu'il veut, c'est inhérent au langage PHP, et c'est même ce que tu en attends quand tu dis East permet de "retourner" ce que je veux: null, un faux age, ou pas un age.Non pas du tout, en East si il décide de donner son âge (déjà il peut décider de ne pas le faire) dans tous les cas il devra le donner au format déterminé par le receveur. Donc si le receveur n'autorise pas null, tu ne pourras pas donner null.
(04-06-2015, 04:42 PM)Xenos a écrit : Il sera en plus possible de le typehinter en version 7; donc si l'argument est East c'est bien car je peux 'typer' mes retours, il sera invalide en PHP7 (et East comblerait alors une lacune du langage: c'est un paradigme pour faire un langage, pas pour l'utiliser).Encore une fois, il ne s'agit pas de retourner des valeurs, ou de typer les retours. Mais de demander à l'utilisateur de communiquer une donnée au format choisi par le receveur. C'est pas l'utilisateur qui choisi.
(04-06-2015, 04:42 PM)Xenos a écrit : De plus, en un sens, on s'en "fiche" de ce qui est retourné, puisque ce que l'on veut, c'est le comparer à $this->minAge. Si tu veux blinder tes codes, tu peux toujours faire
Code PHP :<?php
$clientRawAge = $client->askAge();
$clientAge = (int)$clientRawAge; // On peut aussi tester instanceof TimeInterval qui serait un valueobject
return $clientAge > $this->minAge &&...