Mẫu hình lập trình |
---|
|
Lập trình đối tượng (tiếng Anh: Object-oriented programming - OOP) là một mô hình lập trình dựa trên khái niệm 'đối tượng', trong đó đối tượng lưu trữ dữ liệu trong các thuộc tính và mã nguồn được tổ chức thành các phương thức. Các phương thức này cho phép đối tượng tương tác với và chỉnh sửa dữ liệu của đối tượng khác, thông qua các phương thức như 'this' hoặc 'self'. Trong lập trình đối tượng, chương trình được cấu trúc bằng cách chia thành các đối tượng tương tác với nhau. Các ngôn ngữ lập trình đối tượng rất phong phú, phần lớn là ngôn ngữ lập trình theo lớp, trong đó các đối tượng được coi là thực thể của lớp, dùng để định nghĩa kiểu dữ liệu.
OOP giúp nâng cao năng suất, đơn giản hóa việc bảo trì và mở rộng phần mềm bằng cách cho phép lập trình viên tập trung vào các đối tượng phần mềm cấp cao hơn. Nhiều người cho rằng OOP dễ học hơn cho người mới bắt đầu so với các phương pháp lập trình cũ. Nói một cách đơn giản, OOP là một nỗ lực nhằm giảm bớt công việc viết mã cho lập trình viên, cho phép họ phát triển các ứng dụng mà các yếu tố bên ngoài có thể tương tác với chúng như cách tương tác với các đối tượng vật lý.
Trong ngôn ngữ OOP, các đối tượng là sự kết hợp giữa mã và dữ liệu, được coi là một đơn vị duy nhất. Mỗi đối tượng có một tên riêng và tất cả các tham chiếu đến đối tượng đó đều thông qua tên của nó. Mỗi đối tượng có khả năng nhận thông báo, xử lý dữ liệu nội bộ và gửi hoặc phản hồi các thông báo đến các đối tượng khác hoặc môi trường.
Hầu hết các ngôn ngữ lập trình phổ biến hiện nay (như C++, Delphi, Java, Python, v.v...) là các ngôn ngữ đa mô hình và hỗ trợ lập trình đối tượng ở các mức độ khác nhau, thường kết hợp với lập trình mệnh lệnh hoặc thủ tục. Một số ngôn ngữ lập trình đối tượng đáng chú ý bao gồm Java, C++, C#, Python, PHP, Ruby, Perl, Object Pascal, Objective-C, Dart, Swift, Scala, Common Lisp, và Smalltalk.
Các đặc điểm cơ bản
Lập trình hướng đối tượng có 4 đặc điểm chính như sau:
- Tính trừu tượng (abstraction): Đây là khả năng của chương trình để bỏ qua một số chi tiết không cần thiết, tập trung vào những yếu tố cốt lõi. Mỗi đối tượng hoạt động như một 'đơn vị' thực hiện các công việc nội bộ, thay đổi trạng thái và giao tiếp với các đối tượng khác mà không cần tiết lộ cách thức thực hiện. Tính trừu tượng còn cho phép một đối tượng mở rộng để bao gồm các đặc điểm chung, mặc dù chính nó có thể không thực hiện các biện pháp cụ thể. Điều này được gọi là lớp trừu tượng hoặc lớp cơ sở trừu tượng.
- Tính đóng gói (encapsulation) và che giấu thông tin (information hiding): Tính chất này không cho phép thay đổi trực tiếp các thuộc tính của đối tượng từ bên ngoài. Chỉ các phương thức nội tại của đối tượng mới có thể thay đổi trạng thái của nó. Cách thức mà dữ liệu nội tại có thể bị ảnh hưởng bởi bên ngoài hoàn toàn phụ thuộc vào người lập trình. Điều này đảm bảo tính toàn vẹn của đối tượng.
- Tính đa hình (polymorphism): Được thể hiện qua việc gửi các thông điệp (message). Các thông điệp này giống như việc gọi các hàm trong đối tượng. Các phương thức phản hồi thông điệp sẽ khác nhau tùy theo đối tượng nhận thông điệp. Lập trình viên có thể định nghĩa một đặc tính cho nhiều đối tượng gần gũi, và khi thực hiện, các đặc tính sẽ tự động phù hợp với đặc điểm của từng đối tượng mà không bị nhầm lẫn.
- Ví dụ, khi định nghĩa hai đối tượng 'hinh_vuong' và 'hinh_tron', có một phương thức chung là 'chu_vi'. Khi gọi phương thức này, đối với 'hinh_vuong' nó sẽ tính theo một công thức, còn với 'hinh_tron' thì theo công thức khác.
- Tính kế thừa (inheritance): Tính năng này cho phép một đối tượng kế thừa các thuộc tính từ đối tượng khác, giúp chia sẻ và mở rộng các đặc tính đã có mà không cần phải định nghĩa lại. Tuy nhiên, không phải tất cả các ngôn ngữ lập trình hướng đối tượng đều hỗ trợ tính năng này.
Những điểm mới về mô hình và quan điểm
OOP vẫn là một chủ đề gây tranh cãi về định nghĩa chính xác và các nguyên lý cơ bản của nó.
Theo cách hiểu rộng nhất, OOP được coi là một phương pháp lập trình phân cấp thành nhiều mô-đun (module), mỗi mô-đun hoạt động như một lớp vỏ đại diện cho từng kiểu dữ liệu.
Các khái niệm liên quan đã được tập hợp để xây dựng một khung cho lập trình. Những triết lý của lập trình hướng đối tượng đã trở thành một sự thay đổi mạnh mẽ trong ngành lập trình.
Các mẫu hình lập trình khác như lập trình chức năng và lập trình thủ tục chú trọng vào các hành động, trong khi lập trình lô-gíc tập trung vào các khẳng định hợp lý để kích hoạt mã chương trình.
OOP đã tiến triển độc lập từ nghiên cứu về các ngôn ngữ hệ thống mô phỏng như SIMULA 67 và từ nghiên cứu các kiến trúc hệ thống tin cậy cao như kiến trúc CPU và các khả năng cơ bản của hệ điều hành.
Một đặc điểm nổi bật của OOP là khả năng xử lý các kiểu con của dữ liệu.
Dữ liệu của các đối tượng, nói chung, được yêu cầu trong thiết kế phải đáp ứng các nhu cầu của lập trình viên (tức là các lớp).
Các kiểu dữ liệu có thể bị giới hạn thêm bởi các điều kiện dù chúng thuộc cùng loại dữ liệu với các kiểu không bị ràng buộc. Những kiểu dữ liệu này được gọi là kiểu dữ liệu con. Cả hai loại kiểu dữ liệu đều dựa vào và điều chỉnh bởi các hành xử (tức là các phương thức) đã được định nghĩa. Các điều kiện hoặc yêu cầu này có thể được nêu rõ ràng hoặc được giả định ngầm. Các ngôn ngữ lập trình hướng đối tượng cung cấp nhiều cơ chế để xác nhận rằng các giả định này là địa phương cho một phần của chương trình, và những cơ chế này có thể được tìm thấy trong tài liệu về lập trình hướng đối tượng.
OOP hiện đang được quảng bá rộng rãi cho nhiều sản phẩm và dịch vụ. Các định nghĩa và lợi ích của các đặc điểm OOP thường bị làm nổi bật bởi mục tiêu thương mại. Hơn nữa, nhiều ngôn ngữ lập trình có cách tiếp cận riêng biệt với OOP, khiến cho nó ít tổng quát ở một số khía cạnh.
Các định nghĩa chính xác về OOP có thể thay đổi tùy theo quan điểm. Đặc biệt, các ngôn ngữ lập trình với kiểu tĩnh thường có cái nhìn khác so với các ngôn ngữ với kiểu động về OOP, bởi vì chúng tập trung vào thời gian biên dịch thay vì thời gian thực thi của chương trình.
OOP thường được coi là một mẫu hình hơn là một kiểu hay phong cách lập trình, nhấn mạnh rằng OOP có thể thay đổi cách phát triển phần mềm bằng cách thay đổi cách nhìn nhận của lập trình viên và kỹ sư phần mềm về phần mềm.
Mẫu hình của OOP chủ yếu là về thiết kế hơn là lập trình. Một hệ thống được thiết kế bằng cách xác định các đối tượng sẽ tồn tại trong hệ thống đó, trong mã hiện tại có thể không tương thích với đối tượng, hoặc với người dùng đối tượng do tính chất đóng của đối tượng.
Cần lưu ý rằng có sự khác biệt giữa mẫu hình hướng đối tượng và lý thuyết hệ thống. OOP tập trung vào các đối tượng như các thành phần của một hệ thống, trong khi lý thuyết hệ thống tập trung vào toàn bộ hệ thống. Các phương pháp thiết kế phần mềm hay kỹ thuật khác sử dụng các lớp và đối tượng như các thành phần cơ bản trong hệ thống lớn hơn, và có thể xem như bước trung gian từ mẫu hình hướng đối tượng đến các mô hình 'định hướng thực tế' của lý thuyết hệ thống.
Các kiểu mẫu trong lập trình hướng đối tượng
Có nhiều cách tiếp cận trong lập trình hướng đối tượng. Sự khác biệt giữa các cách tiếp cận này thường dựa vào việc ngôn ngữ lập trình ưu tiên khía cạnh nào của OOP và cách chúng kết hợp các cấu trúc theo những phương pháp khác nhau.
OOP trong ngữ cảnh các ngôn ngữ cấu trúc
Trong các ngôn ngữ cấu trúc, OOP thường xuất hiện như một dạng mở rộng của kiểu dữ liệu, cho phép chúng hoạt động như các đối tượng trong OOP, với các kiểu dữ liệu trừu tượng và tính kế thừa. Mỗi phương pháp thực tế giống như một chương trình con, được quy định trong một lớp.
Các mẫu thiết kế cơ bản
Khác với lớp, nguyên mẫu là một phương pháp ít được biết đến nhưng quan trọng, giúp chia sẻ hành vi trong lập trình hướng đối tượng. Khi một đối tượng được định nghĩa, các đối tượng khác có thể được tạo ra từ đối tượng gốc. Ngôn ngữ lập trình JavaScript, thuộc chuẩn ECMAScript, và ngôn ngữ Self từ Sun Microsystems là những ví dụ điển hình của việc sử dụng nguyên mẫu. NewtonScript, Act1, Io và Delegation cũng là những ngôn ngữ khác sử dụng mô hình nguyên mẫu. Đặc biệt, Hybrid và Exemplars kết hợp cả mô hình nguyên mẫu và phân lớp. Trong hệ thống nguyên mẫu, các đối tượng là các khuôn mẫu (template), trong khi hệ thống phân lớp sử dụng các lớp như là các khuôn mẫu cho các đối tượng.
Các phương pháp phân lớp chiếm ưu thế trong lập trình hướng đối tượng, với việc các đối tượng được định nghĩa có tính chất đóng và việc chia sẻ dữ liệu xảy ra thông qua phân lớp và kế thừa. Tuy nhiên, khái niệm rộng hơn về 'chia sẻ hành vi' được công nhận như một kỹ thuật thay thế, như trong trường hợp của nguyên mẫu.
Những mô hình đối tượng cơ bản
Lập trình hướng đối tượng cơ bản tập trung vào việc tạo ra các đối tượng và các tương tác giữa chúng, nhưng có thể thiếu một số chức năng quan trọng như tính kế thừa. Những hệ thống đối tượng cơ bản thường không được xem là lập trình hướng đối tượng do tính kế thừa thường được coi là một yếu tố cốt lõi của OOP.
- Ví dụ điển hình là các phiên bản 6.0 hoặc cũ hơn của ngôn ngữ Visual Basic.
Khái niệm chuẩn
Đã có nhiều nỗ lực nhằm chuẩn hóa các khái niệm trong lập trình hướng đối tượng. Những khái niệm và cấu trúc sau đây được coi là cơ bản trong OOP:
- Các kiểu dữ liệu đồng đại số
- Các lượng tồn tại và các mô đun
- Đệ quy
- Các bản sao và sự mở rộng của bản sao
- Đa hình biên F
Những nỗ lực tìm kiếm một định nghĩa thống nhất hoặc lý thuyết chung cho các đối tượng thường gặp khó khăn và bị phân hóa. Một số định nghĩa tập trung vào các hoạt động tinh thần, trong khi những định nghĩa khác lại chú trọng vào cấu trúc chương trình. Một định nghĩa đơn giản hơn xem OOP là việc sử dụng các biểu đồ cấu trúc dữ liệu hoặc các dãy chứa hàm và con trỏ tới các biểu đồ khác. Sự kế thừa có thể được thực hiện bằng cách sao chép các biểu đồ này (thỉnh thoảng gọi là 'nguyên bản hóa').
OOP trong văn lệnh
Gần đây, lập trình hướng đối tượng cơ bản đã trở nên rất phổ biến trong các ngôn ngữ lập trình văn lệnh nhờ vào các tính năng như trừu tượng, đóng gói, khả năng tái sử dụng và dễ sử dụng, mặc dù tính kế thừa trong các ngôn ngữ này vẫn còn là vấn đề chưa được giải quyết rõ ràng. Smalltalk có thể là ngôn ngữ đầu tiên hỗ trợ kiểu này, trong khi Python và Ruby là các ngôn ngữ mới hơn được phát triển hoàn toàn với tư tưởng OOP. Perl, ngôn ngữ văn lệnh, đã dần dần tích hợp các tính năng hướng đối tượng kể từ phiên bản 5. Khả năng của các đối tượng trong việc mô phỏng 'thế giới thực' là một trong những lý do khiến JavaScript và ECMAScript trở nên phổ biến, vì chúng rất phù hợp để đại diện cho DOM của các tài liệu HTML và XML trên Internet.
Ví dụ mã nguồn trong C++

