Yapısal yazmanın (Dis-) avantajları


15

Daniel Spiewak'ın bu konuşmasını , Scala'nın ve Java'nın nominal yazımıyla karşılaştırıldığında yapısal yazmanın avantajlarından bahsettiği yerde izledim . Bu fark için bir örnek aşağıdaki Java kodu olacaktır

public interface Foo {
  public int length();
}
public interface Bar {
  public int length();
}

Foo f = ...;
Bar b = f;

tabii ki bunlar arasında tür uyumluluğu olmadığı Foove Barisimle belirlendiği için derlenmeyecektir .

Öte yandan yapısal bir tip sistem, her iki tipin de eşit veya uyumlu olduğunu ilan edebilir ve bu nedenle, diğer şeylerin yanı sıra, kontrol edilen ördek tipine izin verebilir.

Şimdi yapısal bir tip sistemin avantajlarının çoğunu anladığımı düşünüyorum, ancak aşağıdaki gibi örneklerden tür güvenliğini geçersiz kılmayacağını merak ediyorum

class Foo {
  class Bar { /* ... */ }
  def takeBar(b: Bar) = { /* ... */ }
  def getBar: Bar = new Bar
}

val foo1 = new Foo
val foo2 = new Foo
foo1.takeBar(foo1.getBar) // should compile
foo1.takeBar(foo2.getBar) // should not compile

Anlayışım, yapısal bir tip sistemde son satırın da derleneceği ve eğer öyleyse, bu tür güvenlik açısından bir dezavantaj olmayacağı doğru mu?


3
Son satırın neden derlenmemesi gerektiğini açıklayabilir misiniz? Tip uyumsuzluğunu görmüyorum.
Sam Goldberg


Aslında bunu Scala tipi sistem açısından tartışmak istedim. Konuşmada verilen örneklerden biri Java dilinde oldu.
Debilski

Yanıtlar:


12

Aslında, yola bağlı tipler yapısal ve nominal tiplemeye diktir. Basit bir yapısal tipli dil bağlamında bir iç sınıfın ne anlama geldiği pek açık değildir. Bununla birlikte, bunu tanımlamak çok mümkündür . İç sınıfları yapısal olarak yazılan bir bağlamda tanımlayacak olsaydınız, listelediğiniz gibi davaların reddedilmesini sağlamalısınız (Scala'nın reddettiğiyle aynı sebeplerden dolayı).

Bu tür vakaları Scala'nın yaptığı ile aynı şekilde reddedersiniz: yola bağlı türü varoluş türü olarak modelleyin. Nesne erişimini çevreleyen aynı paket / paket açma yordamı geçerli olur ve sonuçlar Scala'nın yaptığıyla neredeyse aynı görünür. Sonuçlar nominal tip eşitliği gibi görünebilir , ancak yine de yapısal bir tip sistem olacaktır, çünkü tip uyumluluğu sorunu isimden ziyade arayüzde kararlaştırılacaktır.

Yapısal yazmanın birçok etkisi vardır, ancak (belki de şaşırtıcı bir şekilde), hepimiz bildiğimiz ve nominal tip sistemlerden sevdiğimiz aynı kavramların çoğu yapısal hale gelir. Yapısal yazım, tip uyumluluğunu tanımlamanın farklı bir yolundan başka bir şey değildir.


0

Yapısal yazma, genel kütüphane kodunun yazılmasını kolaylaştırır. Java ekosisteminin bu kadar şişkin olmasının 1 numaralı nedeni, küçük kütüphaneleri kolayca yazmak zor olmasıdır. Java yapısal olarak yazılmış olsaydı, bunun farklı bir hikaye ve çok daha iyi bir durum olacağını düşünüyorum.

Yapısal yazım için düşünebileceğim tek dezavantaj daha yavaş derleme potansiyeli. Yapısal dillerin genellikle aday olanlardan daha yavaş derlenip derlenmediğinden emin değilim, ancak örneğin Golang yapısal olarak yazılmıştır ve derlemede çok hızlıdır.

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.