Arayüzlerin somut sınıflara bağlı olması uygun mudur?


9

Özel hata işleyici için Java'da arayüz oluşturuyorum.

Bir argüman hata nesnesi geçmek istiyorum ama Exceptionsınıfın çocuğu olması gerekir .

Tanımlı sınıf adımı bir arayüzde kullanmak uygun mudur?

Herhangi bir uygulamaya bağımlı olmama açısından daha az bir arayüz oluşturmayacak mı?

Böyle bir şey yapmaya çalışıyorum:

public class CustomException {
    /* ... Implementation ... */
}

public interface Interface {

    void onError(CustomException ex);

}

Bir arabirimde başka bir sınıfı devralmanın uygun olup olmadığını sormaya mı çalışıyorsunuz?
Snoop

@StevieV Hayır. Soruyu düzenledim, bak.
20'de nikachx

1
@AndresF. Bu sadece bir örnektir ve arabirimlerde sınıf kullanma hakkında herhangi bir OO diline uygulanabilir.
nikachx

3
Söyleyin: CustomExceptionUygulamanın bir parçası mı yoksa arayüzün bir parçası mı?
user253751

2
@nikachx "güvenli" ile ne demek istediğini anlamıyorum. Hangi açılardan daha Stringgüvenlidir CustomException? CustomExceptionSırasıyla başka bağımlılıkların olması neden önemlidir ?
Andres F.

Yanıtlar:


2

İlk ben gerçeği işaret etmek zorunda CustomExceptionkapsamaz Exceptiongerçekten bir değil bu yüzden Exception.

Bahsedilen:

Bağımlılık İnversiyon Prensibi ile ilgilenmiyorsanız , olduğu gibi bırakın. Bir arabirimin somut sınıflara bağımlı olması mükemmel bir şekilde mümkündür , örneğin birçok arayüz somut sınıflara bağlıdır Stringveya Objecthangileri somut sınıflara bağlıdır . Mesele şu ki, Java SDK'ya ait sınıfların yazdıklarımızdan daha kararlı (kod kırıcı değişikliklere daha az eğilimli) olduğuna inanma eğilimindeyiz.

Diğer yandan:

(Sayısız faydaları olan ve benim tavsiyem olan) DIP'yi takip etmek istiyorsanız, iki şeyden birini yapmanız gerekir:

seçenek 1

  • Yap CustomExceptionsoyut
  • Olduğu void onError(CustomException ex)gibi tut

seçenek 2

  • Yap CustomExceptionbir arayüz
  • Olduğu void onError(CustomException ex)gibi tut

Arayüz herhangi bir somut sınıfa değil, yalnızca soyutlamalara bağlı olacağından, bu seçeneklerden herhangi biriyle DIP'ye uyuyorsunuz.

Bağımlılığın tersine çevrilmesinin doğrudan bir uygulamasında, özetler üst / politika katmanlarına aittir. Bu mimari, daha yüksek hizmetleri / ilke bileşenlerini ve daha düşük hizmetleri aynı pakette tanımlayan özetleri gruplandırır. Alt düzey katmanlar, bu soyut sınıfların veya arabirimlerin miras / uygulanmasıyla oluşturulur . Martin, Robert C. (2003).

  • Çevik Yazılım Geliştirme, İlkeler,> Desenler ve Uygulamalar. Prentice Salonu. sayfa 127-131. ISBN 978-0135974445.

1
Soyut bir sınıfı veya somut (nihai olmayan) bir sınıfı kabul etmek arasında çok fazla bir fark yoktur ve bir arayüze olan fark bundan çok daha fazla değildir. Örnek bir parametre olarak iletildiği ve uygulamanızda sabit kodlanmadığı sürece, DI'nin temelleri vardır.
Jacob Raihle

@JacobRaihle Uygulamada sabit kodlanmış bir örneği geçirerek ne demek istersiniz?
Tulains Córdova

Dedim ki "geçtiği ve kodlanmadıkları sürece ". Demek istediğim, Interfacearayüz a'yı kabul CustomExceptionettiğinden ve bunu sağlamak için arayana bıraktığından, arayan, somut bir sınıf CustomExceptionolsa bile uzanan herhangi bir sınıfı sağlamakta özgürdür CustomException- bu Interface, bir şekilde yaratmaktan sorumlu olsaydı mümkün olmazdı o. Bu kontrolün tersine çevrilmesi, arayüzlerle çalışmaktan daha fazlası (kesinlikle yardımcı olmasına rağmen), DI'nin tamamen ilgili olduğunu düşünüyorum.
Jacob Raihle

@JacobRaihle "Bağımlılığın tersine çevrilmesinin doğrudan bir uygulamasında, özetler üst / politika katmanlarına aittir. Bu mimari, alt / politika bileşenlerini ve alt hizmetleri aynı pakette tanımlayan özetleri gruplandırır. Alt düzey katmanlar oluşturulur bu soyut sınıfların veya arayüzlerin kalıtım yoluyla / uygulanarak . " Martin, Robert C. (2003). Çevik Yazılım Geliştirme, İlkeler, Desenler ve Uygulamalar. Prentice Salonu. sayfa 127-131. ISBN 978-0135974445.
Tulains Córdova

Makul bir temerrüt sağlayabiliyorsanız soyut bir sınıfın anlamı nedir? Bunu sağlayarak ne kaybedersiniz ? Sadece kitap alıntılamakla kalmayın, düşünün.
Jacob Raihle

2

Tulains haklıdır - arayüzler her zaman somut sınıflara bağlıdır. Sadece kendi endişeleri için bir sözleşme oluşturmaları amaçlanmaktadır. Bu sözleşme her türlü verinin alınmasını ve geri gönderilmesini içerebilir.

Daha üst düzey dillerde, ilkel türlerin bile o kadar ilkel olmadığını unutmayın. Yani zaten beton türleriyle çalışıyorsunuz!


0

Sanırım ismiyle , gerçek sınıfın kendisi demek istiyorsun. Yansıma yoluyla ilgili istisnayı başlatmak için gerçek istisna sınıfı adını belirtmeye çalışıyorsanız , bu gitmek için doğru yol değildir.

Arayüzde özel bir sınıf kullanmak istiyorsanız, elbette kendi sınıflarınızı kendi arayüzlerinizde kullanabilirsiniz. Sınıflar, kitaplığınızın / API'nızın genel arayüzünün bir parçası haline gelir. Veri yapıları ve istisnalar, arayüzler tarafından sıklıkla kullanılan sınıflara iyi bir örnektir.

Bağlama göre farklı istisnalar kullanmanız gerekiyorsa, jenerikleri kullanmak isteyebilirsiniz.


Hayır, yansıtma demek istemiyorum. Bahsettiğiniz gibi evet İstisnalar ve veri yapıları arayüzlerde kullanılabilir, çünkü bunlar sadece veri içerir ve platform değildir veya başka sınıflara bağımlı değildir. Teşekkür ederim.
nikachx

2
OP sorularını soran cevaplar ... Sadece bir yorumda bulunun, sonra cevabınızı verin.
Snoop

1
@StevieV: İlk paragraf daha retorik bir soruydu. Ve OP'nin yorumunda gösterildiği gibi, aslında OP'nin sorusunu cevapladım.
Arseni Mourzenko
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.