Arayüzün sadece bir kısmı nasıl uygulanır?


14

OOP'de gelişirken, bazen değiştiremeyeceğiniz bir kütüphane tarafından bir arayüz / sözleşme verilir. Bu arayüze J diyelim.

Artık bu arabirimi uygulayan nesneleri tüketen A sınıfı bir nesneniz var. Inside Arayüz tanımlarının sadece küçük bir kısmına ihtiyaç vardır. Bazı nesne sınıfları proje sırasında benim tarafımdan oluşturuldu (bunlardan birine D tipi diyelim), bu yüzden J arayüzü içindeki her şeyin uygulanmasında bir yük var.

J arayüzünde işlevselliğin bir alt kümesini uygulamak istiyorum, ancak şimdiye kadarki çözümlerim beni tatmin etmiyor:

  • J'nin her yönünü uygulamak ve sonra "notImplementedExceptions" atmak nesnelerimin kullanıcısını yanlış bilgilendiriyor: D tipi nesnelerimin arayüz J'ye uyduğu görülüyor, ancak bunlar - ve nesnelerimin diğer tüketicilerini (arayüz uygulayan nesneleri kabul eden) J) nesnelerimin bütünlüğüne güvenemez.
  • Yeni tanımlanmış bir arabirim uygulamak, yalnızca arabirim J kendi arabirimimle tamamen uyumlu olmasına rağmen, yalnızca arabirim J'yi uygulayan nesneleri kullanmamı yasaklıyor.
  • Özel nesnelerimin J arabirimini uygulamasına izin vermek, tüm bu işlevlere ihtiyaç duymadıkları için önemli ek yükler yaratacaktır.

J arayüzünü değiştirebildiğimde, J arayüzünün işlevselliğinin bu alt kümesine sahip olan bir "süper arayüz" K yaratacağım ve J arayüzünü K arayüzünden devralabilirdim. Ama J arayüzünü değiştiremiyorum.

Bu soruna nesne yönelimli bir çözüm nedir? En iyi çözüm hala "sadece" arayüz J'yi uyguluyor mu? Veya bir arabirimi değiştirmeden "üst sınıf" yapmanın OOP yolları var mı?


1
Swing'deki * Adapter sınıflarının bunu nasıl yaptığını görün.

Yanıtlar:


9

J arayüzünü kontrol etmezseniz sıkışmışsınız demektir.

Netleştirmek için, kendi arabirimi subJ ve arabirimi J uygulayabilir ve arabirim J'de ekstra yöntemlerin gerekli olmadığını açıkça belirtmek için kendi kodunuzda subJ kullanabilirsiniz, ancak bunun gerçekten size çok fazla kazandığını sanmıyorum

mümkünse, J arayüzünün tamamını tamamen uygulayın

mümkünse, J arayüzünün sahibiyle iletişime geçin ve ondan amaçlarınıza daha iyi uyacak şekilde değiştirmesini isteyin


2
Bir uzlaşma olarak: J arayüzü sahibinden daha küçük arayüz SubJ'nizi devralmasını isteyebilirsiniz.
k3b

27

Bir arayüzün uygulanmasının amacı, uygulama ayrıntıları değişebilirken arayan ile arayan arasında asla değişmeyen sağlam bir sözleşme sağlamaktır.

J arayüzünü uygulayarak dış dünyaya neler yapabileceğinizi söylüyorsunuz.

J'nin yaptıklarının yarısına ihtiyacınız yoksa, arayüz gerçekten olabildiğince küçük olmadığı için alt bölümlere ayrılmalıdır veya NotImplementedExceptionihtiyacınız olmayan yöntemleri ve özellikleri atmanız gerekir. Ancak bu, insanların kodunuzun ne yapabileceğine dair beklentilerini karıştırdığı için en iyi çözüm değildir.


5

Tüketici sınıfınız A arabiriminin tümünü gerektirmiyorsa, gereken her şeyi kapsamlı bir şekilde açıklayan yeni bir arabirim (K olarak adlandırın) oluşturmanızı öneririm.

Bu, sözleşmenin taraflarının ne olduğu konusunda A sınıfı kullanan herkese açık bir sinyal sağlar. Böylece yeniden kullanım şansını artırır. Birisinin büyük ve karmaşık bir arayüz uygulayan bir nesne sağlaması gerekiyorsa, nispeten basit bir şey yapmak için, muhtemelen A sınıfı ne yaparsa yapsınlar.

