2010-04-21 15 views
6

Bugün nesne programlama stili, somut tipler veya arayüzler için temel bir paradoksu buldum.Dönüş Tipleri için Beton Tipler veya Arayüzler?

Bir yöntemin dönüş türü için daha iyi seçim nedir: bir beton türü veya bir arayüz?

Çoğu durumda, yöntemler için dönüş türü olarak beton türlerini kullanma eğilimindeyim. çünkü bir beton türünün daha fazla kullanım için daha esnek olduğuna ve daha fazla işlevsellik sergilediğine inanıyorum.

Bunun karanlık tarafı: Kuplaj. Angelic one: Somut bir tip, başlangıçta geri döneceğiniz arabirim ve ekstra işlevsellik içerir.

Baş parmağınızın kuralı nedir?

Bunun için herhangi bir programlama prensibi var mı?


BONUS: Bu benim dönüş türlerinde Başparmak ReadOnlyCollection or IEnumerable for exposing member collections?

cevap

4

Benim kurallarım:

1) Başlangıçta, ben gerekirse onun her zaman kolay sonradan somut tipe değiştirmek için çünkü yöntem, arabirim türü iade var. Diğer yöne gitmek daha zor.
InterfaceType i = xyz.methodThatReturnsConcreteType();: yöntem beton türü dönmek ilan bile

2), ben mümkün olduğunca arayüz türünü kullanmaya arayanları kod olacaktır.

3) çağıran kodu) kamu API'leri vs çok (dahili bir fark yaratıyor sahibi olsun:

  • Bahse konu yöntemi (yani iç API çağıran kodu) sahibi, daha sonra daha istekli Beton tipini iade ediyorum.
  • Bu yöntemi çağıran kodu (ör., Genel API) denetlemezsem, büyük olasılıkla, bunun yerine arabirim türünü döndüreceğim. Beton tipinin geri dönüşü bir taahhüttür ve genel olarak konuşursak, daha az söz veririm, daha kolay.

Diğer hususlar:

  • I arabirimi uygulayan bir sahte nesne kullanabildiğinden test arayüzleri ile daha kolay olabilir.
  • Ben dönmek istiyorum edeceğini dışarıdan bir şans var bir proxy object Genellikle arayüz türünü döndürür

    • Özetle

    , (şimdi gerçekten bahaneler ulaşıyorum) çünkü gevşek kaplin yararlarının, beton tipine tam erişime sahip olmanın rahatlığından daha fazla olduğunu düşünüyorum. Bununla birlikte, kolaylık her ne zaman kolaylık olursa olsun, gevşek kaplin avantajlarından daha ağır basıyorsa numaralı numaralı beton tipine geri dönmeye karşı değilim.

7

Kural, ne anlama geldiğini bir örnektir, parametre türlerinde mümkün olduğunca belirsiz olması, mümkün olduğunca spesifik olun. Ayrıca arayüzleri tercih edin, çünkü daha sonra uygulamanızı değiştirebilir, API'nızın istemcilerini değiştirmeden.

+0

Fikriniz için teşekkür ederiz Dominik +1 – SDReyes

+0

A 'MyCustomExtendedArrayList',' List'den daha belirgindir. Ne döneceksin? – BalusC

+2

@BalusC: Listenin yalnızca başka bir uygulamasına bağlıysa veya bazı özel yöntemler sunuyorsa. Yalnızca döküm tarafından kullanılabiliyorsa, özel bir sınıfın geri dönüşüne ne anlam verir? – Dominik

1

İlginç bir soru. İade verilerinin nasıl kullanılacağını kendinize sormanız gerektiğini düşünüyorum. yaş eski araba benzetme kullanarak

public AccelerationResponse PressAccelerator(float force) {} 

Şansını bir sınıf yerine bir arabirim dönmek istemezsiniz vardır olsaydı. Bu cevabı belirli koşullara bağlı olarak farklı şekilde yorumlayabilirsiniz.

Geri dönüşünüzün yalnızca somut uygulama tarafından beklenen şekilde kullanılabileceğini garanti ederseniz o sınıfı kullanmak mantıklıdır. Geniş çapta kabul görmüş bir prensipten emin değilim, ancak dönüş türünün farklı uygulamalarda tekrar kullanılabiliyor olması benim için bir kuralı daha anlamlı kılıyor. Başparmak

+0

Teşekkür ederim Jeremy, "... eğer geri dönüş türü farklı uygulamalarda tekrar kullanılabiliyorsa, bir arayüz daha anlamlı olur" bölüm +1 – SDReyes