Citation :Le soucis et l'avantage de la souplesse et des modifications open/close, puisqu'au moins je peux lui répondre ce que je veux au Barman alors qu'avec un getter je ne peux pas.Je n'ai pas compris la phrase :\ Je re-soulève le point que PHP n'a pas de typage de retour (les type hintings sont tous facultatifs).
Peut-être pas 50 classes, okay, mais plusieurs, ce qui veut dire que les changements devront être fait à d'autres endroits du code que là où le changement est demandé. Faudrait, pour éviter cela, que East permette d'avoir une approche d'ajout d'interfaces plutôt que d'édition d'interfaces.
Supposons que getReligion n'existe pas pour le consommateur, et que le barman veuille la prendre en compte pour savoir s'il sert ou non. Je vais élaguer le code d'exemple.
Situation actuelle (West):
Code PHP :
<?php
interface IAlcoholConsummer {
public askAge();
}
interface IBarman {
public giveAlcoholTo(IAlcoholConsummer $consummer);
}
class Client implements IAlcoholConsummer {
public askAge() {
// histoire de montrer que c'est pas forcément un "getter"
return (new Date(Date.now() - $this->birthday)).asYear();
}
}
class Barman implements IBarman {
public giveAlcoholTo(IAlcoholConsummer $consummer) {
// Note qu'on présume que askAge renvoie un age en année,
// Il serait plus pertinent de ne pas présumer puisque ce n'est pas dans le contrat d'interface
return ($consummer->askAge() > $this->minAge) ? new Alcohol() : null;
// ou Alcohol.NULL dans le cadre du null-object pattern / typehinting du retour
}
}
Ajout de la religion avec modification d'interface:
Code PHP :
<?php
interface IAlcoholConsummer {
public askAge();
// L'interface est modifiée
public askReligion();
}
interface IBarman {
public giveAlcoholTo(IAlcoholConsummer $consummer);
}
class Client implements IAlcoholConsummer {
public askAge() {
return (new Date(Date.now() - $this->birthday)).asYear();
}
// La classe Client est modifiée
public askReligion() {
return $this->religion; // ou clone $this->religion
// on en revient à un des soucis des accesseurs que j'avais posé il y a bien 1 an
}
}
class Barman implements IBarman {
public giveAlcoholTo(IAlcoholConsummer $consummer) {
return (
$consummer->askAge() > $this->minAge
&& in_array($consummer->askReligion(), $this->allowedReligions)
) ? new Alcohol() : null;
}
}