2009-02-03 18 views
5

Gần đây tôi đã suy nghĩ rất nhiều về các lựa chọn thay thế cho cách tiếp cận dựa trên lớp để định hướng đối tượng. Một điều khiến tôi khó hiểu trong các ngôn ngữ hiện nay là chúng tôi thường sử dụng static classes/singletons to design single (global) objects vì không có cách nào khác để làm điều đó, vì vậy theo tôi, đó là một hack hơn là một tính năng. Một điều nữa là Java chẳng hạn cho phép lập trình viên have enums with additional data (global state) and functionality làm cho chúng trở thành đối tượng trong mắt tôi. Dù sao, điều tôi muốn biết là liệu bạn có ý tưởng nào về cách tiếp cận đối tượng theo ngôn ngữ biên dịch và hiệu quả hay không (do đó, việc tạo các đối tượng bằng cách tạo mẫu có lẽ không phải là một ý hay) hoặc, bạn không có bất kỳ thứ gì, cho dù có những thứ trong cách tiếp cận OO cổ điển làm bạn khó chịu quá nhiều.Bạn có thể hình dung ra bất kỳ cách nào khác để có OO được triển khai hơn cách tiếp cận dựa trên lớp học cổ điển không?

[CHỈNH SỬA]: Chỉ để làm rõ mọi thứ. Như đã nói ở trên, tôi đã biết lập trình dựa trên nguyên mẫu.

+0

Chỉ vì tò mò, điều này là gì? Bạn đang thiết kế một ngôn ngữ? –

+0

Vâng, tôi đã. Scanner + Parser đã được hoàn thành, nhưng khi tôi đang ở giữa việc thực hiện phân tích ngữ nghĩa, tôi bắt đầu tự hỏi mình về các câu hỏi trên. Hiện tại, dự án trên băng như tôi đã không tìm thấy một giải pháp tốt cho điều đó (thật không may, tôi là người cầu toàn). Mặc dù, điều đó không có nghĩa là tôi vẫn không nghĩ về điều đó. ;) – balu

+0

Nên là một wiki cộng đồng. –

Trả lời

4

Hãy xem qua số Actor Model. Nó giống như lớp học ngoại trừ không đồng bộ. Nếu mỗi diễn viên là một Nhà nước hữu hạn, bạn sẽ có một hệ thống có tiềm năng mạnh mẽ.

Erlang sử dụng một cái gì đó như thế, tôi đã nói ... ít nhất là tương tự. Vấn đề với mô hình diễn viên là nó không cần phải được thực hiện hoàn toàn, và do đó không cần phải là một phần của Erlang.

Tôi đã bắt đầu một ngôn ngữ nhỏ sử dụng mô hình đó một lần cách đây vài năm. Tôi có thể thử lại lần nữa.

+0

Mã OOP của tôi thường trông rất giống như diễn viên. Giao diện là định nghĩa thư. Hầu hết các phương thức đều bị vô hiệu. Có sự phân biệt rõ ràng giữa "thực thể" và "giá trị". Nó cũng làm cho hầu hết các mẫu thiết kế có ý nghĩa hơn :) – kyoryu

1

Tôi nghĩ rằng bạn đang gặp sự cố khi xác định cách tiếp cận "cổ điển OO". Là phương pháp tín hiệu trong Objective-C cổ điển hoặc phương pháp tĩnh trong tiêu chuẩn C + +?

Trong các ngôn ngữ chức năng, thật dễ dàng để có các hàm không đối tượng, theo nghĩa nào đó, hoạt động như các đối tượng vì chúng trả về các hàm có triển khai mờ đục. Ví dụ, đoạn mã sau vào Đề án

(define (create-ball color) 
    (lambda (attribute-name) 
     (if (equal? attribute-name "color") 
      color 
      "method-not-supported")))) 

sẽ ra một chức năng mà không phải là chính thức một "đối tượng", nhưng nó có thể hoạt động như một vì nó lưu trữ nhà nước, nhưng bạn không phải là rất rõ ràng về những gì chính xác là sai với các mô hình hướng đối tượng bạn đã được tiếp xúc.

3

Bây giờ bộ đồ chống cháy của tôi được bảo mật an toàn, tôi có thể nói: Tôi không thích OOP.

Vấn đề chính mà tôi gặp phải là nó cố gắng đưa ra một phân loại duy nhất trong đó mọi đơn vị chức năng thực sự thuộc về.

Có một số vấn đề với điều này. Đầu tiên, tạo ra một taxonmy tốt là cứng. Mọi người hút vào việc tạo ra chúng. Thứ hai, tôi không tin rằng bạn thực sự có thể cấu trúc một hệ thống phân cấp hợp lý, có thể duy trì, có thể chịu được sự thay đổi trong một dự án có chứa rất nhiều thực thể; toàn bộ thực hành tái cấu trúc về cơ bản là thừa nhận khó khăn của việc tạo ra các taxanomies lớn, tất cả không thích hợp.

Thực ra, tôi nghĩ rằng OOP được thiết kế quá mức. Tất cả mọi thứ bạn có thể làm với OOP có thể được thực hiện với các hàm bậc cao hơn (HOFs). HOFs thanh lịch hơn, nhiều giải pháp linh hoạt hơn cho cùng các vấn đề mà OOP cố gắng giải quyết.

Vì vậy, nếu bạn đang yêu cầu một cách khác để làm công cụ kiểu OOP, HOF có lẽ là công nghệ thay thế gần nhất có mức độ linh hoạt tương tự.

+0

Tôi đồng ý ở nhiều điểm. Sự bất đồng duy nhất của tôi là OOP giống như một biểu thức chính quy. Sử dụng nó một chút và nó tổ chức cuộc sống của bạn. Sử dụng nó quá nhiều, và nó thêm lỗi. Tôi nghĩ HOF là hoàn toàn giống nhau về khía cạnh đó. – user54650

0

có một cái nhìn sâu tại javascript trong đó có các mô hình dựa nguyên mẫu hoặc kiểm tra lua trong đó có một số cách kỳ lạ để thực hiện định hướng đối tượng

0

Hãy xem Clos, mà về cơ bản là chức năng/phương pháp dựa.

0

Ngôn ngữ Go của Google có cách tiếp cận khác nhau theo định hướng đối với định hướng đối tượng, có thể đáng xem.

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