32 votes

POO : Quelle classe doit posséder une méthode ?

J'ai du mal à comprendre comment les classes sont liées à leurs méthodes. Est-ce qu'une méthode est quelque chose que l'objet fait ou quelque chose qui est fait à le ? Ou s'agit-il d'un concept entièrement différent ?

Plus précisément, dans le système logiciel d'une bibliothèque, est-ce que l'élément borrow() appartient à la classe représentant l'usager de la bibliothèque, ou à la classe représentant l'article que l'usager emprunte ? Mon intuition me dit que cela devrait se lire comme suit patron.borrow(copy) comme la structure des phrases en anglais, subject.verb(object) mais mon instructeur dit que c'est faux, et je ne comprends pas pourquoi il aurait borrow() appartiennent à la Copy (et il n'explique pas vraiment les choses très bien). Je ne cherche pas à me justifier, mais quelqu'un peut-il m'expliquer la bonne relation ?

Edit : Cette question a été fermée comme "hors sujet". Je ne comprends pas. Les questions sur la conception de logiciels ne sont-elles pas appropriées pour ce site ?

12voto

Ryan Fernandes Points 3938

Subjectif :) mais honnêtement, j'irais avec les Modèle d'expert en information et dire quelque chose comme

library.lend(item, patron)

La bibliothèque contient les informations sur les documents qu'elle possède (peut-être dans son catalogue).
La bibliothèque prête le document à l'usager (qu'elle connaît parce qu'elle l'enregistre).

Je ne sais pas comment votre instructeur voit cela, mais c'est le niveau d'"abstraction" (objets logiciels imitant des entités du monde réel) qui aurait du sens pour votre scénario.

10voto

6502 Points 42700

Vous ne devez pas confondre l'idée de la POO avec une incarnation spécifique comme Java ou C++.

Cette limite "les méthodes sont une propriété de l'objet" ne fait pas partie de l'idée de la POO, mais juste de certaines implémentations et comme vous l'avez découvert, elle ne s'adapte pas bien.

Combien de méthodes un objet "nombre entier" devrait-il avoir ? Qu'est-ce qui est le plus logique... myfile.write(myint) o myint.write(myfile) ? Il n'y a pas vraiment de bonne réponse générale à cette question. L'idée d'une méthode faisant partie d'un objet unique est un cas particulier et parfois, la flexion nécessaire pour adapter le problème à cette solution peut devenir perceptible ou même proche de l'échec. La réponse n'est totalement acceptable que lorsqu'une méthode n'a pas d'autres paramètres que l'objet traité : la répartition unique n'est une réponse parfaite que lorsqu'un seul type est impliqué.

Dans d'autres langages, il existe une séparation entre les objets et les méthodes. Par exemple, vous disposez de l'objet fichier, de l'objet entier et de la méthode write(myfile, myint) qui décrit ce qu'il faut faire lorsque l'opération est nécessaire... et cette méthode ne fait partie ni du fichier ni de l'entier.

8voto

Konstantin Oznobihin Points 3328

Quelques mots génériques d'abord.

La construction de logiciels n'est pas quelque chose qui devrait être régi par les règles de la langue anglaise ou la "beauté" ou autre, c'est une discipline d'ingénierie. Demandez-vous si votre conception résout le problème, si elle sera maintenable, si elle sera testable, s'il sera possible de paralléliser le développement, etc. Si vous voulez quelque chose de plus formel, jetez un coup d'œil au document "On the Criteria To Be Used in Decomposing Systems into Modules" de D. L. Parnas.

Quant à l'exemple de votre bibliothèque. Imaginez que vous ayez une copie en dehors de la bibliothèque, devrait-elle avoir borrow méthode alors ? Comment l'emprunt est-il enregistré ? Êtes-vous d'accord pour que les classes Copy ou Patron soient responsables du stockage des données ? Il semble plus approprié de mettre borrow dans une classe de la Bibliothèque. Les responsabilités seront clairement réparties, vous n'aurez pas besoin d'en savoir beaucoup sur les emprunts pour mettre en œuvre Copy et Patron et vous n'aurez pas besoin de beaucoup de détails sur eux pour mettre en œuvre Library.

3voto

krishnakumarp Points 2676

Comme l'a dit @Ryan Fernandes, l'opération de prêt/emprunt ne peut pas se faire avec le client ou le livre. Elle doit se faire avec une classe qui connaît l'état de tous les livres et de tous les usagers de la bibliothèque. Par exemple, y a-t-il des réservations en cours pour un livre ? Combien d'exemplaires sont disponibles ? Cet usager a-t-il payé tous les frais ? A-t-il droit à ce livre ? Donc, typiquement, cela devrait être dans la classe Library ou LibraryService.

3voto

neo Points 307

Les méthodes publiques exposées depuis une classe sont les tâches qui peuvent être exécutées sur l'entité. De cette façon, la classe ne fait qu'encapsuler son comportement.

Par exemple : si je dis

Computer.TurnOn()

La méthode ne fonctionne que sur le système informatique.

Au lieu de cela, si je dis,

Untel.Allumerl'ordinateur()

Le quelqu'un aura maintenant la responsabilité d'allumer l'ordinateur (définir les propriétés liées à l'ordinateur), ce qui signifie que nous ne respectons pas le concept d'encapsulation et que nous dispersons les propriétés de la classe partout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X