(Dis-) ข้อดีของการพิมพ์โครงสร้าง


15

ผมเคยดูเพียงแค่การพูดคุยนี้โดยแดเนียล Spiewakที่เขาพูดเกี่ยวกับข้อดีของการพิมพ์โครงสร้างเมื่อเทียบกับสกาล่าของ ans ของ Java พิมพ์เล็กน้อย ตัวอย่างหนึ่งสำหรับความแตกต่างนี้จะเป็นรหัส Java ต่อไปนี้

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

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

ซึ่งแน่นอนว่าจะไม่รวบรวมเพราะความเข้ากันได้ระหว่างประเภทFooและBarจะถูกกำหนดโดยชื่อ

ระบบประเภทโครงสร้างในอีกด้านหนึ่งสามารถประกาศว่าทั้งสองประเภทมีความเท่าเทียมกันหรือเข้ากันได้และดังนั้นในกรณีอื่น ๆ อนุญาตให้มีการตรวจสอบการพิมพ์เป็ด

ตอนนี้ฉันคิดว่าฉันเข้าใจถึงข้อดีของระบบโครงสร้างแบบส่วนใหญ่แล้ว แต่ฉันสงสัยว่ามันจะไม่ทำให้ความปลอดภัยของประเภทจากตัวอย่างเช่นต่อไปนี้เป็นโมฆะ

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

ความเข้าใจของฉันถูกต้องหรือไม่ที่ระบบประเภทโครงสร้างบรรทัดสุดท้ายจะรวบรวมเช่นกันและหากเป็นเช่นนั้นนี่จะไม่เป็นข้อเสียสำหรับความปลอดภัยของประเภทหรือไม่?


3
คุณช่วยอธิบายได้ไหมว่าทำไมบรรทัดสุดท้ายไม่ควรรวบรวม ฉันไม่เห็นประเภทที่เข้ากันไม่ได้
Sam Goldberg

2
มันเป็น Scala ประเภทขึ้นอยู่กับเส้นทาง
Debilski

ที่จริงแล้วฉันอยากจะพูดเรื่องนี้จากมุมมองของระบบประเภทสกาล่า มันเพิ่งเกิดขึ้นที่ตัวอย่างหนึ่งที่ให้ไว้ในการพูดคุยคือใน Java
Debilski

คำตอบ:


12

ที่จริงแล้วพา ธ ขึ้นอยู่กับประเภทนั้นมีมุมฉากเป็นโครงสร้างเทียบกับการพิมพ์เล็กน้อย ยังไม่ชัดเจนว่าคลาสภายในมีความหมายอย่างไรในบริบทของภาษาที่พิมพ์ง่ายเชิงโครงสร้าง อย่างไรก็ตามเป็นไปได้ที่จะกำหนดสิ่งนี้ หากคุณต้องกำหนดคลาสภายในในบริบทที่พิมพ์โครงสร้างคุณจะต้องตรวจสอบให้แน่ใจว่ากรณีเช่นเดียวกับที่คุณระบุไว้จะถูกปฏิเสธ (ด้วยเหตุผลเดียวกับที่สกาล่าปฏิเสธพวกเขา)

คุณจะปฏิเสธกรณีดังกล่าวโดยทำในสิ่งเดียวกันกับที่ Scala ทำ: ทำโมเดลชนิดที่พึ่งพาพา ธ เป็นประเภทที่มีอยู่ กระบวนการ pack / unpack เดียวกันโดยรอบการเข้าถึงวัตถุจะถูกเก็บไว้และผลลัพธ์จะมีลักษณะเกือบเหมือนกับที่ Scala ทำ ผลลัพธ์อาจดูเหมือนความเท่าเทียมกันของประเภทเล็กน้อย แต่ก็ยังคงเป็นระบบโครงสร้างแบบโครงสร้างเนื่องจากคำถามเกี่ยวกับความเข้ากันได้ของประเภทจะยังคงถูกตัดสินบนอินเทอร์เฟซแทนชื่อ

การพิมพ์แบบโครงสร้างมีผลกระทบมากมาย แต่ (บางทีอาจเป็นเรื่องที่น่าประหลาดใจ) แนวคิดเดียวกันส่วนใหญ่ที่เราทุกคนรู้จักและชื่นชอบจากระบบการพิมพ์ทั่วไป การพิมพ์แบบโครงสร้างไม่มีอะไรมากไปกว่าการกำหนดความเข้ากันได้ของประเภทอื่น


0

การพิมพ์แบบโครงสร้างทำให้การเขียนรหัสไลบรารีทั่วไปง่ายขึ้น เหตุผล # 1 ว่าทำไมระบบนิเวศ Java จึงป่องดังนั้นเพราะมันยากที่จะเขียนห้องสมุดขนาดเล็กได้อย่างง่ายดาย ถ้า Java ถูกพิมพ์เชิงโครงสร้างฉันคิดว่ามันจะเป็นเรื่องที่แตกต่างและสถานการณ์ที่ดีขึ้นมาก

ข้อเสียเดียวที่ฉันสามารถนึกถึงสำหรับการพิมพ์เชิงโครงสร้างคือศักยภาพในการรวบรวมที่ช้ากว่า ฉันไม่แน่ใจว่าภาษาโครงสร้างโดยทั่วไปจะรวบรวมช้ากว่าประโยคที่เสนอหรือไม่ แต่ตัวอย่างเช่น Golang ถูกพิมพ์เชิงโครงสร้างและรวดเร็วมากในการรวบรวม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.