Un exemple simple , revenons aux bases de l'objet, imaginons une classe personnes, imaginons que nous ayons besoins de savoir si une personne à des enfants, pour faire cela , on peu imaginer que nous avons une collection ou un tableau d'enfant dans l'objet et donc on aurait une methode qui retourne true si la liste des enfants n'est pas vide.
Ou placer cette methode ? la reponse est DANS L'OBJET METIER Personne. Imaginons que dans une premiere implementation nous ayons utiliser un tableau d'enfants Personne[] enfants; si nous suivons votre ligne de conduite nous avons une classe de service pour la classe personne dans laquelle nous mettrons isParent et retourne true si le tableaux n'est pas vide. Mais en faisant ca vous etes obliger d'ouvrir l'implementation de la classe personne en gros vous mettez un getEnfants public dans personnes.
Les problemes sont multiple d'abord la personne qui implemente le service qui n'est pas forcement la meme que le developpeur de l'objet personne , se DOIT de connaitre l'implementation de personne et dois savoir que enfants est un array, ensuite les developpeur qui utiliserons Personne et qui ne voit pas de methode isParent dans Personne mais qui vois un array d'enfants se dise qu'il vont faire eux meme le test c'est facile getEnfant().lenght > 0 et hop le tour est jouer hop flagrant delis de duplication de code !!!!!
Autre probleme l'implementation change nous passons a un arraylist le test n'est plus le meme, il devient enfant.size()> 0 , en modifiant une petite chose dans personnes nous devons modifier plusieurs classe surtout si nous avons de la duplication de code.
Comment j'aurais fait ?
Simple une collection d'enfant private , pas de getters dessus, l'implementation est alors encapsuler (un des 3 grand principe de l'objet) dans personnes et une methode public isParent() qui contiendra l'unique version du code permettant de savoir si une personne a des parents ou non, et qu'on viennent pas me dire que ca pollu mon objet , ca le rend un peu moins stupide, et surtout ca evite de POLLUER une classe service qui effectivement contient de la logique metier mais avec une plus grosse granularité en utilisant les services de granularité plus fine rendu par les objet metier.
Partager