Tránh hiểu sai về Abstraction trong OOP

Dân lập trình không còn xa lạ với lập trình hướng đối tượng (OOP) và bốn tính chất của nó. Nhưng có một tính chất quan trọng thường bị hiểu sai, đó chính là tính trừu tượng (Abstraction).

1. Tính trừu tượng trong OOP là gì?

Tính trừu tượng trong OOP giúp loại bỏ những thứ phức tạp, không cần thiết của đối tượng và chỉ tập trung vào những gì cốt lõi, quan trọng. Ví dụ, khi quản lý sinh viên, bạn chỉ cần quan tâm đến những thông tin như mã sinh viên, họ tên, ngày sinh và giới tính. Không cần phải quản lý thêm thông tin về chiều cao, cân nặng hay sở thích.

Tuy nhiên, định nghĩa này không hoàn toàn chính xác và dẫn đến hiểu nhầm. Abstraction không chỉ đơn giản là việc lựa chọn những thông tin cần thiết và loại bỏ những thứ không cần thiết. Nếu bạn vẫn chưa hiểu rõ điều này, hãy tiếp tục đọc bài viết.

1.1. Chưa mô tả được cách đạt được Abstraction

Nhiều tài liệu hướng dẫn về OOP chỉ liệt kê định nghĩa của tính trừu tượng và sau đó tiếp tục giới thiệu về abstract class và interface. Điều này khiến người học cảm thấy mơ hồ và không hiểu liên quan giữa định nghĩa và sử dụng hai từ khóa abstract và interface.

Ngoài ra, theo định nghĩa trên, không cần phải sử dụng abstract và interface để đạt được tính trừu tượng. Ví dụ, một class có thể đạt được tính trừu tượng mà không sử dụng abstract class hoặc interface.

1.2. Không thể hiện được lợi ích của Abstraction

Vấn đề thứ hai là không thể hiện được lợi ích khi sử dụng tính trừu tượng. Có hai lợi ích chính khi sử dụng tính trừu tượng là đơn giản hóa việc sử dụng chức năng của đối tượng và giảm sự phụ thuộc giữa các đối tượng.

Nếu giải thích Abstraction như định nghĩa đầu bài, không thể hiện được hai lợi ích trên. Vì chỉ có một class duy nhất và luôn phải sử dụng class đó, không thể áp dụng tính trừu tượng.

2. Định nghĩa đúng của Abstraction

Abstraction là việc ẩn đi các chi tiết triển khai bên trong, chỉ hiển thị những gì cần thiết ra bên ngoài. Nói cách khác, người dùng chỉ cần biết có thể thực hiện những gì (what), còn việc thực hiện ra sao (how) không cần quan tâm.

Ví dụ về tính trừu tượng trong thực tế là câu chuyện về cái remote TV. Khi bạn có một chiếc remote không có vỏ, việc tìm nút để bật kênh 7 sẽ mất nhiều thời gian. Nhưng khi có thêm vỏ cho remote, việc chuyển qua kênh 5 trở nên dễ dàng hơn.

Bản chất của tính trừu tượng là tạo ra một layer đơn giản hơn để sử dụng, nhằm ẩn đi những thứ phức tạp bên trong. Chẳng hạn, phần vỏ của remote TV chứa những nút kí hiệu, màu sắc dễ sử dụng cho người dùng. Trong khi đó, việc các nút bên trong hoạt động như thế nào không cần quan tâm.

Abstraction không chỉ là việc lựa chọn những thông tin cần thiết, mà còn là quá trình ẩn đi thông tin và cách triển khai chức năng, không phải việc đơn giản hóa thông tin.

3. Áp dụng Abstraction trong các ngôn ngữ lập trình

Cả Java/C# (ngôn ngữ tĩnh) và JavaScript (ngôn ngữ động) đều có tính trừu tượng. Tuy nhiên, có một vài khác biệt khi áp dụng Abstraction trong hai ngôn ngữ này.

3.1. Trường hợp Data abstraction

Khi một class ẩn dữ liệu khỏi bên ngoài, cũng đồng nghĩa với việc thực hiện data abstraction. Trong ví dụ của class Person, các trường dữ liệu và phương thức public là phần abstraction layer. Trong khi đó, phần dữ liệu và phương thức private là phần implementation.

3.2. Abstraction với các ngôn ngữ dynamic

Các ngôn ngữ dynamic như JavaScript không có abstract class và interface như Java/C#. Tuy nhiên, việc sử dụng Abstraction vẫn có thể được thực hiện.

Trong JavaScript, không có access modifier thực sự, nhưng vẫn có thể tạo data abstraction bằng cách sử dụng convention phân biệt (dùng prefix # cho các private member). Đồng thời, JavaScript có thể dùng bất kỳ object nào làm abstraction layer, không cần khai báo rõ ràng như Java/C#.

Ví dụ, trong JavaScript, ta có thể sử dụng một object bất kỳ làm abstraction layer và không cần biết được cách nào để triển khai:

function use(duck) {
  // Tham số duck là abstraction layer
  // Có thể gọi method bất kỳ
  duck.quack();
}

// Implementation thực tế
use({
  quack() {
    console.log('I am a duck');
  }
});

Kết luận

Qua quá trình thảo luận và giải thích, có nhiều cách hiểu định nghĩa của tính trừu tượng trong OOP. Hi vọng bài viết này giúp bạn hiểu rõ hơn và không còn hiểu sai về chủ đề này.

FEATURED TOPIC