Nội dung bài viết
Đăng ký học lập trình C++
Tại STDIO bạn được dạy nền tảng lập trình tốt nhất.
Đăng ký học
Ở một cách tiếp cận khác của OOP, tôi hy vọng có thể giúp cho bạn đọc vẫn còn lấn cấn để hiểu được OOP một cách thông suốt. Bài viết nói lên quan điểm hoàn toàn cá nhân để tiếp cận OOP một cách mềm dẽo hơn.

Giới thiệu

Lập trình hướng đối tượng hay OOP được chúng ta ứng dụng và hay nhắc đến với 4 tính chất cơ bản bao gồm trừu tượng (abstraction), đóng gói (encapsulation), kế thừa (inheritance), đa hình (polymorphism).

Điểm lấn cấn không nằm trong OOP, mà nó lấn cấn và hiểu nhầm về cái gọi là PHƯƠNG PHÁPKỸ THUẬT HIỆN THỰC, tôi cố gắng phân định rõ 2 điều này trong bài viết này.

Tiền đề bài viết

Bài viết này như một món quà tôi dành tặng cho Taco Nguyen đã từng giúp tôi hiểu rõ hơn về cách thức diễn giải OOP thông qua một câu nói của anh ta - "OOP dễ hiểu lắm, không nên làm nó phức tạp thêm". Dành cho Kanzaki Nguyen - là một người bạn, một người học trò cũ, một người đam mê về lĩnh vực kỹ thuật, và đồng thời là một trợ giảng tâm huyết tại trường Đại học Công nghệ Thông tin (UIT). Và dành cho tất cả học trò của tôi.

Món quà này cũng dành cho những người bạn của tôi đang làm công việc đưa đò ở các trường Đại học, những người đã âm thầm đứng đằng sau cổ vũ cho những tài năng mới trong tương lai.

Đối tượng hướng đến

Tôi mong muốn diễn giải và đơn giản hóa cho người mới bắt đầu với OOP hoặc đã làm việc nhiều năm nhưng vẫn chưa thông thoáng về vấn đề này. Bài viết này người mới tiếp cận chưa biết về OOP vẫn có thể đọc được, tuy nhiên, bạn sẽ khó khăn khi gặp phải khái niệm class trong bài viết.

OOP

OOP với quan điểm cá nhân

Với quan điểm cá nhân, LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG có nghĩa là làm sao khi bạn code, người khác đọc vào code đó có thể thốt lên rằng - ĐÂY LÀ MỘT "NHÓM" DỮ LIỆU CÓ LIÊN QUAN ĐẾN NHAU. Tức là code của bạn biết nói. Để làm rõ về vấn đề này, ta sẽ đi từng bước trong ví dụ về tính trừu tượng hóa dữ liệu bên dưới.

Tính trừu tượng hóa dữ liệu

Ví dụ 1 - Code không biết nói

int main()
{
	char* name;

	int cpu;

	int ram;

	float price;

	return 0;
}

Với đoạn code như vậy, bạn đọc cũng chưa hiểu rõ tôi đang đề cập đến vấn đề gì (mặc dù có từ khóa cpu và ram) có thể đoán được 1 ít thông tin là cái máy tính. Và cũng không biết được là các biến này có liên quan với nhau hay không.

Ví dụ 2 - Code nói được nhiều hơn

Giả sử với đoạn code dưới

int main()
{
	char* name_1;
	int cpu_1;
	int ram_1;
	float price_1;
	
	char* name_2;
	int cpu_2;
	int ram_2;
	float price_2;

	return 0;
}

Ta cần để ý dòng trống số 7, thông tin đó giúp ta định hướng rõ ràng hơn, có lẽ là ta đang miêu tả 2 "vật thể", hoặc chí ít ta cảm giác được 1 ít sự liên quan giữa các biến.

Ví dụ 3 - Code nói được nhiều hơn nữa

int main()
{
	char* phone_name_1;
	int phone_cpu_1;
	int phone_ram_1;
	float phone_price_1;
	
	char* phone_name_2;
	int phone_cpu_2;
	int phone_ram_2;
	float phone_price_2;

	return 0;
}

Bạn thấy được điều gì nếu tôi thêm tiền tố phone_ vào trước các tên biến. Một thể thống nhất hơn đã hình thành dữ liệu đã được TRỪU TƯỢNG HÓA thông qua một cách thức đơn giản.

Với cách hiện thực ở ví dụ 3 này, ta có thể khẳng định rằng tất cả ngôn ngữ lập trình đều có khả năng hướng đối tượng.

Vậy điểm khác biệt ở C và C++ khi bàn về hướng đối tượng là gì?

Ví dụ 4 - Sự hỗ trợ của kỹ thuật ngoại cảnh

Với ví dụ 3, ta đã hiện thực được 1 "đối tượng" cụ thể, với cách làm này, dữ liệu đã được trừu tượng, tuy nhiên, nó vướng phải một vấn đề đó là chính sách chưa hỗ trợ, nên doanh nghiệp còn vất vả trong việc triển khai ý tưởng, dự án. Mà trong trường hợp này, đó là khả năng của ngôn ngữ lập trình hay nói đúng hơn, là những người có khả năng quyết định hay thiết kế nên ngôn ngữ lập trình.

Vậy điểm khác biệt của C và C++ hay có câu nói là "ngôn ngữ hướng đối tượng" ý chỉ ra rằng, các ngôn ngữ lập trình có hỗ trợ lập trình hướng đối tượng tốt hơn (đỡ cực nhọc hơn khi code) chứ không nói rằng ngôn ngữ đó không có hướng đối tượng. Với tôi, những điều không tồn tại trong cuộc đời này, chúng ta sẽ làm ra nó.

STRUCT VÀ CLASS RA ĐỜI

structclass có thể gọi là 2 ứng cử viên sáng giá nhất để hỗ trợ lập trình hướng đối tượng tốt hơn. Khả năng của struct và class có thể sử dụng để "đại diện" cho cả một nhóm dữ liệu thay vì phải gõ lại rất nhiều, và làm tăng khả năng nhìn thấy nó có vẻ trông hướng đối tượng hơn.

struct CPhone
{
	char* name;
	int cpu;
	int ram;
	float price;
};

int main()
{
	CPhone phone_1;
	CPhone phone_2;
	
	return 0;
}

Lời kết

Kỹ thuật đã hỗ trợ sẵn để ta dễ dàng hiện thực một tư duy với một cách thức dễ chịu hơn, nhưng không vì thế mà ta lạm dụng để quên đi cốt lõi vấn đề, nếu đi càng xa cốt lõi, tôi tin một ngày nào đó chúng ta sẽ phải bỏ cuộc vì không thể hiểu được nữa vì mất nền móng, hoặc người có chí hơn sẽ học lại từ đầu gây tốn kém thời gian hơn cả việc nắm cốt lõi ngay thời điểm ban đầu.

Ngoài ra, để hiểu thêm về "code biết nói" bạn có thể đọc thêm bài viết Stdio Coding Convention - Level 1.

THẢO LUẬN