it-swarm-tr.com

Java koleksiyonlar arayüzde "isteğe bağlı yöntemler" ile uygulandı?

Java toplama çerçevesini genişleten ilk uygulamam sırasında, toplama arabiriminin isteğe bağlı olarak bildirilen yöntemler içerdiğini görmek beni oldukça şaşırttı. kötü bir API tasarım seçeneği.

Joshua Bloch'un mükemmel "Etkili Java" kitabının çoğunu okuduktan ve daha sonra bu kararlardan sorumlu olabileceğini öğrendikten sonra, kitapta benimsenen ilkelerle gelmedi gibi görünüyordu. İki arayüz bildirmeyi düşünürdüm: Koleksiyon ve "isteğe bağlı" yöntemlerle Koleksiyonu genişleten MutableCollection çok daha sürdürülebilir istemci kodu yol açmış olurdu.

Sorunların mükemmel bir özeti var burada .

İki arayüz uygulaması yerine isteğe bağlı yöntemlerin seçilmesinin iyi bir nedeni var mıydı?

69
glenviewjeff

SSS cevabı verir. Kısacası, uygulanabilir, değiştirilemeyen görünüm, salt silme, sadece eklenti, sabit uzunluklu, değiştirilemeyen (diş açma için) ve benzeri her bir seçenek seçeneği için gerekli arabirimlerin potansiyel bir kombinasyon patlamasını gördüler.

28
ratchet freak

Bana Interface Segregation Principle Şu anda olduğu kadar iyi keşfedilmemiş gibi geliyor; bir şeyler yapmanın yolu (yani arayüzünüz tüm olası işlemleri içerir ve ihtiyacınız olmayanlar için istisnalar yaratan "dejenere" yöntemleriniz vardır) SOLID ve ISS, kalite kodu için fiili standart.

10
Wayne Molina

Bazı insanlar "isteğe bağlı yöntemler" den nefret ederken, çoğu durumda yüksek oranda ayrılmış arayüzlerden daha iyi anlambilim sunabilirler. Diğer şeylerin yanı sıra, bir nesnenin yaşamı boyunca yetenekler veya özellikler kazanabileceği ya da bir nesnenin (özellikle bir sargı nesnesi) tam olarak hangi yetenekleri raporlaması gerektiğini inşa edemeyeceğini bilmelerine olanak tanır.

İyi tasarım Java toplama sınıfları paragons) hemen hemen arayacak olsa da, iyi bir koleksiyon çerçevesinin temelinde çok sayıda isteğe bağlı yöntem yolları ile birlikte olması gerektiğini öneririm bir koleksiyonun özelliklerini ve yeteneklerini sormak. Böyle bir tasarım, tek bir sargı sınıfının, altta yatan koleksiyonun sahip olabileceği yetenekleri yanlışlıkla gizlemeden çok çeşitli koleksiyonlarla kullanılmasına izin verecektir. Yöntemler isteğe bağlı olmasaydı, koleksiyonların destekleyebileceği her özellik kombinasyonu için farklı bir sarmalayıcı sınıfına sahip olmak veya bazı durumlarda bazı sarmalayıcıların kullanılamaz olması gerekirdi.

Örneğin, bir koleksiyon bir öğeyi dizine göre yazmayı veya öğelerin sonuna eklemeyi destekliyor, ancak öğelerin ortasına eklenmesini desteklemiyorsa, sarmalayıcıda kapsüllemek isteyen kod, üzerinde yapılan tüm eylemleri günlüğe kaydedecektir. desteklenen yeteneklerin tam kombinasyonunu sağlayan veya hiçbirinin bulunmadığı günlüğe kaydetme sarmalayıcısının, ekleme veya dizine göre yazma özelliğini destekleyen ancak her ikisini birden desteklemeyen bir sarmalayıcı kullanması gerekir. Bununla birlikte, birleştirilmiş bir toplama arayüzü her üç yöntemi de "isteğe bağlı" olarak sağladıysa, ancak isteğe bağlı yöntemlerden hangisinin kullanılabileceğini belirten yöntemler içeriyorsa, tek bir sargı sınıfı, özelliklerin herhangi bir kombinasyonunu uygulayan koleksiyonları işleyebilir. Hangi özellikleri desteklediği sorulduğunda, bir sarıcı kapsüllenmiş koleksiyonun desteklediği her şeyi rapor edebilir.

"İsteğe bağlı yeteneklerin" varlığının, bazı durumlarda, birleştirilmiş koleksiyonların, yeteneklerin uygulamaların varlığıyla tanımlanması durumunda mümkün olandan çok daha verimli olan belirli işlevleri yerine getirmesine izin verebileceğini unutmayın. Örneğin, birincisi 1.000.000 öğeye sahip bir ArrayList oldu ve sonuncusu sadece yirmi elemanlı bir koleksiyon olan, diğer iki bileşikten bir kompozit koleksiyon oluşturmak için bir concatenate yöntemi kullanıldığını varsayın en baştan tekrarlanmalı. Bileşik koleksiyon 1.000.013. Öğe (dizin 1.000.012) için istendiğinde, ArrayList'e kaç öğe içerdiğini (yani 1.000.000) sorabilir, bunu istenen dizinden (12 veren) çıkarabilir, on iki öğeyi ikinciden okuyabilir ve atlayabilirsiniz. toplayın ve sonraki öğeyi döndürün.

Böyle bir durumda, bileşik koleksiyonun bir öğeyi dizine göre döndürmek için anlık bir yolu olmamasına rağmen, 1.000,013. Öğenin bileşik koleksiyonunu sormak, ondan ayrı ayrı 1.000,013 öğeyi okumaktan ve sonuncuyu göz ardı etmekten çok daha hızlı olacaktır. bir.

4
supercat