Lập trình hướng đối tượng là gì
Nguyễn Dương 07-06-2024Chúng ta đã cùng trải qua 29 bài về lập trình C# căn bản, các bạn đã nắm vững những kiến thức đó chưa, đã nhuần nhuyễn các bài tập thực hành chưa. Nếu đã nắm tương đối vững kiến thức cơ bản rồi thì chúng ta sẽ cùng tiến vào seri bài viết về lập trình hướng đối tượng nhé.
Qua 29 bài lập trình C# căn bản, chắc các bạn đã nhuần nhuyễn khi giải quyết một bài toán cơ bản nào đó rồi đúng không. Nhưng những ví dụ trong 29 bài trước đều là những bài toán nhỏ lẻ, đơn giản hóa. Nếu chúng ta phải lập trình nguyên vẹn một phần mềm, quản lý hệ thống lớn, cơ sở dữ liệu phức tạp thì phải làm việc một cách khoa học, có phương pháp. Trong bài viết này chúng ta sẽ cùng tìm hiều về các phương pháp lập trình nhé.
Tuy nhiên trong thực tế, nhiều bài toán không hề đơn giản như vậy. Phương pháp lập trình này kém hiệu quả và người lập trình không thể kiểm soát được khi các phần mềm có nhiều xử lý và phức tạp.
Nhược điểm:
- Chỉ sử dụng biến toàn cục dẫn đến rất tốn bộ nhớ
- Vì có những đoạn chương trình cần sử dụng lại nhiều lần nên phải lạm dụng lệnh goto
- Khó hiểu, khó bảo trì, không thể tái sử dụng
- Khó phát triển các dự án lớn
Sau 1 thời gian tồn tại người ta dần nhận ra những nhược điểm của phương pháp tuyến tính và đưa ra giải pháp đó là chia chương trình lớn ra thành các chức năng, mỗi chức năng được đưa vào 1 hàm. Mỗi hàm này có thể chia thành các hàm nhỏ hơn. Khi cần dùng đến chức năng nào thì ta sẽ gọi hàm tương ứng.
Dữ liệu được chuyển đổi qua lại thông qua các tham số gọi hàm. Trong đó, những dữ liệu có tính chất dùng chung cho toàn hệ thống sẽ được khai báo toàn cục (global) để nhiều hàm có thể truy cập, đọc và thay đổi giá trị chung khi cần. Mỗi hàm cũng có các biến dữ liệu riêng gọi là dữ liệu cục bộ (local).
Lập trình hướng cấu trúc rất thông dụng trong những năm 80 và đầu những năm 90 nhưng lại chỉ chú trọng đến xử lý chức năng, thuật toán mà ít quan tâm đến dữ liệu.
Ưu điểm:
- Chương trình được module hoá, dễ hiểu, dễ bảo trì
- Dễ dàng tạo ra các thư viện phần mềm
Nhược điểm:
- Dữ liệu và xử lý tách rời
- Khi cấu trúc dữ liệu thay đổi sẽ dẫn đến thuật toán bị thay đổi
- Không tự động khởi tạo, giải phóng dữ liệu động
- Không mô tả được đầy đủ hệ thống trong thực tế
Trong nhiều trường hợp cần xử lý dữ liệu một cách linh hoạt thì lập trình hướng cấu trúc bộc lộ nhiều hạn chế. Do đó, dần dần lập trình hướng cấu trúc đã bị thay thế bằng phương pháp lập trình hướng đối tượng.
Một đối tượng bao gồm 2 trường thông tin là: thuộc tính và phương thức.
- Thuộc tính: Là những thông tin, đặc điểm về đối tượng. Như chiều cao, cân nặng, ngày sinh, tóc, màu da ..........
- Phương thức: Là những thao tác, hành động mà đối tượng có thể thực hiện. Nhưng nghe, nói, đọc, viết, đi lại, chạy nhảy, ăn uống ..........
Ví dụ đối tượng là ô tô thì có:
- Thuộc tính: Nhãn hiệu, loại xe, tên xe, màu xe, biển kiểm soát, năm sản xuất .........
- Phương thức: Có thể di chuyển, bấm còi, .........
Lớp cũng có thể được hiểu như một kiểu dữ liệu đặc biệt bao gồm các thuộc tính và phương thức.
Lớp được dùng để định nghĩa ra một kiểu dữ liệu mới.
Ví dụ: Mình có 2 chiếc ô tô là
1. Ô tô hãng Ford, màu bạc, biển kiểm soát là 29A - 12345, ......
2. Ô tô hãng Kia, loại K3, màu đỏ, biển kiểm soát là 29K - 45678, ......
Vậy mỗi chiếc ô tô trên là một đối tượng còn xe ô tô nói chung là một lớp đối tượng.
Lớp và đối tượng là đặc trưng của phương pháp lập trình hướng đối tượng. Nó đã giải quyết được các nhược điểm của phương pháp lập trình hướng cấu trúc và giúp biểu diễn thế giới thực tốt hơn trên máy tính.
- Các dữ liệu có liên quan với nhau được đóng gói thành các lớp để tiện cho việc quản lý và sử dụng.
- Tính đóng gói cho phép giấu thông tin của đối tượng và các chi tiết cài đặt nội bộ.
Tính trừu tượng (Abstraction)
- Từ những đối tượng có đặc trưng giống nhau có thể trừu tượng hóa thành interface.
- Loại bỏ tính chất phức tạp của đối tượng bằng cách chỉ đưa ra các thuộc tính và phương thức cần thiết của đối tượng trong lập trình.
Tính kế thừa (Inheritance)
1. LẬP TRÌNH TUYẾN TÍNH
Tuyến tính tức nghĩa là đi theo một đường thẳng, đây là phương pháp lập trình không có cấu trúc. Các câu lệnh sẽ được viết tuần tự, giải quyết từng vấn đề một cho đến khi hết yêu cầu. Ngôn ngữ sử dụng phương pháp này là Assembly (hợp ngữ).Tuy nhiên trong thực tế, nhiều bài toán không hề đơn giản như vậy. Phương pháp lập trình này kém hiệu quả và người lập trình không thể kiểm soát được khi các phần mềm có nhiều xử lý và phức tạp.
Nhược điểm:
- Chỉ sử dụng biến toàn cục dẫn đến rất tốn bộ nhớ
- Vì có những đoạn chương trình cần sử dụng lại nhiều lần nên phải lạm dụng lệnh goto
- Khó hiểu, khó bảo trì, không thể tái sử dụng
- Khó phát triển các dự án lớn
2. LẬP TRÌNH HƯỚNG CẤU TRÚC
Lập trình hướng cấu trúc lần đầu tiên được đề xuất bởi Corrado Bohm và Guiseppe Jacopini. Hai nhà toán học này cho rằng bất kỳ chương trình máy tính nào cũng có thể được viết chỉ với ba cấu trúc: tuần tự, điều kiện và vòng lặp.Sau 1 thời gian tồn tại người ta dần nhận ra những nhược điểm của phương pháp tuyến tính và đưa ra giải pháp đó là chia chương trình lớn ra thành các chức năng, mỗi chức năng được đưa vào 1 hàm. Mỗi hàm này có thể chia thành các hàm nhỏ hơn. Khi cần dùng đến chức năng nào thì ta sẽ gọi hàm tương ứng.
Dữ liệu được chuyển đổi qua lại thông qua các tham số gọi hàm. Trong đó, những dữ liệu có tính chất dùng chung cho toàn hệ thống sẽ được khai báo toàn cục (global) để nhiều hàm có thể truy cập, đọc và thay đổi giá trị chung khi cần. Mỗi hàm cũng có các biến dữ liệu riêng gọi là dữ liệu cục bộ (local).
Lập trình hướng cấu trúc rất thông dụng trong những năm 80 và đầu những năm 90 nhưng lại chỉ chú trọng đến xử lý chức năng, thuật toán mà ít quan tâm đến dữ liệu.
Ưu điểm:
- Chương trình được module hoá, dễ hiểu, dễ bảo trì
- Dễ dàng tạo ra các thư viện phần mềm
Nhược điểm:
- Dữ liệu và xử lý tách rời
- Khi cấu trúc dữ liệu thay đổi sẽ dẫn đến thuật toán bị thay đổi
- Không tự động khởi tạo, giải phóng dữ liệu động
- Không mô tả được đầy đủ hệ thống trong thực tế
Trong nhiều trường hợp cần xử lý dữ liệu một cách linh hoạt thì lập trình hướng cấu trúc bộc lộ nhiều hạn chế. Do đó, dần dần lập trình hướng cấu trúc đã bị thay thế bằng phương pháp lập trình hướng đối tượng.
3. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Lập trình hướng đối tượng (Object Oriented Programming - OOP) là phương pháp lập trình lấy đối tượng làm nền tảng để xây dựng chương trình.3.1: Đối tượng
Đối tượng được hiểu như là 1 thực thể (người, ô tô, xe máy, con chó, con mèo, hoa hồng ......)Một đối tượng bao gồm 2 trường thông tin là: thuộc tính và phương thức.
- Thuộc tính: Là những thông tin, đặc điểm về đối tượng. Như chiều cao, cân nặng, ngày sinh, tóc, màu da ..........
- Phương thức: Là những thao tác, hành động mà đối tượng có thể thực hiện. Nhưng nghe, nói, đọc, viết, đi lại, chạy nhảy, ăn uống ..........
Ví dụ đối tượng là ô tô thì có:
- Thuộc tính: Nhãn hiệu, loại xe, tên xe, màu xe, biển kiểm soát, năm sản xuất .........
- Phương thức: Có thể di chuyển, bấm còi, .........
3.2: Lớp
Các đối tượng có các đặc tính tương tự nhau được gom lại thành 1 lớp đối tượng.Lớp cũng có thể được hiểu như một kiểu dữ liệu đặc biệt bao gồm các thuộc tính và phương thức.
Lớp được dùng để định nghĩa ra một kiểu dữ liệu mới.
Ví dụ: Mình có 2 chiếc ô tô là
1. Ô tô hãng Ford, màu bạc, biển kiểm soát là 29A - 12345, ......
2. Ô tô hãng Kia, loại K3, màu đỏ, biển kiểm soát là 29K - 45678, ......
Vậy mỗi chiếc ô tô trên là một đối tượng còn xe ô tô nói chung là một lớp đối tượng.
Lớp và đối tượng là đặc trưng của phương pháp lập trình hướng đối tượng. Nó đã giải quyết được các nhược điểm của phương pháp lập trình hướng cấu trúc và giúp biểu diễn thế giới thực tốt hơn trên máy tính.
3.3: Đặc điểm của lập trình hướng đối tượng
Tính đóng gói (Encapsulation)- Các dữ liệu có liên quan với nhau được đóng gói thành các lớp để tiện cho việc quản lý và sử dụng.
- Tính đóng gói cho phép giấu thông tin của đối tượng và các chi tiết cài đặt nội bộ.
Tính trừu tượng (Abstraction)
- Từ những đối tượng có đặc trưng giống nhau có thể trừu tượng hóa thành interface.
- Loại bỏ tính chất phức tạp của đối tượng bằng cách chỉ đưa ra các thuộc tính và phương thức cần thiết của đối tượng trong lập trình.
Tính kế thừa (Inheritance)
- Cho phép xây dựng một lớp mới dựa trên các định nghĩa của một lớp đã có. (lớp cha - lớp con)
- Lớp con được kế thừa các dữ liệu và phương thức từ lớp cha, không cần phải định nghĩa lại. Giúp chương trình ngắn gọn hơn.
Tính đa hình (Polymorphism)
- Lớp con được kế thừa các dữ liệu và phương thức từ lớp cha, không cần phải định nghĩa lại. Giúp chương trình ngắn gọn hơn.
Tính đa hình (Polymorphism)
- Cùng một dữ liệu, một hành động nhưng các đối tượng lại hiểu khác nhau, thực hiện theo các cách khác nhau.
Ví dụ: Cùng là tiếng sủa "gâu gâu" nhưng mỗi con chó lại có kiểu sủa khác nhau, âm lượng khác nhau, cao độ khác nhau .........
Ví dụ: Cùng là tiếng sủa "gâu gâu" nhưng mỗi con chó lại có kiểu sủa khác nhau, âm lượng khác nhau, cao độ khác nhau .........
Bài viết liên quan
Interface trong C#
Tính đa hình trong C#
Tính kế thừa trong C#
this và static trong C#
Các loại phạm vi truy cập trong C#
Hàm khởi tạo và hàm hủy