Tôi không thể nghĩ ra một nơi tốt hơn trong số các anh chị em SO để đặt ra một câu hỏi như vậy. Ban đầu tôi muốn hỏi "Con trăn có phải là ngôn ngữ OO thuần túy không?" nhưng xem xét những rắc rối và một số loại khó chịu mà mọi người gặp phải trong khi cố gắng xác định thuật ngữ tôi quyết định bắt đầu với việc có được một định nghĩa rõ ràng cho chính thuật ngữ đó.
Sẽ khá công bằng khi bắt đầu với sự tương ứng của Tiến sĩ Alan Kay, người đã đặt ra thuật ngữ này (lưu ý nguồn cảm hứng trong tương tự sinh học với các tế bào hoặc các vật thể sống khác).
Có các cách sau để tiếp cận nhiệm vụ:
- Đưa ra một phân tích so sánh bằng cách liệt kê các ngôn ngữ lập trình có thể thể hiện (hoặc không làm như vậy) một số thuộc tính duy nhất và đủ để xác định thuật ngữ (mặc dù Smalltalk, Scala,
Java, v.v. - là những ví dụ khả thi nhưng IMO theo cách này dường như không thực sự hoàn chỉnh cũng không có kết quả ) - Đưa ra một định nghĩa chính thức (hoặc gần với nó, ví dụ như trong phong cách học thuật hoặc toán học hơn).
- Đưa ra một định nghĩa triết học hoàn toàn dựa vào bối cảnh ngữ nghĩa của ngôn ngữ cụ thể hoặc kinh nghiệm lập trình tiên nghiệm (phải có một số cơ hội giải thích thành công bởi cộng đồng).
Phiên bản hiện tại của tôi: "Nếu một ngôn ngữ lập trình ( chính thức ) nhất định có thể ( về mặt ngữ pháp ) phân biệt giữa các hoạt động và toán hạng cũng như suy luận về loại của mỗi toán hạng cho dù loại này có phải là một đối tượng (theo nghĩa của OOP) hay không thì chúng ta gọi ngôn ngữ đó là ngôn ngữ OO miễn là có ít nhất một loại trong ngôn ngữ này là đối tượng. Cuối cùng, nếu tất cả các loại ngôn ngữ cũng là đối tượng, chúng tôi xác định ngôn ngữ đó là ngôn ngữ OO thuần túy (mạnh). "
Sẽ đánh giá cao bất kỳ cải thiện có thể của nó. Như bạn có thể thấy tôi chỉ đưa ra định nghĩa phụ thuộc vào thuật ngữ "đối tượng" (thường được tham chiếu đầy đủ dưới dạng lớp đối tượng).
[BIÊN TẬP]
Ngoài ra, tôi sử dụng khái niệm (rất may là hiểu rõ) về một loại như trong các ngôn ngữ đánh máy. Lập trình kiểu dữ liệu hoặc lập trình hướng loại không chỉ là một cách hiểu cú pháp (của văn bản chương trình, tức là làm thế nào để xử lý một số giá trị nhất định của các biến và dữ liệu - một thứ phát triển thành an toàn kiểu) mà có thể được quy cho ngữ pháp ngôn ngữ và được nghiên cứu theo cách chính thức (sử dụng logic toán học) như được gọi là hệ thống loại . Lưu ý rằng việc yêu cầu hệ thống loại cụ thể phải có loại gọi là phổ quát là một trong những cách xác định độ tinh khiết của ngôn ngữ OO (có nhiều cách để mở rộng ngữ nghĩa này).
Lưu ý
cách trả lời :
- nó giúp nếu bạn chỉ định một cuốn sách hoặc một tài liệu tham khảo hỗ trợ / giải thích sự hiểu biết của bạn về thuật ngữ và khái niệm (thường là một định nghĩa tốt bao gồm hoặc tham chiếu tất cả các khái niệm phụ thuộc ngoại trừ cơ bản).
- nếu có thể chỉ ra một loại thụt lề của câu trả lời / định nghĩa của bạn nếu nó không rõ ràng (xem ở trên: 1 - bằng ví dụ ngôn ngữ, 2 - logic toán học, 3 - mô tả kỹ thuật và triết lý lập trình)
- phân loại rất quan trọng (và cũng vì thuật ngữ OO thuần túy được bao gồm trong thuật ngữ OO) trong khi trả lời cố gắng trộn các phần tử của mô hình OO từ các phương pháp nổi tiếng khác (và không có nghĩa là nhầm lẫn / chồng chéo chúng, ví dụ như các yếu tố của lập trình mô đun có thể được đề cập / hiện thân với lập trình OO): cố gắng phân biệt OOP với (bao gồm hoặc là một phần của) Lập trình chức năng, lập trình logic (đặc biệt mạnh), Kiểu dữ liệu Abstarct (ADT), Modular, Metaprogramming (khái quát và thời gian mở rộng vĩ mô của LISP), Hợp đồng (ví dụ Eiffel), định hướng theo khía cạnh (AO), (sự khác biệt giữa phân loại khai báo và chức năng cũng như các định nghĩa lịch sử về cấu trúc của Dijkstra là rõ ràng)
về khó khăn trong việc đưa ra một định nghĩa chính thức : thật đáng ngạc nhiên, rất dễ dàng để đưa ra một mô tả toán học về OOP dưới dạng một hệ thống logic (chính thức) nhất định (rất có thể dựa trên loại) và xác định khái niệm này theo khái niệm khác. Người ta thậm chí có thể cố gắng làm một cái gì đó thực tế hơn bằng cách áp dụng chủ nghĩa hình thức đó để kiểm tra an toàn hoặc các khía cạnh thiết kế ngôn ngữ mới thay vì chỉ giải trí hoặc tập thể dụctrừu tượng(cũng là công thức tra cứu OOP trong Lý thuyết loại trực giác , các loại phụ thuộc , độc lập, trong hình thức FOL như tính toán lambda và chỉ bằng cách sử dụng lý thuyết thể loại). Một điểm chính ở đây là không ngạc nhiênCác công thức như vậy IMO bị thiên vị mạnh mẽ (thiếu sót) bởi sự hiểu biết ban đầu không đầy đủ về OOP (trong kỹ thuật máy tính) và cuối cùng gần như không thể truy cập được (do đó hầu như không đóng góp ngược vào thế giới lập trình - có thể ngoại trừ một số phần trăm tìm thấy các ứng dụng từ thế giới chính thức tích hợp vào các ngôn ngữ phổ biến ).
Vì vậy, có, rất khó để đưa ra một định nghĩa "tốt", không chỉ là định nghĩa. Nhưng tôi tích cực khi hỏi điều này ở đây vì kinh nghiệm và sự tham gia trực tiếp của bạn, các bạn.