Je lis des objets PHP, des modèles et de la pratique . L'auteur essaie de modéliser une leçon dans un collège. L'objectif est d'afficher le type de leçon (conférence ou séminaire), et les frais pour la leçon selon qu'il s'agit d'une leçon horaire ou à prix fixe. La sortie doit donc être
Lesson charge 20. Charge type: hourly rate. Lesson type: seminar.
Lesson charge 30. Charge type: fixed rate. Lesson type: lecture.
lorsque l'entrée est la suivante:
$lessons[] = new Lesson('hourly rate', 4, 'seminar');
$lessons[] = new Lesson('fixed rate', null, 'lecture');
J'ai écrit ceci:
class Lesson {
private $chargeType;
private $duration;
private $lessonType;
public function __construct($chargeType, $duration, $lessonType) {
$this->chargeType = $chargeType;
$this->duration = $duration;
$this->lessonType = $lessonType;
}
public function getChargeType() {
return $this->getChargeType;
}
public function getLessonType() {
return $this->getLessonType;
}
public function cost() {
if($this->chargeType == 'fixed rate') {
return "30";
} else {
return $this->duration * 5;
}
}
}
$lessons[] = new Lesson('hourly rate', 4, 'seminar');
$lessons[] = new Lesson('fixed rate', null, 'lecture');
foreach($lessons as $lesson) {
print "Lesson charge {$lesson->cost()}.";
print " Charge type: {$lesson->getChargeType()}.";
print " Lesson type: {$lesson->getLessonType()}.";
print "<br />";
}
Mais selon le livre, je me trompe (je suis presque sûr que je le suis aussi). Au lieu de cela, l'auteur a donné une grande hiérarchie de classes comme solution. Dans un chapitre précédent, l'auteur a déclaré les «quatre panneaux indicateurs» suivants comme le moment où je devrais envisager de changer la structure de ma classe:
- Duplication de code
- La classe qui en savait trop sur son contexte
- Le cric de tous les métiers - des classes qui essaient de faire beaucoup de choses
- Expressions conditionnelles
Le seul problème que je peux voir, ce sont les déclarations conditionnelles, et cela aussi de manière vague - alors pourquoi refactoriser cela? À votre avis, quels problèmes pourraient survenir à l'avenir que je n'ai pas prévus?
Mise à jour : j'ai oublié de mentionner - c'est la structure de classe que l'auteur a fournie comme solution - le modèle de stratégie :