Si j'ai une variable contenant un, List
il pourrait contenir des objets de nombreux types différents, par exemple ArrayList
ou LinkedList
. La différence entre a LinkedList
et an ArrayList
est assez grande. Le grand comportement O des méthodes diffère considérablement. Par exemple, trier le List
, puis l'utiliser pour effectuer des recherches binaires est parfaitement correct pour un, ArrayList
mais n'aurait aucun sens avec un LinkedList
.
java
object-oriented-design
Palissade
la source
la source
Réponses:
Je ne dirais pas ça.
Une abstraction qui fuit est celle qui vous oblige à traiter les détails d'implémentation qu'elle est censée supprimer. Mais les performances diffèrent toujours entre les implémentations, donc si vous considérez cela comme une fuite, il n'y a pas d'abstractions qui ne fuient pas.
Si quelque chose est déclaré comme
List
sans documentation supplémentaire, il faut comprendre qu'il n'y a tout simplement aucune garantie sur les performances, et si vous allez faire quoi que ce soit de sensible aux performances, vous devez en faire une copie et travailler avec.En outre, ne pas oublier qu'il ya une interface encore plus générale qui est souvent suffisante dans la fonctionnalité et ne vous tente pas de faire autant d'hypothèses sur les performances:
Collection
.la source
Iterable
.Toutes les abstractions non triviales, dans une certaine mesure, sont fuyantes. Cela dit, je ne suis pas vraiment sûr que cela s'applique ici. :-)
Les abstractions concernent le comportement. À moins que le comportement ne spécifie des performances particulières (ce que Java
List
ne fait pas), c'est un détail d'implémentation - c'est-à-dire non pertinent.Java ne vous permet pas de spécifier des performances minimales pour les interfaces en dehors de la documentation, et je ne connais aucun langage qui le fasse - il serait incroyablement difficile (impossible?) Pour le compilateur de vérifier. Je peux voir quelques options si les performances sont un problème:
BinarySearchPerformantList
(beurk!) - qui spécifie les exigences de performance des différentes méthodes.L'option 2 est probablement la meilleure abstraction, mais elle s'accompagne d'une surcharge supplémentaire.
la source
equals
pour comparer des objets.LinearSpace
etLogarithmicTime
puis déclarer des classes commepublic class BinarySearch : ISearchStrategy<T>, LogarithmicTime
. D'autres classes pourraient prendre des paramètres commepublic T find<T, S>(IList<T> list, S strategy) where S : ISearchStrategy<T>, LogarithmicTime { }
pour imposer des contraintes de performances.En Java, il existe une interface RandomAccess qui est définie comme une liste avec un temps d'accès aléatoire généralement constant (O (1) get, put etc.). Si vous pensez que votre module nécessite une liste avec ces caractéristiques de performances, pensez à utiliser à la
RandomAccess
place deList
. Si vous ne ressentez pas le besoin d'apporter ce changement (et peu le font), alors peut-être que List n'est pas si fuit.la source
Vous avez raison, une liste est une abstraction qui fuit. La STL utilise l'idée de concepts pour modéliser ce problème spécifique. Pour utiliser votre exemple, un
ArrayList
modèle un itérateur à accès aléatoire tandis qu'un LinkedList modélise un itérateur avancé . Différents concepts ont des exigences de performances différentes, ce qui les rend appropriés pour différents algorithmes .la source