Lập trình hướng đối tượng (OOP) là một mô hình lập trình giúp triển khai khái niệm đối tượng trong chương trình. OOP cung cấp một giải pháp dễ dàng hơn cho các vấn đề trong thực tế bằng cách sử dụng các khái niệm như kế thừa, trừu tượng hóa, polymorphism, v.v. Mô hình OOP được sử dụng rộng rãi trong nhiều ngôn ngữ phổ biến như Java, Python, C++, v.v.
Tại sao OOP quan trọng?
OOP là một trong những chủ đề quan trọng nhất trong phỏng vấn technical. Vì vậy, trong bài viết này, chúng ta sẽ giới thiệu 30 câu hỏi phổ biến về OOP.
Đặc điểm của OOP
OOP là một mô hình lập trình trong đó phần mềm hoàn chỉnh hoạt động như một nhóm các đối tượng giao tiếp với nhau. Mỗi đối tượng là một tập hợp dữ liệu và phương thức hoạt động trên dữ liệu đó.
Ưu điểm chính của OOP bao gồm:
- Hiển thị trực quan khi chuyển từ mô hình phân tích thực tế sang mô hình thực thi phần mềm.
- Khả năng bảo trì và thay đổi chương trình nhanh chóng và hiệu quả.
- Mô hình OOP chủ yếu hữu ích cho phần mềm tương đối lớn.
Ngoài ra, OOP cũng cung cấp tính năng đóng gói dữ liệu, trừu tượng hóa, kế thừa và đa hình để tăng cường khả năng tái sử dụng code và bảo mật dữ liệu.
Ví dụ về OOP
Dưới đây là một ví dụ minh họa về OOP trong các ngôn ngữ lập trình phổ biến như C++, Java và Python:
class Student { String name; String surname; int rollNo; Student(String studentName, String studentSurname, int studentRollNo) { this.name = studentName; this.surname = studentSurname; this.rollNo = studentRollNo; } public void getStudentDetails() { System.out.println("Tên sinh viên là " + this.name + " " + this.surname); System.out.println("Số thứ tự của sinh viên là " + this.rollNo); } } class OOPS { public static void main(String args[]) { Student student1 = new Student("Vivek", "Yadav", 20); student1.getStudentDetails(); } }
class Student { String name; String surname; int rollNo; public Student(String studentName, String studentSurname, int studentRollNo) { this.name = studentName; this.surname = studentSurname; this.rollNo = studentRollNo; } public void getStudentDetails() { System.out.println("The name of the student is " + this.name + " " + this.surname); System.out.println("The roll no of the student is " + this.rollNo); } } public class OOPS { public static void main(String[] args) { Student student1 = new Student("Vivek", "Yadav", 20); student1.getStudentDetails(); } }
class Student: def __init__(self, student_name, student_surname, student_roll_no): self.name = student_name self.surname = student_surname self.roll_no = student_roll_no def get_student_details(self): print("The name of the student is " + self.name + " " + self.surname) print("The roll no of the student is " + str(self.roll_no)) student1 = Student("Vivek", "Yadav", 20) student1.get_student_details()
Các tính năng chính của OOP
Các tính năng chính hay còn gọi là 4 trụ cột của OOP bao gồm:
- Tính đóng gói (Encapsulation)
- Tính kế thừa (Inheritance)
- Tính đa hình (Polymorphism)
- Tính trừu tượng (Abstraction)
Tính đóng gói
Đóng gói là sự ràng buộc của dữ liệu và các phương thức, kết hợp chúng thành một đơn vị duy nhất sao cho dữ liệu nhạy cảm được ẩn khỏi người dùng. Quy trình thực hiện bao gồm:
- Ẩn dữ liệu: Một tính năng ngôn ngữ để hạn chế quyền truy cập vào các thành phần của một đối tượng, ví dụ: các thành phần private và protected trong C++.
- Kết hợp dữ liệu và phương thức với nhau: Dữ liệu và phương thức hoạt động trên dữ liệu đó được kết hợp với nhau trong một đơn vị duy nhất được gọi là class.
Tính trừu tượng
Trừu tượng hóa tương tự như đóng gói dữ liệu và rất quan trọng trong OOP. Nó có nghĩa là chỉ hiển thị những thông tin cần thiết và ẩn những thông tin không liên quan khác khỏi người dùng. Trừu tượng hóa được thực hiện bằng cách sử dụng các class và giao diện.
Tính đa hình
Từ "Đa hình" có nghĩa là có nhiều dạng. Đó là thuộc tính của một số code để xử lý vấn đề khác nhau đối với các ngữ cảnh khác nhau. Ví dụ, trong ngôn ngữ C++, chúng ta có thể định nghĩa nhiều hàm có cùng tên, nhưng hoạt động khác nhau tùy thuộc vào ngữ cảnh.
Đa hình có thể được phân thành hai loại:
- Đa hình thời gian biên dịch (Compile Time Polymorphism)
- Đa hình thời gian chạy (Runtime Polymorphism)
Tính kế thừa
Kế thừa có nghĩa là một lớp có thể kế thừa các thuộc tính của một lớp khác. Các thuộc tính đó có thể là một phương thức hoặc một trường nào đó. Lớp được kế thừa sẽ được gọi là lớp cha, còn lớp kế thừa sẽ được gọi là lớp con.
Mục đích chính của kế thừa là tăng khả năng tái sử dụng code. Nó cũng được sử dụng để đạt được tính đa hình trong thời gian chạy.
Access Specifier
Access Specifier là các từ khóa đặc biệt được sử dụng để chỉ định hoặc kiểm soát khả năng truy cập của các thực thể như class, phương thức, v.v. Private, Public và Protected là những ví dụ về access specifier hoặc access modifiers.
Các thành phần chính của OOP, đóng gói và ẩn dữ liệu phần lớn hoạt động được là nhờ các access specifier này.
Ưu điểm và nhược điểm của OOP
Ưu điểm của OOP:
- Có khả năng tái sử dụng code.
- Dễ bảo trì và cập nhật chương trình.
- Cung cấp bảo mật dữ liệu tốt hơn bằng cách hạn chế quyền truy cập dữ liệu và tránh tiếp xúc không cần thiết.
- Nhanh chóng thực hiện và dễ dàng thiết kế lại dẫn đến giảm thiểu sự phức tạp của một chương trình tổng thể.
Nhược điểm của OOP:
- Lập trình viên phải có kỹ năng tốt và phải có tư duy xuất sắc về đối tượng vì mọi thứ đều được coi là đối tượng trong OOP.
- Cần lập kế hoạch phù hợp vì OOP hơi phức tạp một chút.
- OOP không phù hợp với mọi dự án.
Các mô hình lập trình khác
Mô hình OOP là một trong những mô hình lập trình phổ biến nhất, nhưng cũng có các mô hình lập trình khác như:
- Mô hình lập trình mệnh lệnh (Imperative Programming Paradigm): mô hình tập trung vào cách thay đổi trạng thái chương trình thông qua các câu lệnh gán. Các mô hình trong nhóm này bao gồm lập trình thủ tục, lập trình hướng đối tượng và lập trình song song.
- Mô hình lập trình khai báo (Declarative Programming Paradigm): mô hình tập trung vào những gì sẽ được thực thi hơn là cách nó nên được thực thi. Các mô hình trong nhóm này bao gồm lập trình logic, lập trình hàm và lập trình cơ sở dữ liệu.
- Lập trình cấu trúc: là một kỹ thuật được coi là tiền thân của OOP và thường bao gồm các mô-đun được cấu trúc tốt và tách biệt. Sự khác biệt giữa OOP và lập trình cấu trúc là OOP tập trung vào các đối tượng có trạng thái và hành vi, trong khi lập trình cấu trúc tập trung vào code.
Mô hình OOP được sử dụng rộng rãi trong nhiều ngôn ngữ lập trình phổ biến như C++, Java, Python, Javascript, C#, Ruby, v.v.
Đa hình có thể được phân thành hai loại: đa hình thời gian biên dịch (Compile Time Polymorphism) và đa hình thời gian chạy (Runtime Polymorphism).
Trên đây là tổng hợp 15 câu hỏi về chủ đề OOP thường được hỏi trong phỏng vấn. Hãy cùng chờ đón phần 2 với những câu hỏi thú vị hơn nhé!