A interface da lista é uma abstração com vazamento?

9

Se eu tiver uma variável que contenha a, Listela poderá conter objetos de vários tipos diferentes, por exemplo, ArrayListou LinkedList. A diferença entre a LinkedListe um ArrayListé bem grande. O grande comportamento O dos métodos difere bastante. Por exemplo, classificar Liste usá-lo para fazer pesquisas binárias é perfeitamente aceitável para um, ArrayListmas não faria sentido com a LinkedList.

Paling
fonte
O que significa "o grande O"?
Tulains Córdova

Respostas:

25

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 Listsem 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.

Michael Borgwardt
fonte
9
Há uma interface ainda mais geral que é muitas vezes suficiente em termos de funcionalidade: Iterable.
Emory
São esperadas diferenças de desempenho entre as diferentes implementações. Por exemplo, existem diferenças entre Vector e ArrayList, mas uma operação get em um LinkedList parece estranha.
Paling
17

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 Listnã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:

  1. Documente na classe / interface à qual a instância da lista pertencerá.
  2. Crie uma nova interface - por exemplo 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.

vaughandroid
fonte
11
+1. Tecnicamente, sim, uma Lista é uma abstração com vazamento , mas também o Objeto para ocultar a complexidade relacionada ao uso equalspara comparar objetos.
Neil
2
@ Neil eu acho que é discutível ... Uma vez que a abstração não menciona o desempenho, não acho que esteja falhando neste caso (como argumentei). Eu diria que, se você está pensando em desempenho, precisa de uma abstração diferente / mais estreita. Editará para mencionar isso.
vaughandroid
Depende do que você está escondendo, suponho. Existe complexidade no uso ou está em seu uso e implementação de memória? Porque se é uma classe abstrata, uma ou mais dessas complexidades estão ficando ocultas de uma maneira ou de outra.
Neil
Joguei em torno de muitos anos atrás implementar uma variação de Opção 2 usando interfaces de marcador, como LinearSpacee LogarithmicTimeem seguida, declarar aulas como public class BinarySearch : ISearchStrategy<T>, LogarithmicTime. Outras classes podem usar parâmetros como public T find<T, S>(IList<T> list, S strategy) where S : ISearchStrategy<T>, LogarithmicTime { }para impor restrições de desempenho.
Lucas
2
Se vamos ao artigo de Joel Spolsky, acho que é "até certo ponto, vazante". Veja a seguinte citação do artigo: "Se você foi mal-educado com os administradores de sistema da sua empresa e eles o puniram ao conectá-lo a um hub sobrecarregado, apenas alguns dos seus pacotes IP passarão e o TCP funcionará, mas tudo funcionará. ser muito lento" Eu acho que isso se aplica
Amish programador
4

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 RandomAccessvez de List. 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.

MikeFHay
fonte
1

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 ArrayListmodelo 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 .

Matthew Finlay
fonte