A sınıfının yalnızca J arabirimini uygulayan nesneleri tüketmesine izin vermek için, K arabirimini uygulayan ve uygun çağrıları bir arabirim J üyesine ileten bir sarıcı sınıfı sağlayabilirsiniz.


3

J'yi gerçekten (tamamen uygulanmayan yöntemler hariç) uygulamanız ya da hiç kullanmamanız gerektiğini söyleyen mevcut cevapları kabul etsem de, olası bir çözüm aşağıdadır:

  • J'nin bir alt kümesi olan ve gerekli yöntemleri uygulayan daha küçük bir arayüz K oluşturun.
  • A için J ve K'yi uygulayan nesneleri kabul eden bir sarmalayıcı oluşturun.
  • J'de geçilmesi durumunda, bunu A örneğine itmeniz yeterlidir.
  • K'da bir geçiş durumunda, J'nin anonim bir uygulamasını başlatın ve sadece K'den J'ye kadar olan yöntemleri kablolayın. Sonucu A örneğine aktarın.

Bunun oldukça çirkin bir çözüm olduğunu lütfen unutmayın, çünkü aslında aynı şey olan birden fazla şeyi kabul eden bir sarıcı gerektirir. Ancak aşağıdakileri başarır:

  • J veya A'da değişiklik yok.
  • Eksik olan "açık" J uygulamaları yoktur.

OO diliniz anonim arabirim örneklemesine izin vermiyorsa, arabirimin kukla bir uygulamasını oluşturabilir ve bunu başlatabilirsiniz.


1

Arayüzün tamamını uygulamak sizi ne kadar sürer?

Bu size önemli bir zaman ayıracaksa, bu bir tasarım sorununa işaret eder ve size (Steven A.'nin benden önce yaptığı gibi) sahibiyle iletişim kurmanızı ve gelecekte değiştirilip değiştirilemeyeceğini görmenizi öneririm.

Arayüzü, arayüzün kütüphanesinden bağımsız olarak kendi kodunuzda kullanıyor musunuz?

Steven A.'nın önerdiği gibi, kendi arayüzünüzü kendi kodunuzda görmek istediğiniz gibi kullanabilirsiniz. Bu en azından dahili kodunuzu temiz tutar. Bunu, sahibine bulmayı umduğunuz arayüz olarak da gönderebilirsiniz. Belki de sizinle aynı fikirde olabilir, ya da belki de arayüzün neden bölünmemesi gerektiğini size açıklayabilir.

Uygulamanızın arayüzün kullanılmayan üyelerine hiç ihtiyacı var mı?

'Desteklenmediklerinden' asla çağrılmamasını beklemeniz durumunda NotSupportedException,. Bu, uygulamadığınızdan ziyade bu arayüzü asla desteklemeyeceğinizin açık bir göstergesidir.


Kullanmak NotSupportedExceptioniçin iyi bir fikir, bu yöntemi desteklemediğinizi açıkça ortaya koymaktadır.
ChrisF

@ChrisF: Sadece NotImplementedExceptionaksi takdirde "TODO : Bunu uygula" yazacağım üretim kodu için kullanıyorum Ne yazık ki, Visual Studio'nun görev listesinde görünmüyor . Ancak pratikte, iki günden daha uzun bir süre uygulanmayan bir yöntemi neredeyse hiç bırakmam. Yeniden paylaşma ayrıca bu istisnaları kalın olarak gösterir (en azından kurulumumda). :)
Steven Jeuris

0

İhtiyacınız olanı uygulayın ve diğerlerine bir istisna NoImplementedException atın.

Bu bir kullanım meselesi. Arayüzü kullanmıyorsanız veya kodunuzun arayüzü kullanamayacağını biliyorsanız, fazladan kod için zaman harcamanıza gerek olmadığından buna zaman harcamayın.

Eldeki görev için çalışın ve arayüzü kullanmak isterse başkalarının takip etmesi için iyi bir yol tutun.

Java'daki birçok arabirim tam olarak uygulanmaz.

Bu şeylere Apache yaklaşımıdır: http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/NotImplementedException.html


Belki de bunun neden uygun bir çözüm olduğuna inandığınızı tartışabilirsiniz. Bu soruya hiçbir şey katmaz.
Steven Jeuris

her şeyi uygulamaya gerek yoktur, çünkü her şeyi açıklamaya gerek yoktur. bu onun durumuysa, arayüzün parçaları gereksizdi ve hemen aldı.
Görünen Ad
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.