Méthodes pour factoriser du code - Héritage et agrégation avec délégation - Exemple des entiers naturels
Les exercices qui suivent concernent une architecture en couches et passent en revue différentes méthodes de factorisation du code pour de telles architectures :
- héritage avec approche ascendante,
- héritage avec approche descendante,
- héritage multiple (en Java 8 uniquement),
- agrégation avec délégation.
Lors du TP1, il a été possible de réutiliser du code dans deux contextes différents :
- d'une part, le code des opérations algébriques a pu être recopié textuellement d'une classe d'implémentation à deux autres classes d'implémentation,
- d'autre part, deux classe d'implémentation ont pu être obtenues par héritage, afin de réutiliser l'état et les accesseurs hérités.
La possibilité d'une réutilisation doit se comprendre dans le cadre de la discipline suivie, qui requiert de stratifier une classe d'implémentation en plusieurs couches avec les dépendances locales suivantes en simplifiant légèrement :
- les accesseurs et les constructeurs dépendant des attributs,
- les fabriques dépendant des constructeurs,
- les services dépendant des accesseurs et des fabriques.
Couches d'une classe d'implémentation
Ainsi dans le premier cas, où seul l'état variait, seules les couches en contact devaient être modifiées. Dans le second cas, où seules les implémentations des services variaient, il était possible de conserver les couches inférieures, les attributs et les accesseurs (ainsi que des fabriques).
Cependant, la recopie textuelle (le "copier-coller") n'est pas une bonne pratique en programmation. Imaginons qu'on veuille faire évoluer le code copié, pour l'améliorer ou le corriger : dans ce cas, toutes les copies doivent être mises à jour, ce qui suppose qu'on en conserve un référencement exhaustif. Plutôt que de recopier, on préfère factoriser : le facteur commun est alors partagé. Nous allons étudier les méthodes de factorisation, fondées sur l'héritage et l'agrégation avec délégation.
Calcul | |||
---|---|---|---|
Via des int | Récursif | ||
Etat | Int positif | int / int | int / récursion |
Inductif |
inductif / int | inductif / récursion |
Les quatre combinaisons possibles
Table of Contents
Héritage - Approche ascendante ("bottom-up")
Analyser dans le TP1 l'utilisation de l'héritage.
Approche ascendante - Factorisation de l'état, des accesseurs et de certaines fabriques
Héritage - Approche descendante
Factoriser les services algébriques dans une classe abstraite AlgebreNatParInt.
Approche descendante - Factorisation de la couche haute
Héritage multiple (Java 8 seulement)
Factoriser la couche haute et la couche basse, en utilisant l'héritage multiple. Réaliser les quatre implémentations possibles.
Héritage multiple - Factorisation des deux couches
Agrégation avec délégation
Factoriser la couche haute et la couche basse, en utilisant lagrégation avec délégation. Réaliser les quatre implémentations possibles.
Agrégation avec délégation - Factorisation des deux couches