01-08-2013, 10:32 PM
Salut,
Je viens défendre mon point de vue, et désolé Xenos, j'ai 21 ans et je sui pas d'accord avec toi
Le principe d'un objet n'est pas de ne rien connaitre sur lui, mais d'offrir un certains nombre d'interactions et de configurations, à travers ses méthodes et attributs publiques. Tout ce qui ne sert pas de données d'entrées ou de sortie ne doit pas être exposé, il s'agit des rouages internes.
Dans le cas d'une bibliothèque, je lui demande de stocker mes livres et de pouvoir les retrouver plus tard. Les livres eux-mêmes ne font pas parti des mécanismes internes de la bibliothèque, ce sont des objets fournis par l'utilisateur de la bibliothèque, et dont la bibliothèque sert à manipuler plus simplement.
En revanche, savoir que les livres sont stockés dans un Array ou autre, cela ne nous intéresse pas. C'est un détail d'implémentation.
Faire un library.arrayBook.forEach(callback) n'est donc pas une bonne solution, puisque l'on expose arrayBook.
Dans ce cas, la bibliothèque qui utilise un Array (par héritage ou composition, les deux ont des avantages et inconvénients) devrait proposer sa propre méthode forEach.
On obtient alors library.forEach(callback). Rien ne nous dit qu'en interne un Array est utilisé, et la bibliothèque peut faire ses vérifications (par exemple lancer une exception si un livre est abîmé durant l'opération).
Je ne considère pas le fait de passer une callback comme un problème d'un point de vue POO. La notion de callback vient du monde de la programmation fonctionnelle, mais elle n'est pas incompatible avec la POO. On peut voir ça comme une demande de l'utilisateur à la bibliothèque: "effectue cette action sur tout les livres pour moi".
L'action elle-même est du code utilisateur et n'est pas connu par la bibliothèque. Mais cela ne gère pas la bibli: elle propose d'appliquer un certain type d'action sur ses livres (dans notre cas, une fonction (Book) -> void) sans se poser de questions.
Enfin, pour résoudre la spécialisation des bibliothèques (papier ou électronique), on a les interfaces (ou classe abstraites suivant les langages).
On aurait deux classes Library et Book, abstraites. Avec 2 spécialisation: d'un coté les classes PaperLibrary et PaperBook, de l'autre les classes ElectronicBook et ElectronicLibrary.
Si on veut changer de type de bibliothèque, ça pose pas de problème. Et si on utilise les 2 types de bouquins en même temps, oui, il peut y avoir des problèmes, mais c'est à la bibliothèque de gérer ça (soit en refusant le livre à coup d’exceptions et de code d'erreurs, soit en le convertissant).
PS: J'ai pas trouvé de formatage pour écrire du code inline sur le forum. Y'a un moyen de faire ça ?
Je viens défendre mon point de vue, et désolé Xenos, j'ai 21 ans et je sui pas d'accord avec toi
Le principe d'un objet n'est pas de ne rien connaitre sur lui, mais d'offrir un certains nombre d'interactions et de configurations, à travers ses méthodes et attributs publiques. Tout ce qui ne sert pas de données d'entrées ou de sortie ne doit pas être exposé, il s'agit des rouages internes.
Dans le cas d'une bibliothèque, je lui demande de stocker mes livres et de pouvoir les retrouver plus tard. Les livres eux-mêmes ne font pas parti des mécanismes internes de la bibliothèque, ce sont des objets fournis par l'utilisateur de la bibliothèque, et dont la bibliothèque sert à manipuler plus simplement.
En revanche, savoir que les livres sont stockés dans un Array ou autre, cela ne nous intéresse pas. C'est un détail d'implémentation.
Faire un library.arrayBook.forEach(callback) n'est donc pas une bonne solution, puisque l'on expose arrayBook.
Dans ce cas, la bibliothèque qui utilise un Array (par héritage ou composition, les deux ont des avantages et inconvénients) devrait proposer sa propre méthode forEach.
On obtient alors library.forEach(callback). Rien ne nous dit qu'en interne un Array est utilisé, et la bibliothèque peut faire ses vérifications (par exemple lancer une exception si un livre est abîmé durant l'opération).
Je ne considère pas le fait de passer une callback comme un problème d'un point de vue POO. La notion de callback vient du monde de la programmation fonctionnelle, mais elle n'est pas incompatible avec la POO. On peut voir ça comme une demande de l'utilisateur à la bibliothèque: "effectue cette action sur tout les livres pour moi".
L'action elle-même est du code utilisateur et n'est pas connu par la bibliothèque. Mais cela ne gère pas la bibli: elle propose d'appliquer un certain type d'action sur ses livres (dans notre cas, une fonction (Book) -> void) sans se poser de questions.
Enfin, pour résoudre la spécialisation des bibliothèques (papier ou électronique), on a les interfaces (ou classe abstraites suivant les langages).
On aurait deux classes Library et Book, abstraites. Avec 2 spécialisation: d'un coté les classes PaperLibrary et PaperBook, de l'autre les classes ElectronicBook et ElectronicLibrary.
Si on veut changer de type de bibliothèque, ça pose pas de problème. Et si on utilise les 2 types de bouquins en même temps, oui, il peut y avoir des problèmes, mais c'est à la bibliothèque de gérer ça (soit en refusant le livre à coup d’exceptions et de code d'erreurs, soit en le convertissant).
PS: J'ai pas trouvé de formatage pour écrire du code inline sur le forum. Y'a un moyen de faire ça ?