Lợi ích của OOP cổ điển so với ngôn ngữ giống như Go


13

Tôi đã suy nghĩ rất nhiều về thiết kế ngôn ngữ và những yếu tố nào cần thiết cho một ngôn ngữ lập trình "lý tưởng" và việc nghiên cứu Google Go đã khiến tôi đặt câu hỏi về nhiều kiến ​​thức phổ biến khác.

Cụ thể, Go dường như có tất cả những lợi ích thú vị từ lập trình hướng đối tượng mà không thực sự có bất kỳ cấu trúc nào của ngôn ngữ hướng đối tượng. Không có lớp học, chỉ có cấu trúc; không có sự kế thừa lớp / cấu trúc - chỉ nhúng cấu trúc. Không có bất kỳ hệ thống phân cấp, không có lớp cha, không có triển khai giao diện rõ ràng. Thay vào đó, quy tắc truyền kiểu dựa trên một hệ thống lỏng lẻo tương tự như gõ vịt, sao cho nếu một cấu trúc thực hiện các yếu tố cần thiết của "Trình đọc" hoặc "Yêu cầu" hoặc "Mã hóa", thì bạn có thể truyền và sử dụng nó như một.

Có điều gì đó về OOP được triển khai trong C ++ và Java và C # vốn có khả năng cao hơn, dễ bảo trì hơn, bằng cách nào đó mạnh mẽ hơn mà bạn phải từ bỏ khi chuyển sang ngôn ngữ như Go? Bạn có lợi ích gì khi từ bỏ để đạt được sự đơn giản mà mô hình mới này đại diện?

EDIT đã
xóa câu hỏi "lỗi thời" mà độc giả dường như bị treo quá mức và tức giận.

Câu hỏi đặt ra là, mô hình hướng đối tượng truyền thống (với hệ thống phân cấp và như vậy) như thường thấy trong các triển khai ngôn ngữ thông thường phải đưa ra điều gì mà không thể thực hiện dễ dàng trong mô hình đơn giản này? Hay nói cách khác, nếu bạn định thiết kế một ngôn ngữ ngày nay, có lý do gì bạn muốn đưa vào khái niệm phân cấp lớp không?


1
OOP có làm cho lập trình thủ tục trở nên lỗi thời không? Tôi ghét âm thanh mô phạm hoặc tôi đang nói chuyện với bạn, nhưng đó là câu đầu tiên xuất hiện trong tâm trí. Go cung cấp một mô hình (ish) mới. Với thử nghiệm, người dùng sẽ tìm ra những gì nó tốt và những gì nó không tốt (như với tất cả các mô hình và ngôn ngữ), và chúng tôi sẽ kết thúc với hàng trăm sản phẩm tuyệt vời (cùng với đó là chia sẻ công bằng các sản phẩm xấu) được viết bằng Go . Ít nhất, đó là ý kiến ​​của tôi
Jamie Taylor

1
Có một số bài đọc thú vị khi bạn Google cho OOP đã chết . Tôi khuyên Web sẽ chết khi OOP chết
Andomar

Có một giá trị nhỏ như vậy trong OOP đến nỗi nó không đáng để lãng phí thời gian của bạn.
SK-logic

1
Tôi đồng ý với nhận xét trước đó không tập trung vào OOP quá nhiều. Bên cạnh đó, OOP không có nghĩa là C ++ hoặc Java. Hãy thử đọc abit trên ltu.org
AndreasScheinert

C ++, Java và C # không phải là ngôn ngữ OOP "cổ điển". Nếu có một ngôn ngữ OOP cổ điển, tôi nghĩ đó là Smalltalk.
kevin cline

Câu trả lời:


16

Không có mô hình mới. Hướng đối tượng là một mẫu bạn sử dụng để viết chương trình, thậm chí không được xác định rõ ràng. Các ngôn ngữ khác nhau cung cấp các đặc điểm khác nhau điển hình cho định hướng đối tượng (định nghĩa về các loại mới, đóng gói, phân cấp loại, đa hình, truyền thông điệp và nhiều hơn nữa) nhưng có thể không cung cấp cho người khác. Trong những trường hợp đó, các lập trình viên phải thi đua với họ nếu có nhu cầu.

