février
2009
Si j’étais un objet, je serai une instance d’EtreHumain (voir les épisodes précédents)
Comment je viens au monde ?
Un développeur Java pourrait suggérer : new EtreHumain();
Si vous avez lu mon article précédent, vous aurez compris que cette réponse est loin de me satisfaire.
Dans le cas contraire, je vais vous expliquer pourquoi cette réponse ne me convient pas vraiment alors qu’au final, il y aura bien cette instruction quelque part !
Vous vous doutez bien que l’appel à ce constructeur ne crée pas un un être humain mais une structure de données représentant un être humain. Le problème n’est donc pas là.
Le problème, c’est que cette instruction appartient au niveau technique et non au niveau fonctionnel.
Elle ne devrait donc pas être accessible directement depuis n’importe quelle classe cliente, surtout si on ne souhaite pas modéliser la création d’EtreHumain !
Et même dans le cas où on souhaite la modéliser, comment rendre applicable les règles fonctionnelles concernant cette création si on ne l’encapsule pas dans une méthode de création ?
Voyons donc quelle pourrait être cette méthode fonctionnelle ?
Le plus naturellement possible !
Et si la classe EtreHumain avait une méthode : public EtreHumain metAuMonde()
Bien vu mais non ! Ce qui me dérange, c’est que cette méthode soit dans la classe EtreHumain alors qu’elle ne concerne même pas la moitié d’entre eux.
Remarquons au passage que c’est un problème typique de POO ! Certains s’en satisfont très bien en disant qu’une méthode qui ne s’applique pas à toutes les instances retournera null
ou lancera une Exception
pour les cas inappropriés. Personnellement, cela ne me satisfait pas.
Le choix de la classe EtreHumain montrerait t’elle ses premières limites dans le cadre de ma modélisation ? Les deux classes Homme/Femme ne sont t’elles pas plus justifiées tout à coup ? Classes où seule la classe Femme contiendrait cette méthode :
public class
Femme
extends
EtreHumain
implements
PeutMettreAuMonde<EtreHumain>
où l’interface générique PeutMettreAuMonde<E>
aurait la méthode public
E metAuMonde()
.
On pourrait hésiter à placer cette méthode dans cette classe en faisant remarquer une fois de plus que toutes les instances ne sont pas forcément concernées (Toutes celles qui ne sont pas enceintes). Toutefois, la différence avec précédemment, c’est que potentiellement, elles pourraient l’être !
Conceptuellement, je trouve cela beaucoup plus satisfaisant ! Surtout que mine de rien, l’interface a été travaillée :
- Le nom de l’interface évoque bien la potentialité.
- Les noms de l’interface et de sa méthode se veulent le plus général possible pour s’appliquer également à d’autres mammifères et même d’autres espèces. (Je trouvai une interface Enceinte avec sa méthode accouche() trop spécifique : dans ce cas là, plus besoin d’interface !)
- La méthode
metAuMonde
renvoit unE
et pas uneList<E>
car c’est le cas le moins général et même dans ce cas, ils viennent au monde un après l’autre …
Avec une telle modélisation, je suis donc une instance d’Homme !
A suivre …