(Dis-) lợi thế của gõ cấu trúc


15

Tôi vừa xem bài nói chuyện này của Daniel Spiewak , nơi anh ấy nói về những lợi thế của việc gõ cấu trúc so với cách gõ danh nghĩa Java của Scala . Một ví dụ cho sự khác biệt này sẽ là mã Java sau

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

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

mà tất nhiên sẽ không biên dịch vì khả năng tương thích giữa FooBarđược xác định theo tên.

Mặt khác, một hệ thống kiểu cấu trúc có thể tuyên bố cả hai loại bằng nhau hoặc tương thích và do đó, trong số những thứ khác, cho phép kiểm tra gõ vịt.

Bây giờ tôi nghĩ rằng tôi đã hiểu hầu hết các ưu điểm của hệ thống kiểu kết cấu nhưng tôi tự hỏi liệu nó có làm mất hiệu lực an toàn kiểu từ các ví dụ như sau không

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

Sự hiểu biết của tôi có đúng không trong một hệ thống kiểu cấu trúc, dòng cuối cùng cũng sẽ biên dịch và nếu vậy, đây có phải là một bất lợi đối với an toàn kiểu không?


3
Bạn có thể giải thích tại sao dòng cuối cùng không nên biên dịch? Tôi không thấy loại không tương thích.
Sam Goldberg


Trên thực tế, tôi muốn thảo luận về điều này từ quan điểm hệ thống kiểu Scala. Nó chỉ xảy ra rằng một ví dụ được đưa ra trong bài nói chuyện là bằng Java.
Debilski

Câu trả lời:


12

Trên thực tế, các loại phụ thuộc đường dẫn là trực giao với cấu trúc so với gõ danh nghĩa. Nó không thực sự rõ ràng ý nghĩa của một lớp bên trong trong bối cảnh của một ngôn ngữ được cấu trúc đơn giản. Tuy nhiên, rất có thể định nghĩa điều này. Nếu bạn định nghĩa các lớp bên trong trong bối cảnh được gõ theo cấu trúc, bạn sẽ cần đảm bảo rằng các trường hợp như trường hợp bạn liệt kê sẽ bị từ chối (vì những lý do chính xác giống như Scala từ chối chúng).

Bạn sẽ từ chối các trường hợp như vậy bằng cách thực hiện điều tương tự như Scala: mô hình hóa loại phụ thuộc đường dẫn thành loại tồn tại. Quy trình đóng gói / giải nén tương tự xung quanh quyền truy cập đối tượng sẽ được giữ và kết quả sẽ trông gần giống với những gì Scala thực hiện. Kết quả có vẻ giống như một đẳng thức danh nghĩa, nhưng nó vẫn sẽ là một hệ thống kiểu cấu trúc vì câu hỏi về tính tương thích loại sẽ vẫn được quyết định trên giao diện thay vì tên.

Gõ cấu trúc có rất nhiều ý nghĩa, nhưng (có lẽ đáng ngạc nhiên) hầu hết các khái niệm tương tự chúng ta đều biết và yêu thích từ các hệ thống loại danh nghĩa thực hiện trong cấu trúc. Gõ cấu trúc không có gì khác hơn là một cách khác để xác định khả năng tương thích kiểu.


0

Gõ cấu trúc làm cho nó dễ dàng hơn để viết mã thư viện chung. Lý do số 1 khiến hệ sinh thái Java trở nên cồng kềnh là bởi vì thật khó để viết các thư viện nhỏ một cách dễ dàng. Nếu Java được gõ theo cấu trúc, tôi nghĩ đó sẽ là một câu chuyện khác và tình huống tốt hơn nhiều.

Nhược điểm duy nhất tôi có thể nghĩ đến cho việc gõ cấu trúc là tiềm năng biên dịch chậm hơn. Tôi không chắc liệu các ngôn ngữ cấu trúc thường biên dịch chậm hơn các ngôn ngữ chỉ định hay không, nhưng ví dụ Golang được gõ theo cấu trúc và rất nhanh trong việc biên dịch.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.