Nhiều ngôn ngữ cung cấp các tính năng này không có khái niệm tương tự về khái niệm lớp - ví dụ Javascript và Common Lisp. Việc triển khai được cung cấp bởi các ngôn ngữ giống như Java (dựa trên lớp, với sự kế thừa duy nhất, giao diện, công văn dựa trên kiểu) chỉ là một trong những khả năng và không nhất thiết là cách tốt nhất.


11
+1 cho "không nhất thiết là tốt nhất". Trích dẫn Alan Kay: "Tôi đã phát minh ra thuật ngữ Hướng đối tượng và tôi có thể nói với bạn rằng tôi không có C ++ trong tâm trí." (anh ấy cũng không có C # và / hoặc Java, tôi sẽ khiêm tốn đoán)
herby

1
@herby Tôi đã thấy nó gợi ý rằng các hệ thống đại lý (tương tự như cách Erlang hoạt động) gần với ý định cuối cùng của Alan Kay cho OOP.
CodexArcanum

2
Er, Common Lisp chắc chắn có các lớp. Nhưng, thông thường, một lớp CL chứa dữ liệu và các phương thức được định nghĩa trên "các hàm chung". Là một tác dụng phụ, điều đó mang lại cho bạn một cách thuận tiện để thực hiện nhiều công văn, vì các phương thức không còn được gắn chặt với "một lớp thực hiện duy nhất".
Vatine

Vâng, điều tôi muốn nói là nó không có các lớp theo nghĩa Java
Andrea

5

Bạn có lợi ích gì khi từ bỏ để đạt được sự đơn giản mà mô hình mới này đại diện?

Việc kiểm tra kiểu cho một hệ thống kiểu cấu trúc phức tạp hơn nhiều so với việc kiểm tra đơn giản nếu lớp cơ sở có trong danh sách thừa kế của bạn hay không. Công văn ảo trở nên phức tạp hơn một chút và có khả năng hoạt động kém hơn.

Liệu một hệ thống như vậy đã lỗi thời khái niệm OOP?

Không. Miễn là bạn có thể tạo chương trình theo 'đối tượng thực hiện công việc' thay vì danh sách hướng dẫn hoặc bộ quy tắc được khai báo hoặc chuỗi chức năng xếp tầng ... việc triển khai không thành vấn đề. Tương tự như vậy, việc thay đổi hệ thống loại không làm mất hiệu lực của bất kỳ nguyên tắc OO phổ biến nào.

Bạn vẫn có thể làm việc trên một loại cơ sở và không quan tâm đến loại thực tế của nó. Bạn vẫn có thể mở rộng các loại mà không sửa đổi chúng. Bạn vẫn có thể làm cho một loại chỉ làm một điều. Bạn vẫn có thể cung cấp giao diện hạt mịn. Bạn vẫn có thể cung cấp trừu tượng cho các loại của bạn.

Làm thế nào một ngôn ngữ cho phép điều đó không thực sự quan trọng.


Trên thực tế, Go làm cho tất cả những thứ OOP đó trở nên dễ dàng hơn và thêm một vài khả năng bổ sung như mở rộng một loại để cung cấp giao diện mới áp dụng cho các phiên bản hiện tại (tất nhiên miễn là bạn không cần thành viên dữ liệu mới).
Jan Hudec

4

Tôi nghĩ rằng ý tưởng của bạn về OOP là khá ít:

Tôi đã phát minh ra thuật ngữ 'Lập trình hướng đối tượng' và {Java và C ++} này không phải là điều tôi nghĩ.
- Alan Kay .

Sự lựa chọn gõ (phân nhóm chỉ định, phân nhóm cấu trúc hoặc gõ vịt - hoặc kết hợp cả hai) phần lớn là trực giao với OOP. Kế thừa và các lớp hoàn toàn trực giao với OOP. Nếu bạn dành chút thời gian để chơi với io, bạn sẽ thấy điều đó.

Bây giờ bạn có thể hỏi loại hệ thống nào là "tốt hơn", và phương tiện tái sử dụng và kết hợp mã nào. Và cố gắng xác định các ưu điểm và nhược điểm giữa các lựa chọn được thực hiện trong Simula (và sau này được thực hiện trong C ++, Java và C #) và các lựa chọn được thực hiện trong Go. Nhưng đây là tất cả các câu hỏi khác nhau và khác biệt.

Cuối cùng, OOP là một khái niệm rất mơ hồ và tất cả các nỗ lực để thực hiện nó đều có rất nhiều hương vị. Nhưng để thực sự đơn giản hóa mọi thứ, tôi muốn nói rằng ý tưởng cốt lõi của OOP là soạn thảo các hệ thống của các hệ thống con RẮN . Bây giờ điều này hoàn toàn làm mờ đi các mô hình khác, nhưng tôi đoán rằng đó là lý do tại sao các ngôn ngữ đa mô hình đã trở nên phổ biến gần đây và tại sao Google lại tự mình sử dụng nó.


2
Câu hỏi liên quan đến các khái niệm, không cần thiết thuật ngữ. Nếu bạn có thể đưa ra một cái tên hay hơn "OOP" để chỉ khái niệm phân cấp lớp và tất cả sự cắt xén đi kèm với nó, thì chúng ta có thể sử dụng nó để thay thế.
tylerl

@tylerl: Bạn đang nhầm lẫn ít nhất hai câu hỏi thành một. Một là, liệu phân nhóm cấu trúc có tốt hơn phân nhóm đề cử hay không. Một cái khác về cơ bản là, liệu thành phần tốt hơn so với thừa kế. Những câu hỏi này là trực giao lẫn nhau. Tôi nghĩ cuối cùng, ngôn ngữ "tốt nhất" không đưa ra lựa chọn này cho bạn. Tôi sẽ suy đoán rằng Go chỉ đơn giản là có một bộ vấn đề khác, nhưng chúng ta sẽ xem liệu Google có thêm các tính năng đó "quay lại" hay không.
back2dos

Tôi muốn chỉ một ngôn ngữ có hầu hết các khả năng của C ++ nhưng nhỏ hơn và đơn giản hơn. C ++ là ngôn ngữ duy nhất ngoại trừ C thực tế cho các hạt nhân và nó cung cấp cho bạn các công cụ cực kỳ hữu ích như hàm hủy và STL. Và nguyên tắc quan trọng 'nếu bạn không sử dụng nó, bạn sẽ không trả tiền cho nó'. OO, được sử dụng một cách chính xác, là vô cùng mạnh mẽ. Nhưng thuốc generic và các khái niệm phi OO khác cũng cực kỳ cần thiết. C cung cấp cho bạn gần như không có gì, và Go ném đi OO thực sự cho một số ý tưởng mới lạ.
Erik Alapää

1

OOP không lỗi thời.

Như Andrea đã nói, đã có nhiều khái niệm được đề xuất thay thế cho các lớp (ví dụ: typklass). OOP có một lợi ích lớn: nó được dạy ở nhiều nơi và văn hóa của OOP chủ yếu được chia sẻ giữa các nhà phát triển.

Điều này cho phép giao tiếp phong phú hơn trong một nhóm. Người ta có thể nói về các nhà máy dễ dàng hơn về các prepromorphic Zygohistomorphic . OOP cấu trúc theo cách bạn sẽ tổ chức và giao tiếp về chương trình của mình với các sơ đồ thường được sử dụng. Đây là một tài sản mạnh mẽ.


1
Tôi nghĩ: bị đánh đập ở nhiều nơi. Thật ra không phải là một lợi thế.
AndreasScheinert

@AndreasScheinert tại sao nó không phải là một lợi thế?
Simon Bergot

Bởi vì để đưa ra một phán đoán, bạn nên biết ít nhất 1 sự thay thế tốt như nhau. Đó là một vấn đề thói quen, mọi người thích ở trong vùng thoải mái của họ và điều đó dẫn đến sự trì trệ.
AndreasScheinert

@AndreasScheinert sử dụng công cụ phù hợp cho công việc. Oop không hoạt động cho tất cả các kịch bản .... không liên quan gì đến vùng thoải mái của họ
pqsk

1

Không, không có gì mới ở đây, cũng không phải là lỗi thời. C ++ cũng có các giao diện ngầm ở dạng mẫu, nhưng mọi người vẫn sử dụng các hàm ảo. Bạn cần các giao diện rõ ràng để đối phó với, ví dụ: giao diện nhị phân hoặc giao diện nơi mã khác đơn giản là không được biết đến vào thời gian biên dịch.

Bạn có thể lập luận rằng đây chỉ đơn giản là một trường hợp suy luận và nói rõ ràng, nó không giống như một "mô hình mới" và thực sự chỉ là thuận tiện hơn.

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.