2010-03-02 3 views
2

Disons que je dois concevoir un système pour une collection de livres. Et supposons que j'ai des millions de livres et pour simplifier nous n'avons pas besoin d'ajouter ou de retirer des livres du système.One Vs Objets multiples - Java ou tout autre PO

Je peux créer une classe de livre et d'initier un tableau de la taille de la collection:

Book book = new Book[number of books]; 

Dans ce cas, livre comprendront des champs tels que:

long bookIsbn 
String bookTitle 

Ou, au contraire, initier un seul objet:

Book book = new Book(); 

Dans ce cas, la classe Book doit inclure des tableaux/listes/cartes, etc. qui comprennent des informations sur l'ensemble de la collection. Par exemple:

Map<Integer, String> isbnToTitle = new Map<Integer, String>(); 

Quelle représentation est la plus efficace? ou peut-être pour reformuler la question, qui est considérée comme une meilleure approche de POO?

Merci!

+4

"plus efficace" et "meilleure approche POO" ne font pas vraiment référence à la même chose, donc l'un n'est pas une reformulation de l'autre. –

+0

Problème d'efficacité sous-jacente: Object Arrary vs. Map. Ils ont des avantages/inconvénients respectifs comme vous le savez. – solotim

+0

Oui, Object Arrary vs Map est une question de ce qui est mieux pour l'application spécifique. Mais oublions la carte, pour l'application générale, mon souci avec la première solution est que j'ai besoin de créer des millions d'objets du type Livre, où dans la deuxième solution, je crée seulement un objet de Livre, puis dans le Livre I peut créer un tableau de primitives (qui pourrait être plus facile à gérer pour Java que des millions d'objets Class - c'est principalement ma question). – user247866

Répondre

12

Considérant POO: Pensez à ce un livre est et dont propriétés il a. Un livre ne fait certainement pas savoir sur d'autres livres, donc la deuxième approche est pas le chemin à parcourir.

Tableaux ... eh bien oui si c'est suffisant. La meilleure chose (du point de vue du modèle) serait de créer une classe Book et une classe, par exemple,
Library qui gère tous les livres. Ensuite, la dernière classe contient une liste de tous les livres et fournit des opérations sur tous les livres.

+0

Donc, si je comprends bien, Library inclurait une liste de livres, ce qui signifie que pour chaque livre, je crée un objet Book et l'ajoute à la liste. – user247866

+0

@ user247866: Vous ajoutez généralement une * référence * au livre (c'est-à-dire son code dans le système Bibliothèques). Il ne serait pas vraiment approprié de tenir tous les livres à l'intérieur de la bibliothèque directement. (Considérez ce qui se passe si un livre est retiré de la bibliothèque, il est toujours "là", juste prêté.) Vous pouvez le refléter dans une collection séparée, sans doute qui pourrait contenir des "Livres", mais cela serait ingérable (et inapproprié) de le faire de cette façon, à mon humble avis). –

+0

Mais les choses sont, si j'ai besoin, par exemple, d'une méthode de recherche par isbn, de recherche par auteur et de recherche par titre. Je dois courir au-dessus du tableau/liste de livre qui est lent. Si à la place j'ajoute aux cartes de la bibliothèque 3 - isbn, titre, et auteur, alors je peux faire la recherche dans le temps constant et. Cela pourrait être un gaspillage de mémoire et un mauvais design, mais très rapide. Et c'est mon problème, de nombreuses fois les solutions laides ont des avantages importants. – user247866

2

différentes préoccupations distinctes:

1) Créer un livre avec ses attributs (titre, auteur, etc.) et méthodes (lecture, étagère, prêter, emprunter).

2) Créer une structure de données pour stocker vos livres qui prend en charge les opérations que vous voulez (recherche par auteur, seach par titre, parcourir, etc.)

+2

