Bir uygulama yerine bir arayüze kodlamanın arkasındaki nokta, programınızı aksi takdirde kısıtlayacak uygulama ayrıntılarının sızmasını önlemektir.
Kodunuzun orijinal sürümünün kullanıldığı HashMap
ve bunu ortaya çıkardığı durumu düşünün .
private HashMap foo = new HashMap();
public HashMap getFoo() { return foo; } // This is bad, don't do this.
Bu, yapılan herhangi bir değişikliğin getFoo()
bir API değişikliği olduğu ve onu kullanan kişileri mutsuz edeceği anlamına gelir . Garanti ettiğiniz foo
tek şey bu bir Harita ise, bunun yerine geri dönmelisiniz.
private Map foo = new HashMap();
public Map getFoo() { return foo; }
Bu, kodunuzun içinde işlerin çalışma şeklini değiştirme esnekliği sağlar. Bunun foo
, belirli bir sırada şeyleri geri getiren bir Harita olması gerektiğinin farkındasınız .
private NavigableMap foo = new TreeMap();
public Map getFoo() { return foo; }
private void doBar() { ... foo.lastEntry(); ... }
Ve bu kodun geri kalanı için hiçbir şey kırmaz.
Daha sonra, sınıfın verdiği sözleşmeyi hiçbir şey kırmadan da güçlendirebilirsiniz.
private NavigableMap foo = new TreeMap();
public NavigableMap getFoo() { return foo; }
private void doBar() { ... foo.lastEntry(); ... }
Bu Liskov oyuncu değiştirme prensibini araştırıyor
İkame edilebilirlik, nesne yönelimli programlamada bir prensiptir. Bir bilgisayar programında, S, T'nin bir alt tipiyse, T tipi nesnelerin, S tipindeki nesnelerle (yani, S tipi nesnelerin, T tipindeki nesnelerin yerine geçebileceğini), istenen herhangi bir şeyi değiştirmeden değiştirilebileceğini belirtir. programın özellikleri (doğruluk, yapılan görev vb.).
NavigableMap, Harita'nın bir alt türü olduğundan, bu değişiklik programı değiştirmeden yapılabilir.
Uygulama türlerinin ortaya çıkarılması, bir değişiklik yapılması gerektiğinde programın dahili olarak çalışma şeklini değiştirmeyi zorlaştırır. Bu acı verici bir süreçtir ve çoğu zaman kodlayıcıya daha sonra daha fazla acı çekmeye hizmet eden çirkin geçici çözümler yaratır (size bir nedenle her ne zaman bir LinkedHashMap ve bir TreeMap arasında veri karıştırmaya devam eden önceki kodlayıcıya bakıyorum - bana güvenin svn suçlama adınızı görmek endişeleniyorum).
Sen olur hala uygulama türlerini sızıntı önlemek istiyorum. Örneğin, bazı performans özellikleri nedeniyle bunun yerine ConcurrentSkipListMap'i uygulamak isteyebilirsiniz veya içe aktarma ifadelerinde veya herhangi bir şekilde kullanmak java.util.concurrent.ConcurrentSkipListMap
yerine istediğiniz gibi olabilir java.util.TreeMap
.