Liste arayüzü sızdıran bir soyutlama mı?


9

Bir içeren bir değişken varsa Listo farklı türleri örneğin bir çok nesneleri içerebilir ArrayListveya LinkedList. A LinkedListve an arasındaki fark ArrayListoldukça büyük. Yöntemlerin büyük O davranışı büyük farklılıklar gösterir. Örneğin sıralama Listve sonra ikili aramalar yapmak için mükemmel bir için Tamam ArrayListama a ile mantıklı olmaz LinkedList.


"Büyük O" ne demektir?
Tulains Córdova

Yanıtlar:


25

Ben söylemezdim.

Sızdıran bir soyutlama, sizi soyutlamak zorunda olduğu uygulama ayrıntılarıyla uğraşmaya zorlayan bir soyutlamadır. Ancak performans her zaman uygulamalar arasında farklılık gösterir, bu nedenle bunu sızıntı olarak kabul ederseniz, sızdırmayan soyutlamalar yoktur.

Bir şey Listdaha fazla dokümantasyon olmadan ilan edilirse , performansla ilgili hiçbir garanti olmadığı anlaşılmalıdır ve eğer performansa duyarlı bir şey yapacaksanız, bir kopyasını almalı ve bununla çalışmalısınız.

Ayrıca, işlevsellikte genellikle yeterli olan ve performans hakkında çok fazla varsayımda bulunmaya teşvik etmeyen daha genel bir arayüz olduğunu unutmayın Collection.


9
İşlevselliği genellikle yeterlidir daha da genel arayüzü vardır: Iterable.
emory

Farklı uygulamalar arasında performans farklılıkları beklenmektedir. Vector ve ArrayList arasında farklılıklar vardır, ancak LinkedList'te bir get işlemi garip görünür.
Paling

17

Önemsiz tüm soyutlamalar bir dereceye kadar sızdırıyor. Bununla birlikte, burada geçerli olduğundan emin değilim. :-)

Soyutlamalar davranışla ilgilidir. Davranış belirli bir performansı (Java'nın Listbelirtmediği) belirtmedikçe, bir uygulama detayıdır - yani alakasız.

Java, belgelerin dışındaki arabirimler için minimum performans belirtmenize izin vermez ve bunu yapan herhangi bir dilin farkında değilim - derleyicinin doğrulaması inanılmaz zor (imkansız?) Olurdu. Performans bir endişe ise birkaç seçenek görebilirsiniz:

  1. List örneğinin ait olacağı sınıf / arabirimde bunu belgeleyin.
  2. BinarySearchPerformantListÇeşitli yöntemlerin performans gereksinimlerini belirten yeni bir arayüz (örn. (Yuck!)) Oluşturun .

Seçenek 2 muhtemelen daha iyi soyutlamadır, ancak ekstra yük ile birlikte gelir.


1
+1. Teknik olarak evet, Liste sızdıran bir soyutlamadır , ancak Nesne equalskarşılaştırmak için kullanmakla ilişkili karmaşıklığı gizlemek için Nesne de öyle .
Neil

2
@Neil bence tartışmalı ... Soyutlama performanstan bahsetmediği için bu durumda başarısız olduğunu düşünmüyorum (tartıştığım gibi). Performansı düşünüyorsanız, farklı / daha dar bir soyutlamaya ihtiyacınız olduğunu söyleyebilirim. Bundan bahsetmek için düzenleyeceğim.
vaughandroid

Sanırım ne sakladığına bağlı. Kullanımdaki karmaşıklık mı yoksa bellek kullanımı ve uygulamasında mı? Çünkü eğer soyut bir sınıfsa, bu karmaşıklıklardan biri veya daha fazlası şu ya da bu şekilde gizleniyor.
Neil

Etrafa yıllar işaretleyici gibi arayüzlerini kullanarak Seçenek 2 bir varyasyonunu uygulayan oynatılabilir LinearSpaceve LogarithmicTimebenzeri sınıfları ilan sonra ve public class BinarySearch : ISearchStrategy<T>, LogarithmicTime. Diğer sınıflar public T find<T, S>(IList<T> list, S strategy) where S : ISearchStrategy<T>, LogarithmicTime { }performans kısıtlamalarını uygulamak gibi parametreler alabilir .
Lucas

2
Joel Spolsky makalesine göre gidersek, bunun bir dereceye kadar sızıntı olduğunu düşünüyorum. Makaledeki şu alıntıya bakın: "Şirketinizdeki sistem yöneticileriyle kısa sürede uğraştıysanız ve sizi aşırı yüklenmiş bir hub'a takarak cezalandırdıysanız, yalnızca IP paketlerinizin bir kısmı geçecek ve TCP çalışacak, ancak her şey gerçekten yavaş olun "Bence bu geçerli
Amish Programcı

4

Java'da, genellikle sabit rasgele erişim süresine (O (1) get, put vb.) Sahip bir liste olarak tanımlanan bir RandomAccess arayüzü vardır. Modülünüzün bu performans özelliklerine sahip bir liste gerektirdiğini düşünüyorsanız, RandomAccessyerine kullanmayı düşünün List. Bu değişikliği yapma gereğini hissetmiyorsanız (ve birkaç kişi bunu yapmazsa), belki de Liste o kadar sızmaz.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.