"prêter"/"emprunter" n'appartient pas à une classe "Livre". Ils appartiennent à l'objet 'Library', et prennent' Book' comme paramètres. (FWIW, je vous ai rabaissé pour cela, mais seulement parce que vous aviez été mis en minorité deux fois [vraisemblablement pour avoir inclus la phrase de fantaisie 'séparation des préoccupations'). –

+0

@silky: Je pense qu'on peut discuter à ce sujet. Ce sont des questions de conception détaillées où il n'y a pas de bien et de mal. –

+1

@Felix Bien sûr, on peut discuter à ce sujet, et on aurait tort (à mon humble avis), d'où mon désaccord et downvote. Je pense qu'il n'est pas naturel pour un livre de fournir la possibilité de se «prêter» (inutile de dire, il faudrait accéder aux propriétés de la bibliothèque pour effectuer cette fonction, et ce serait une erreur, à mon humble avis, d'inclure ce genre de logique par exemple, imaginez que le livre n'est plus dans la bibliothèque, vous pouvez toujours appeler cette fonction, ce qui est un non-sens). –

1

Il s'agit de ce qui est vraiment logique. «Livre» n'est pas un nom logique pour un conteneur qui stocke beaucoup de livres. Vous pouvez simplement le modéliser comme le monde le fait. Et, comme vous l'entendrez souvent en tant que débutant, «efficacité» ne doit pas être considérée (généralement) lors de la conception de vos structures.

Vous concevez pour l'exactitude, la logique et la «signification». (ainsi que, évidemment, fonctionnement général de celui-ci). L'efficacité peut (typiquement) venir dans le cadre de l'implémentation . Il peut être tel que lorsque vous passez en revue votre conception et essayez de l'implémenter, vous découvrez qu'un composant ne sera pas efficace. Dans ce cas, vous essayez de résoudre cela dans le contexte de la conception globale, ou vous ajustez la conception de manière significative, en fonction de vos résultats (ce qui est rare, cependant).

+0

Ce type de considération d'efficacité doit être ignoré jusqu'à ce que le profilage ultérieur montre que c'est un problème; mais l'efficacité en général ne doit pas être ignorée. Vous ne devriez pas utiliser de bubbleort jusqu'à ce que le profilage montre que le quicksort serait plus rapide; vous devriez utiliser un tri rapide, de préférence à partir d'une bibliothèque, dès le début. –

0

Les deux ne sont pas corrects.

Vous pouvez envisager d'avoir un objet Book (avec le titre, le code ISBN) et un objet Library (ou Bookstore, ou Shelf) avec une collection d'objets Book.

Vous n'ajoutez pas de "Titre et ISBN" à un livre, dans la réalité. Vous pouvez ajouter un livre à une bibliothèque. La POO ne consiste pas nécessairement à imiter des entités de la vie réelle, mais votre façon de faire est un peu étrange et pourrait dérouter quiconque lisant votre code.

2

Je ne pense pas que la question soit assez informative pour répondre dans le bon sens. OO est, avant tout, sur l'endroit où tracer la ligne. Si vous modélisez un livre, et il devrait avoir et ISBN, c'est bien, mais un fanatique OO aurait aussi vous équiper le livre avec un tableau de feuilles, chaque feuille ayant exactement deux pages, chaque page ayant un numéro de page, et un tableau de Line-s, chaque Line étant un tableau de caractères. Ou peut-être une chaîne. Mais alors, une chaîne n'est pas vraiment bonne OO dans ce cas. Vous devez prendre une décision sur l'endroit où arrêter la modélisation, et il est important de réaliser que vous ne modélisez pas le mot réel, mais plutôt une négociation de métaphores dans l'esprit du (second) programmeur et de la machine. Ce que vous faites est en même temps expliquer quelque chose à la machine et à un lecteur. OO peut être un bon outil, mais il peut aussi être utilisé pour obstruer. Faites attention! Rester simple!

Si la seule chose dont vous avez besoin est de rechercher un titre basé sur un ISBN, alors, restez simple:

Map<String, String> indexedBookList; 

Si vous pensez que la fonctionnalité peut se développer, vous devriez peut-être créer un

class Book { 
    String title; 
    String isbn; 
    String author; 
} 

et garder tous vos livres dans un

List<Book> bookList; 

Là encore, il se pourrait que votre projet se développe à partir de cette petite chose statique en quelque chose qui doit communiquer avec une base de données SQL, qui se met à jour de manière occulte et hors de votre contrôle. Ensuite, il pourrait être préférable, pour plus de lisibilité, de rester simple et de modéliser la base de données, plutôt que d'essayer de modéliser le monde réel. La programmation consiste à dire à une machine quoi faire et, en même temps, à dire à d'autres personnes ce que nous essayons de dire à la machine. La caractéristique la plus importante dans votre code, c'est qu'il est lisible par le programmeur qui a besoin de le comprendre. Dans une année, ça pourrait être toi.

+0

Bonne réponse. Merci. (Je ne peux pas encore voter pour les réponses ...) – user247866

Questions connexes