Se eu tiver uma variável que contenha a, List
ela poderá conter objetos de vários tipos diferentes, por exemplo, ArrayList
ou LinkedList
. A diferença entre a LinkedList
e um ArrayList
é bem grande. O grande comportamento O dos métodos difere bastante. Por exemplo, classificar List
e usá-lo para fazer pesquisas binárias é perfeitamente aceitável para um, ArrayList
mas não faria sentido com a LinkedList
.
java
object-oriented-design
Paling
fonte
fonte
Respostas:
Eu não diria isso.
Uma abstração com vazamento é aquela que o força a lidar com detalhes de implementação que deveriam abstrair. Mas o desempenho sempre difere entre as implementações; portanto, se você considerar isso como vazamento, não haverá abstrações sem vazamento.
Se algo for declarado
List
sem documentação adicional, deve-se entender que simplesmente não há garantias sobre o desempenho e, se você fizer algo sensível ao desempenho, faça uma cópia e trabalhe com isso.Além disso, não se esqueça que há uma interface ainda mais geral que é muitas vezes suficiente em termos de funcionalidade e não tentá-lo a fazer tantas suposições sobre o desempenho:
Collection
.fonte
Iterable
.Todas as abstrações não triviais, até certo ponto, são vazadas. Dito isto, não tenho muita certeza de que se aplique aqui. :-)
Abstrações estão preocupadas com o comportamento. A menos que o comportamento especifique um desempenho específico (o que o Java
List
não faz), é um detalhe da implementação - isto é, irrelevante.Java não permite que você especifique desempenho mínimo para interfaces fora da documentação, e eu não conheço nenhuma linguagem que faça isso - seria incrivelmente difícil (impossível?) Para o compilador verificar. Posso ver algumas opções se o desempenho for uma preocupação:
BinarySearchPerformantList
(eca!) - que especifique os requisitos de desempenho dos vários métodos.A opção 2 é provavelmente a melhor abstração, mas vem com sobrecarga extra.
fonte
equals
para comparar objetos.LinearSpace
eLogarithmicTime
em seguida, declarar aulas comopublic class BinarySearch : ISearchStrategy<T>, LogarithmicTime
. Outras classes podem usar parâmetros comopublic T find<T, S>(IList<T> list, S strategy) where S : ISearchStrategy<T>, LogarithmicTime { }
para impor restrições de desempenho.Em Java, existe uma interface RandomAccess que é definida como uma lista com tempo de acesso aleatório geralmente constante (O (1) get, put etc.). Se você acha que seu módulo requer uma lista com essas características de desempenho, considere usar em
RandomAccess
vez deList
. Se você não sente a necessidade de fazer essa alteração (e poucas o fazem), talvez a List não seja tão imprecisa.fonte
Você está correto, uma lista é uma abstração com vazamento. O STL usa a idéia de conceitos para modelar esse problema específico. Para usar seu exemplo, um
ArrayList
modelo de Iterador de acesso aleatório, enquanto um LinkedList modela um Iterador de encaminhamento . Diferentes conceitos têm diferentes requisitos de desempenho, o que os torna apropriados para diferentes algoritmos .fonte