2010-04-14 39 views
18

OK, đây sẽ là lần đầu tiên tôi đánh bại một con ngựa sắp chết.Tại sao các đại biểu theo phong cách .NET không phải là đóng cửa trong Java?

Tuy nhiên, câu hỏi này khác với câu hỏi trước đây của tôi về đóng cửa/đại biểu, hỏi về kế hoạch cho đại biểu và thông số dự kiến ​​và triển khai cho đóng cửa.

Câu hỏi này là về - tại sao cộng đồng Java đang cố gắng xác định 3 loại đóng cửa khác nhau khi chúng ta có thể đơn giản ăn cắp toàn bộ khái niệm đại biểu khóa, kho và thùng từ người hàng xóm thân yêu và thân thiện của chúng tôi - Microsoft.

Có hai kết luận phi kỹ thuật tôi sẽ rất cám dỗ để nhảy vào:

  1. Cộng đồng Java nên giữ lên niềm tự hào của mình, với chi phí cần phải đi xuyên qua những nỗ lực phức tạp, bằng cách không chịu thua vay bất kỳ khái niệm nào của Microsoft hoặc bằng cách khác minh họa sự sáng chói của Microsoft.
  2. Đại biểu là công nghệ được cấp bằng sáng chế của Microsoft.

Alright, bên cạnh hai khả năng trên,

Q1. Có bất kỳ điểm yếu hoặc không đầy đủ trong các đại biểu theo phong cách .NET rằng ba (hoặc nhiều) hình thức đóng cửa sẽ được giải quyết?

Q2. Tôi hỏi điều này trong khi chuyển đổi giữa Java và C# và nó khiến tôi hiểu rằng các đại biểu C# thực hiện chính xác những gì tôi cần. Có các tính năng sẽ được thực hiện trong các bao đóng mà hiện không có sẵn trong các đại biểu C# không? Nếu vậy họ là gì bởi vì tôi không thể nhìn thấy những gì tôi cần nhiều hơn những gì C# đại biểu đã cung cấp đầy đủ cho tôi?

Q3. Tôi biết rằng một trong những mối quan tâm về việc thực hiện đóng cửa/đại biểu trong java là giảm tính trực giao của ngôn ngữ, trong đó có nhiều cách được tiếp xúc để thực hiện một tác vụ cụ thể. Liệu nó có đáng để chập chững mức độ và thời gian dành để tránh các đại biểu chỉ để đảm bảo java giữ lại mức độ trực giao của nó không? Trong thiết kế quan hệ, chúng ta biết rằng nó được khuyến khích để phá vỡ trực giao bằng cách thường xuyên đáp ứng đầy đủ chỉ là hình thức bình thường thứ 2. Tại sao java không thể bị giảm tính trực giao và OO-Ness vì mục đích đơn giản?

Q4. Kiến trúc của JVM bị hạn chế về mặt kỹ thuật khi triển khai các đại biểu theo kiểu .NET. Nếu lý do này là WERE (giả thiết để nhấn mạnh không phù hợp), thì tại sao ba đề xuất đóng cửa không được ẩn sau một từ khóa hoặc chú thích đại biểu đơn giản: nếu chúng ta không thích sử dụng @delegate, chúng ta có thể sử dụng @method. Tôi không thể thấy cách định dạng tuyên bố đại biểu phức tạp hơn ba đề xuất đóng cửa.

+0

Về lý thuyết phi kỹ thuật thứ hai của bạn, tôi khá chắc chắn bằng sáng chế không phải là vấn đề. – itowlson

+0

Cảm ơn itowlson đã bổ sung bằng cách chỉnh sửa sự lười biếng của tôi. Lấy làm tiếc. –

+0

Bạn nên đưa ra một số ví dụ cú pháp của hệ thống bạn thích. – xyz

Trả lời

2

C# có các đóng cửa ngoài các đại biểu. Trong tâm trí của tôi họ không giống nhau.

delegate = con trỏ hàm.

closure = {function, environment}. Cách xác định chức năng [ẩn danh] và đóng gói nó với môi trường của nó. Nói đúng ra sau này chỉ nên được gọi là đóng cửa, trước đây là 'biểu hiện lambda'.

+1

a .net delegate luôn có 1. đối tượng và 2. target nơi target là một token method và object là con trỏ này – zproxy

36

Câu hỏi của bạn thật mỉa mai. Bạn đang tự hỏi tại sao cộng đồng Java đang phải vật lộn với ba đề xuất khác nhau để thêm bao đóng và giải pháp được đề xuất của bạn là thêm tùy chọn thứ tư vào kết hợp?

Nhưng để trả lời câu hỏi của bạn:

  • Các diễn đàn phù hợp với thảo luận là danh sách gửi thư của lambda dự án OpenJDK. Đây không phải là nơi các đề xuất có khả năng ảnh hưởng đến nỗ lực đó.

  • Các hệ thống kiểu cho C# và Java khác nhau đáng kể, vì vậy giải pháp C# sẽ không áp dụng trực tiếp. Ví dụ, C# có phương sai khai báo-site (vào/ra), trong khi java có phương sai của trang sử dụng (ký tự đại diện). Suy luận của các kiểu tham số lambda như được chỉ rõ trong C# sẽ không áp dụng trong Java.

  • Sự phát triển của Java phải duy trì tương thích ngược, nhưng việc thêm từ khóa đại biểu sẽ là thay đổi đột phá.

  • C# có ba loại biểu thức đại biểu: biểu thức cũ với từ khóa đại biểu, tuyên bố lambdas với => {và biểu thức lambdas. Nếu nhóm ngôn ngữ C# có nó làm lại, chúng tôi chắc chắn không có nhiều hình thức này. Tại sao Java nên chấp nhận hành lý lịch sử của C#?

  • Vì C# generics hoạt động trên nguyên thủy, Func <> và Action <> loại đại biểu có thể được sử dụng làm loại chức năng cấu trúc của người nghèo. Nhưng trong Java, generics bị xóa, chỉ làm việc trên các kiểu tham chiếu, và các kiểu không thể phân biệt bằng tính chất của chúng. Do đó Java sẽ phải có một số lượng lớn các loại hàm "tiêu chuẩn" có tên rõ ràng để có được cùng một hiệu ứng. Điều đó sẽ không được đẹp.

Nhìn chung, giải pháp C# không thích nghi với giải pháp rất tự nhiên trong Java.

+0

Chỉ tò mò về dòng "Nếu nhóm ngôn ngữ C# có nó làm lại, chúng ta chắc chắn không có nhiều hình thức này. " - đó là một câu trích dẫn từ nhóm C#, hay chỉ là sự nhận của bạn về các câu lệnh lambda và thừa nhận một số phần thừa? – Bittercoder

+6

FYI: Tôi thuộc nhóm ngôn ngữ C#. Cho rằng chúng tôi sẽ không có nó để làm hơn nữa, nó sẽ là vô nghĩa để cung cấp cho bất kỳ trạng thái chính thức để ý kiến ​​của tôi. Nhưng quan điểm của tôi là biểu mẫu "đại biểu" của biểu thức lambda trong thực tế đã được thay thế bằng biểu mẫu "=>". –

Các vấn đề liên quan