- Ví dụ mã nguồn trong C++ có thể được biên dịch bằng bất kỳ trình biên dịch nào để tạo ra tệp thực thi. Ví dụ, có thể sử dụng Borland C++ cho Windows hoặc g++ cho Linux.
- Các dòng chữ màu đen là mã nguồn, trong khi các dòng màu khác giải thích ý nghĩa và ứng dụng của OOP.
- Người đọc nên có kiến thức cơ bản về ngôn ngữ lập trình và trình biên dịch.
- Các lớp khi khai báo vẫn có tính trừu tượng, tức là không thể sử dụng trực tiếp mà chỉ đóng vai trò như các kiểu dữ liệu. Chỉ khi thực hiện thao tác tạo đối tượng (instantiate), lớp mới trở thành một đối tượng cụ thể. Trong ví dụ này, câu lệnh
Inherit1 boy;
và câu lệnhInherit2 girl;
là các lệnh tạo hai đối tượngboy
vàgirl
. - C++ hỗ trợ rất nhiều đặc tính của OOP, và ví dụ này chỉ nhằm minh họa các tính chất cơ bản.
Một số khái niệm cần nắm trong ngôn ngữ OOP hiện đại
Hiện nay, các ngôn ngữ lập trình hướng đối tượng (OOP) phổ biến nhất như C++, Java, C# và Visual Basic.NET đều theo phương pháp phân lớp. Những ngôn ngữ này áp dụng nguyên tắc OOP, tức là xây dựng và phát triển phần mềm dựa trên các lớp và đối tượng. Dưới đây là một số khái niệm cơ bản mà các ngôn ngữ này thường sử dụng.
Lớp (class)
Lớp có thể được coi như là khuôn mẫu để tạo ra các đối tượng. Trong lớp, các biến thường được dùng để mô tả các thuộc tính, và các phương thức được định nghĩa qua các hàm. Khi lớp đã được định nghĩa, có thể tạo ra nhiều đối tượng từ lớp này. Để đơn giản hóa việc sử dụng, lớp được coi như một kiểu dữ liệu thông qua hệ thống hàm tạo (constructor).
Lớp con (subclass)
Lớp con là một lớp mở rộng, kế thừa một phần hoặc toàn bộ đặc tính từ một lớp khác. Lớp mà lớp con kế thừa gọi là lớp cha (parent class/superclass).
Lớp cơ sở trừu tượng hay lớp abstract
Lớp trừu tượng không thể tạo ra các đối tượng thực tế trực tiếp. Đây là một lớp được thiết kế để định nghĩa các đặc điểm chung mà chưa đủ chi tiết để triển khai. (xem Ví dụ)
- Ví dụ: Lớp 'hinh' chỉ có các phương thức như 'tinh_chu_vi', 'tinh_dien_tich' mà không có dữ liệu nội tại. Do lớp này chưa xác định đầy đủ các đặc điểm cụ thể như tọa độ các đỉnh của đa giác hay bán kính và tọa độ tâm của hình tròn, nó chỉ có thể là lớp trừu tượng. Các lớp con như 'tam_giac', 'hinh_tron', 'tu_giac' sẽ kế thừa và cung cấp dữ liệu cụ thể (như bán kính và hằng số Pi cho lớp 'hinh_tron') và cài đặt các phương thức như 'tinh_chu_vi' và 'tinh_dien_tich'.
Phương thức (method)
Phương thức trong lớp mô tả hành vi của đối tượng. Ví dụ, một điện thoại có các hành vi như đổ chuông, chuyển tín hiệu từ sóng sang âm thanh, chuẩn hóa giọng nói, và gọi tổng đài. Khi thiết kế, các phương thức được sử dụng để mô tả và thực hiện những hành vi này, mỗi phương thức thường là một hàm chứa các thao tác cụ thể. Trong quá trình thực hiện, một phương thức có thể gọi đến các phương thức khác để hoàn thành nhiệm vụ của mình, như điện thoại cần chuẩn hóa giọng nói trước khi gọi tổng đài.
Ngoài các phương thức thông thường, còn có một số phương thức đặc biệt được định nghĩa:
- Hàm tạo (constructor) dùng để khởi tạo đối tượng, thiết lập các giá trị ban đầu cho thuộc tính của đối tượng.
- Hàm hủy (destructor) thực hiện việc giải phóng bộ nhớ đã dùng cho đối tượng và xóa bỏ tên của đối tượng khi không còn cần thiết, bao gồm cả việc xóa các con trỏ nội tại và trả lại bộ nhớ đã sử dụng.
Nhiều lớp thư viện đã cung cấp các hàm tạo mặc định (thường không có tham số) và hàm hủy.
Thuộc tính (attribute)
Thuộc tính của lớp bao gồm biến, hằng số, hoặc tham số nội tại. Vai trò chủ yếu của thuộc tính là các biến, vì chúng có thể thay đổi trong quá trình hoạt động của đối tượng. Thuộc tính có thể là kiểu dữ liệu cơ bản hoặc kiểu lớp đã định nghĩa từ trước. Khi lớp được thực thể hóa thành đối tượng cụ thể, giá trị của các biến nội tại xác định trạng thái của đối tượng. Tùy thuộc vào thiết kế, biến nội tại có thể chỉ được sử dụng trong các phương thức của lớp, cho phép truy cập từ bên ngoài, hoặc chỉ cho các lớp liên quan đặc biệt như lớp con hay các lớp bạn bè (friend) trong C++. Mỗi thuộc tính của lớp còn được gọi là thành viên dữ liệu của lớp đó.
Quan hệ giữa lớp và đối tượng
Trong cách hiểu thông thường, lớp là phương pháp phân loại các thực thể dựa trên các đặc điểm chung của chúng. Vì vậy, lớp mang tính trừu tượng rất cao. Ví dụ, lớp 'người' đại diện cho những thực thể sống trên Trái Đất với đặc điểm như hai chân, hai tay khéo léo, khả năng tư duy, ngôn ngữ, v.v., và các phương thức như giao tiếp, tư duy, đi, đứng. Khi đó, hai người cụ thể như ông A và ông B là các đối tượng thuộc lớp người. Trong lập trình, khái niệm lớp cũng tương tự, và quá trình 'Thực thể hóa' sẽ tạo ra một đối tượng từ lớp đã được định nghĩa.
Thực thể (instance)
Thực thể hóa (instantiate) là quá trình tạo ra một đối tượng từ một lớp nhất định, qua việc gán một tên cho đối tượng đó, tương tự như khai báo một biến.
Sau khi lớp được thực thể hóa thành một đối tượng cụ thể, nó trở thành một thực thể. Ngược lại, một thực thể là một đối tượng cụ thể thuộc một lớp đã được xác định trước. Giống như các biến, hai thực thể của cùng một lớp có thể có trạng thái nội tại khác nhau (dựa trên giá trị của các biến nội tại) và hoàn toàn độc lập trừ khi có yêu cầu cụ thể từ người lập trình. Thực thể hóa có thể xem như việc cá nhân hóa lớp để tạo thành một đối tượng cụ thể.
Công cộng (public)
Tính chất công cộng cho phép các phương thức, biến nội tại, hoặc lớp có thể được truy cập từ bên ngoài cũng như bởi các đối tượng khác. Khi khai báo với tính chất này, người lập trình cho phép sử dụng và thay đổi các thành phần đó từ bất kỳ đâu.
- Ví dụ: Trong C++, khi khai báo
public: int my_var;
, biến my_var có tính chất công cộng và là kiểu integer. Điều này có nghĩa là biến my_var có thể được truy cập và thay đổi từ bất kỳ đâu trong chương trình, cả bên trong và bên ngoài lớp.
Riêng tư (private)
Tính chất riêng tư là mức độ bảo vệ cao nhất cho một đặc tính hoặc lớp. Khi gán tính chất này cho một biến hoặc phương thức, chúng chỉ có thể được sử dụng trong chính lớp đó. Mọi cố gắng truy cập từ bên ngoài hoặc từ các lớp con đều sẽ bị từ chối hoặc gây lỗi.
Bảo tồn (protected)
Tùy theo ngôn ngữ lập trình, cách hiểu về tính chất này có thể có những điểm khác biệt nhỏ. Tuy nhiên, về cơ bản, tính chất bảo tồn cho phép các phương thức, biến nội tại, hoặc lớp chỉ có thể được truy cập từ trong chính lớp đó, các lớp kế thừa, hoặc trong cùng một gói (như trong Java).
Tính bảo tồn cho phép chia sẻ dữ liệu và chức năng rộng rãi hơn so với tính chất riêng tư. Nó cho phép các lớp con hoặc các lớp trong cùng một gói có thể truy cập và sử dụng các đặc tính của lớp cha.
Lưu ý: Tính chất công cộng, riêng tư, và bảo tồn thường được sử dụng để chỉ định cách thức kế thừa trong các lớp con, đặc biệt trong các ngôn ngữ như C++.
Đa kế thừa (multiple inheritance)
Đây là một đặc điểm cho phép một lớp con kế thừa từ nhiều lớp cha cùng một lúc.
Một số điều quan trọng cần chú ý khi sử dụng tính năng đa kế thừa:
- Khi áp dụng đa kế thừa, các lớp cha phải độc lập và các thuộc tính hay phương thức kế thừa cần phải có tên khác nhau để tránh lỗi
'ambiguity'
. Nếu không, trình biên dịch sẽ không thể xác định chính xác thuộc tính nào sẽ được kế thừa từ các lớp cha. - Nhiều ngôn ngữ lập trình, như Java, không hỗ trợ đa kế thừa nhưng cung cấp khái niệm giao diện (Interface), cho phép đạt được hầu hết các lợi ích của đa kế thừa.
Ngoài các khái niệm đã nêu, tùy thuộc vào ngôn ngữ lập trình, có thể sẽ có thêm các tính năng OOP đặc thù được cung cấp.
Lịch sử
Khái niệm về đối tượng và thực thể trong khoa học máy tính bắt nguồn từ hệ thống PDP-1 của MIT, được xem là ví dụ sớm nhất của kiến trúc cơ sở thực tế. Một bằng chứng sớm khác về OOP là Sketchpad, do Ivan Sutherland phát triển vào năm 1963, tuy nhiên, đây chỉ là một ứng dụng cụ thể chứ không phải là một mẫu hình lập trình hoàn chỉnh.
Ngôn ngữ lập trình hướng đối tượng đầu tiên là Simula, được phát triển để mô phỏng, bởi Ole-Johan Dahl và Kristen Nygaard tại Trung tâm Máy tính Na Uy ở Oslo. Các nguyên lý trong ngôn ngữ này sau đó đã được áp dụng vào nhiều ngôn ngữ khác, từ Lisp và Pascal đến các ngôn ngữ thuộc họ Smalltalk.
Lập trình hướng đối tượng trở thành phương pháp lập trình chủ đạo từ giữa thập niên 1990, nhờ sự ảnh hưởng lớn của C++, một ngôn ngữ mở rộng của C. Địa vị của OOP được củng cố bởi sự phổ biến của các GUI cho ngôn ngữ lập trình hướng đối tượng, như phần mềm Cocoa, khung cơ sở của Mac OS X được viết bằng Objective C. Công cụ OOP cũng được nâng cao với lập trình điều khiển theo sự kiện, dù khái niệm này không chỉ dành riêng cho OOP.
Tại Zürich, Niklaus Wirth và các cộng sự đã nghiên cứu các chủ đề như dữ liệu trừu tượng và lập trình mô đun. Modula-2 tích hợp cả hai đặc tính này. Thiết kế tiếp theo là Oberon, cung cấp một cách tiếp cận khác biệt với định hướng đối tượng và các lớp, không giống như Smalltalk và cũng khác hẳn C++.
Các tính năng của lập trình hướng đối tượng đã được bổ sung vào nhiều ngôn ngữ trong suốt thời gian đó, bao gồm Ada, BASIC, Lisp, Fortran, Pascal, và nhiều ngôn ngữ khác. Việc thêm các tính năng này vào các ngôn ngữ vốn không được thiết kế cho OOP từ đầu thường gây khó khăn về khả năng tương thích và bảo trì mã. Pascal và Visual Basic là những ví dụ điển hình. Ngược lại, các ngôn ngữ thuần túy hướng đối tượng thiếu nhiều đặc tính mà lập trình viên phụ thuộc vào. Để khắc phục điều này, nhiều nỗ lực đã được thực hiện để phát triển các ngôn ngữ kết hợp phương pháp OOP với các tính năng lập trình cấu trúc một cách “an toàn”, như ngôn ngữ Eiffel của Bertrand Meyer.
Trong thập kỷ qua, Java đã trở nên phổ biến rộng rãi, phần lớn nhờ vào sự tương đồng với C và C++. Tuy nhiên, một lý do quan trọng hơn là khả năng chạy mã nguồn trên nhiều nền tảng khác nhau thông qua máy ảo. Tương tự, .NET của Microsoft cũng được phát triển với mục tiêu hỗ trợ nhiều nền tảng và ngôn ngữ khác nhau, bao gồm các biến thể của ngôn ngữ cũ như C# và Visual Basic.
Gần đây, một số ngôn ngữ mới xuất hiện với mục tiêu chính là lập trình hướng đối tượng nhưng vẫn hỗ trợ phương pháp lập trình thủ tục, như Python và Ruby. Ngoài Java, C# và Visual Basic.NET hiện là hai ngôn ngữ OOP quan trọng, được Microsoft phát triển.
Tương tự như lập trình thủ tục đã dẫn đến sự phát triển của lập trình cấu trúc, phần mềm hướng đối tượng hiện đại cũng áp dụng các phương pháp tinh lọc, như các mẫu thiết kế, thiết kế theo hợp đồng, và các ngôn ngữ mô hình như UML.
Các ngôn ngữ
Bài chính: Ngôn ngữ lập trình hướng đối tượng
- C#
- C++
- Hệ thống Đối tượng Common Lisp
- Eiffel
- Fortran 2003
- Java
- Objective-C
- OCaml
- Object Pascal
- Pascal
- Perl
- PHP
- Python
- Ruby
- Simula
- Sleep
- Smalltalk
- Ada
- Visual FoxPro
- Actionscript
- Visual Basic
- Swift
Đọc thêm
- Grady Booch: Phân Tích và Thiết Kế Hướng Đối Tượng với Các Ứng Dụng, Addison-Wesley, ISBN 0-8053-5340-2
- Alan Kay: Lịch Sử Sớm của Smalltalk
- Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Mẫu Thiết Kế: Các Phần Tử của Phần Mềm Hướng Đối Tượng Có Thể Tái Sử Dụng, Addison-Wesley, ISBN 0-201-63361-2
- Bertrand Meyer: Xây Dựng Phần Mềm Hướng Đối Tượng, Prentice Hall, ISBN 0-13-629155-4
- James Rumbaugh, Michael Blaha, William Premerlani, Frederick Eddy, William Lorensen: Mô Hình và Thiết Kế Hướng Đối Tượng, Prentice Hall, ISBN 0-13-629841-9
- Ivar Jacobson: Kỹ Thuật Phần Mềm Hướng Đối Tượng: Một Cách Tiếp Cận Dựa Trên Trường Hợp Sử Dụng, Addison-Wesley, ISBN 0-201-54435-0
- Harold Abelson, Gerald Jay Sussman, Julie Sussman: Cấu Trúc và Giải Thích Các Chương Trình Máy Tính, The MIT Press, ISBN 0-262-01153-0
- Martin Abadi, Luca Cardelli: Một Lý Thuyết Về Các Đối Tượng, Springer-Verlag, ISBN 0-387-94775-2
- Paul Harmon, William Morrissey: Sách Case về Công Nghệ Đối Tượng - Bài Học Từ Các Ứng Dụng Doanh Nghiệp Được Giải Thưởng, John Wiley & Sons, ISBN 0-471-14717-6
- David A. Taylor: Hệ Thống Thông Tin Hướng Đối Tượng - Lập Kế Hoạch và Triển Khai, John Wiley & Sons, ISBN 0-471-54364-0
- Peter Eeles, Oliver Sims: Xây Dựng Các Đối Tượng Doanh Nghiệp, John Wiley & Sons, ISBN 0-471-19176-0
Các bài liên quan
- Ngôn ngữ lập trình hướng đối tượng
- Lập trình hướng khía cạnh
- Paradigm lập trình
- Thành phần phần mềm
- Ngôn ngữ mô tả giao diện
- Lập trình phân tán
- Danh sách các thuật ngữ lập trình hướng đối tượng
- Mẫu thiết kế (khoa học máy tính)
- Refactoring
- CORBA
- Globus
- DCOM
- Thuật ngữ lập trình hướng đối tượng