Khái niệm lập trình hướng đối tượng
Lập trình hướng đối tượng (OOP -Object-Oriented Programming)
Lập trình hướng đối tượng là phương thức lập trình cho phép lập trình viên xây dựng ứng dụng dựa trên việc tạo ra các đối tượng trong ứng dụng và xử lý tương tác giữa các đối tượng đó. Các đối tượng trong ứng dụng C# có thể coi là một dạng chứa các mã lệnh về tạo dữ liệu (field) mô tả đối tượng và các phương thức (method) hoạt động của đối tượng đó.
Lập trình hướng cấu trúc vs Lập trình hướng đối tượng
Nếu bạn đã học qua khoá học về lập trình C thì bạn cũng đã nghe đến khái niệm lập trình hướng cấu trúc. Đây là mô hình lập trình có từ rất lâu và đến nay vẫn có rất nhiều ngôn ngữ lập trình hỗ trợ phương thức lập trình này. Để có thể hiểu rõ hơn về sự khác nhau giữa lập trình hướng cấu trúc và lập trình hướng đối tượng thì xin mời bạn xem bảng so sánh sau:
LẬP TRÌNH HƯỚNG CẤU TRÚC (STRUCTURED-ORIENTED PROGRAMMING) |
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (OBJECT-ORIENTED PROGRAMMING) |
---|---|
Lập trình hướng cấu trúc được thiết kế nhằm tập trung vào các chức năng, xử lý / cấu trúc logic và dữ liệu liên quan đến các chức năng, xử lý đó | Lập trình hướng đối tượng được thiết kế tập trung vào xây dựng các đối tượng, bao gồm cả các xử lý nghiệp vụ và dữ liệu liên quan |
Lập trình hướng cấu trúc tuân theo cách tiếp cận từ trên xuống (top-down). | Lập trình hướng đối tượng tuân theo cách tiếp cận từ dưới lên (bottom-up) |
Lập trình hướng cấu trúc cũng được biết đến là lập trình kiểu module và là một tập con của ngôn ngữ lập trình thủ tục | Lập trình hướng đối tượng hỗ trợ thừa kế, đóng gói, trừu tượng và đa hình |
Trong lập trình hướng cấu trúc, chương trình được chia thành các hàm xử lý độc lập (function) | Trong lập trình hướng đối tượng, chương trình được chia thành các thực thể nhỏ gọi là đối tượng (object) |
Lập trình hướng cấu trúc ít an toàn và không có cách nào để ẩn dấu dữ liệu (data hiding) | Lập trình hướng đối tượng an toàn hơn bởi vì nó có tính năng ẩn dấu dữ liệu |
Lập trình hướng cấu trúc có thể giải quyết các chương trình có độ phức tạp vừa phải | Lập trình hướng đối tượng có thể giải quyết các chương trình với các mức độ phức tạp khác nhau |
Lập trình hướng cấu trúc không cung cấp tính năng tái sử dụng mã lệnh, phụ thuộc vào hàm nhiều hơn | Lập trình hướng đối tượng cung cấp tính năng tái sử dụng mã lệnh và ít phụ thuộc vào hàm |
Ít trừu tượng và ít linh động hơn | Trừu tượng và linh động hơn |
Ví dụ minh hoạ sự khác nhau giữa 2 phương thức lập trình trên:
4 nguyên tắc chính của lập trình hướng đối tượng
Lập trình hướng đối tượng dựa trên 4 nguyên tắc cơ bản sau đây:
Trừu tượng (Abstraction)
Trừu tượng là nguyên tắc của nhận thức các thứ trong thế giới thực từ một quan điểm cụ thể, dựa trên một bối cảnh chúng ta đang phải thiết kế cho và chỉ tập trung vào những khía cạnh có liên quan đến bối cảnh này, bỏ qua tất cả những khía cạnh khác.
Ví dụ, nếu chúng ta đang mô hình hoá một người (Person) trong hệ thống tính lương nhân sự thì hãy tập trung và nắm bắt các thuộc tính của người đó như tên, tuổi, công ty và lương. Chúng ta sẽ bỏ qua các thuộc tính khác không phù hợp trong bối cảnh này như chiều cao, cân nặng, chỉ số cơ,…
Trong khi đó, nếu chúng ta mô hình hoá cũng một người cho hệ thống quản lý bệnh nhận trong bệnh viện, chúng ta lại phải tập trung và nắm bắt các thuộc tính như tên, tuổi, chiều cao, cân nặng và chỉ số cơ của người đó. Chúng ta sẽ bỏ qua các thuộc tính như công ty, mức lương vì chúng không phù hợp với bối cảnh quản lý bệnh nhân trong bệnh viện.
Đóng gói (Encapsulation)
Đóng gói là nguyên tắc mà theo đó các phương thức hoạt động và dữ liệu có liên quan với nhau được đóng gói vào thành một thành phần. Cụ thể, trong ngôn ngữ lập trình C#, các phương thức và trường dữ liệu có liên quan đến nhau sẽ được đóng gói vào trong 1 lớp (Class) và 1 thể hiện của lớp gọi là đối tượng (Object).
Trong C#, đóng gói cho phép ẩn đi dữ liệu. Ví dụ, dữ liệu trong 1 đối tượng có thể ẩn đi đối với các đối tượng khác. Lúc đó, các đối tượng không truy xuất dữ liệu trực tiếp của nhau được mà phải thông qua phương thức.
Thừa kế (Inheritance)
Thừa kế là một nguyên tắc của lập trình hướng đối tượng mà trong đó 1 lớp có thể chia sẻ các trường dữ liệu và phương thức hoạt động của nó với các lớp khác. Lớp chia sẻ trường dữ liệu và phương thức gọi là lớp cha hay lớp cơ sở (Base Class) còn lớp kế thừa và nhận các tính chất hay hoạt động của lớp cha gọi là lớp con hay lớp thừa kế (Derived Class).
Trong C#, chúng ta sẽ sử dụng toán tử :
để cho phép lớp con thừa kế tới lớp cha.
Đa hình (Polymorphism)
Đa hình có nghĩa là “có nhiều hình dạng”, là khả năng áp dụng cho một kiểu, một giao tiếp (interface), phương thức hay thao tác với các đối tượng khác nhau. Điều này có nghĩa là có thể cho kết quả khác nhau khi ta gọi cùng một hành động trên các đối tượng khác nhau đó.
Một ví dụ rất thông dụng về đa hình đó là đối tượng hình (shape). Đối tượng hình sẽ có một phương thức là tính diện tích. Khi đó ta sẽ tạo ra lớp cha tên là Shape với phương thức tính diện tích calculateArea() và tạo tiếp các lớp con là Circle, Rectanle và Triangle. Thông qua tính đa hình, trên các lớp con này ta sẽ ghi đè lên nội dung của phương thức calculageArea() với các công thức tính diện tích phù hợp với từng loại hình. Như vậy, sau này dù ta gọi 1 phương thức tính diện tích calculateArea() nhưng trên từng lớp con khác nhau thì sẽ cho kết quả khác nhau.
Đặc điểm chính của lập trình hướng đối tượng
Sau đây là những đặc điểm chính của lập trình hướng đối tượng dựa trên 4 nguyên tắc trên:
Mô hình hoá các đối tượng đời sống thực: Các đối tượng trong chương trình thường được mô hình hoá từ các đối tượng trong cuộc sống thực. Các đối tượng trong đời sống có tính chất và hành vi. Tính chất tương ứng với trường dữ liệu và hành vi tương ứng với phương thức trong đối tượng của chương trình.
Module: Các đối tượng chứa dữ liệu và phương thức để truy xuất và quản lý dữ liệu đó. Mỗi đối tượng là khép kín, nó sở hữu dữ liệu của mình và chịu trách nhiệm thực thi các hành động của mình.
Ẩn dấu thông tin: Một đối tượng có khả năng ẩn dấu thông tin dữ liệu đối với các đối tượng khác. Phương thức được sử dụng như một cách thức thông dụng trong việc chịu trách nhiệm quản lý và truy xuất các dữ liệu của đối tượng.
Tương tác giữa đối tượng và đối tượng: Các đối tượng tương tác với nhau thông qua việc gọi các phương thức của nhau. Đối tượng sẽ quản lý dữ liệu hay phương thức nào là có thể gọi được bởi đối tượng khác.
Phân cấp: Đối tượng là một thể hiện của lớp. Một lớp có thể thừa kế các đặc tính và hành vi của lớp khác. Dẫn đến các lớp có sự liên quan và phân cấp về mức độ thừa kế, quan hệ.