Go, “örtük” arayüzlerle üretkenliği nasıl geliştirir ve bu, C # 'nin Uzatma Yöntemleri nosyonuyla nasıl karşılaştırılır?


21

Go Language Tutorial'da arayüzlerin nasıl çalıştığını açıklar :

Go'nun sınıfları yok. Ancak, yapı türleri üzerinde yöntemler tanımlayabilirsiniz. Yöntem alıcı fonk anahtar kelime ve yöntem adı arasındaki kendi argüman listesinde görünür.

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

Bir arayüz tipi, bir dizi yöntemle tanımlanır. Arabirim türünün bir değeri, bu yöntemleri uygulayan herhangi bir değeri tutabilir.

Go'da bir arayüz oluşturmanın tek yolu bu. Google ayrıca şunları açıklar:

Bir tür, yöntemleri uygulayarak bir arayüz uygular. Açık bir niyet interfacebeyanı [yani beyannameler] yoktur.

Örtük ara yüzler, uygulama paketlerini ara yüzleri tanımlayan paketlerden ayırır: ikisi de diğerine bağlı değildir.

Ayrıca, kesin arabirimlerin tanımını da teşvik eder, çünkü her uygulamayı bulmanız ve onu yeni arabirim adıyla etiketlemeniz gerekmez.

Bütün bunlar şüpheli bir şekilde C #'daki Extension Yöntemleri'ne benziyor , ancak Go'daki yöntemler acımasızca polimorfiktir; onları uygulayan herhangi bir tür üzerinde çalışacaklardır .

Google bunun hızlı gelişimi teşvik ettiğini iddia ediyor, ancak neden? C # 'daki açık arabirimlerden uzaklaşarak bir şeyden vazgeçiyor musunuz? C # 'daki Eklenti Metodları, Go arayüzlerinin C #' daki faydalarından bazılarını türetmesine izin verebilir mi?



1
Bu Go arayüzleri, C ++ şablonlarının C # uzatma yöntemlerinden daha fazla yapabildiği sesler. C # 'da “A ve B yöntemlerini uygulayan herhangi bir tür” gibi bir şey yoktur, ancak bunu C ++ şablonlarını kullanarak yapabilirsiniz.
svick


'Örtük arayüzler' sadece bir ördek yazma biçimi değil midir?
Allon Guralnek,

“'Örtük arayüzler' sadece bir ördek yazma biçimi değil midir?” Go'nun arayüzleri yapısal tiplendirme örneğidir. Çok benzer bir kavram.
mortdeus

Yanıtlar:


12

Uzantı yöntemlerini ve örtük arabirimleri aynı şekilde görmüyorum.

İlk önce amaç ile konuşalım.

Uzatma yöntemleri, özellikle bir nesnenin bir üyesiymiş gibi bir yöntemi, o nesnenin içlerine erişmeden kullanabilmenizi sağlamak için sözdizimsel bir şeker olarak bulunur. Eklenti yöntemleri olmadan tam olarak aynı şeyi yapabilirsiniz, sadece hoş sözdizimini alamazsınız someObjectYouCantChange.YourMethod()ve çağrı yapmak zorunda kalırsınız YourMethod(someObjectYouCantChange).

Öte yandan, gizli arabirimlerin amacı, değişime erişimi olmayan bir nesneye bir arabirim uygulayabilmenizdir. Bu size, kendiniz yazdığınız herhangi bir nesne ile iç sayfalarına erişemediğiniz herhangi bir nesne arasında polimorfik bir ilişki oluşturma yeteneği verir.

Şimdi sonuçlarla konuşalım.

Eklenti yöntemleri gerçekten hiçbiri yoktur, bu mükemmel bir şekilde, ağrısız güvenlik kısıtlamaları ile uyumludur. .NET, bir model üzerinde farklı bakış açılarına yardımcı olmak için kullanmaya çalışır (içeriden, dışarıdan, mirasçı ve komşulardan perspektif). Sonuç sadece bazı sözdizimsel hoşluktur.

Örtük arayüzlerin sonuçları birkaç şeydir.

  • Yanlışlıkla yapılan arabirim uygulaması, bu, sözleşmenin amacına uymayan, başka birisinin arabirimini karşılayarak, kazayla veya yanlışlıkla LSP ihlaliyle sonuçlanabilir.
  • Herhangi bir yöntemi kolayca yapma yeteneği, herhangi bir nesnenin aldatmacasını, yalnızca bu nesneler arayüzünü yansıtarak (veya sadece bu yöntem gereksinimlerini karşılayan ve daha fazlasını sağlayan bir arayüz oluşturarak) kabul eder.
  • İçinde yanaşamayacağınız nesneler için adaptörleri veya diğer çeşitli benzer kalıpları daha kolay bir şekilde oluşturabilme yeteneği.
  • Arayüz uygulamasını geciktirin ve daha sonra gerçek uygulamaya dokunmak zorunda kalmadan uygulayın, sadece gerçekten başka bir uygulayıcı oluşturmak istediğinizde uygulayın.

Linq uzatma yöntemlerinin yararı kabiliyetleri, büyük ölçüde elde , bir ara yüzey üzerine bir yöntem uygulama aşı özellikle IEnumerableve IQueryable. Bunu staticbir yardımcı sınıftaki yöntemlerle taklit etseniz de, hantal olur.
Robert Harvey,

@RobertHarvey Yöntemi bir arabirime koyduğunu iddia etmek kesinlikle doğru değildir, bir arabirimdeki gerçek bir yöntem ile bir genişletme yöntemi arasındaki farkı not edin: Bir arabirimdeki bir yöntem, bu arabirimi uygulayan sınıfın içinde uygulanacaktır ve bu nedenle herhangi bir uzantı yönteminden çok daha fazla erişime sahip. Yine bakış açısındaki bir değişiklik, bir sınıf içinde uygulanan kodun dış görünüşe göre özel bir bakış açısı veriliyor.
Jimmy Hoffa,
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.