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

Chúng tôi rất vui mừng chia sẻ kiến thức về từ khóa Abstraction la gi và hi vọng rằng nó sẽ hữu ích cho các bạn đọc. Bài viết tập trung trình bày ý nghĩa, vai trò và ứng dụng của từ khóa trong việc tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Chúng tôi cung cấp các phương pháp tìm kiếm, phân tích và chọn lọc từ khóa phù hợp, kèm theo các chiến lược và công cụ hữu ích. Hi vọng rằng thông tin chúng tôi chia sẻ sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog của chúng tôi để cập nhật kiến thức mới nhất.

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

Bạn Đang Xem: Tránh hiểu sai về Abstraction trong OOP

Tính trừu tượng giúp loại bỏ những thứ phức tạp, không cấp thiết của đối tượng người dùng và chỉ tập trung vào những gì cốt lõi, quan trọng.

Ví dụ quản lý sinh viên thì chỉ việc quan tâm đến những thông tin như: mã SV, họ tên, ngày sinh, nam nữ.

Chứ không nhất thiết phải quản lý thêm thông tin về: độ cao, khối lượng, thị hiếu.

Trên đây là một khái niệm hay gặp khi nói đến Abstraction, nhưng nó không hề đúng. Nếu như bạn vẫn chưa chắc chắn được sai ở đâu, hãy tiếp tục đọc nội dung bài viết.

Khái niệm như trên không hề xác thực và còn gây hiểu nhầm, khi nhận định rằng thực hiện Abstraction là chỉ lựa chọn những thông tin cấp thiết đưa vào class (hoặc loại bỏ những thứ không cấp thiết).

Có hai vấn đề ở đây:

  • Chưa mô tả được phương pháp đạt được Abstraction (theo khái niệm trên)
  • Không thể hiện được lợi ích khi sử dụng Abstraction

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

Nhiều website hướng dẫn giới thiệu khái niệm tính trừu tượng như trên xong, sau đó đi tiếp qua abstract class và interface luôn. Người học không cảm thấy giữa khái niệm và việc dùng hai từ khóa abstract, interface có liên quan gì với nhau, dẫn đến sự việc mơ hồ.

Ngoài ra, nếu theo khái niệm trên, thì không cần dùng abstract và interface đã và đang đạt được tính trừu tượng rồi. Vậy hai từ khóa đó để làm gì? Ví dụ như class sau.

// Đạt được abstraction theo khái niệm // Mà không dùng abstract class hay interface class Person { // Chỉ có những thông tin cấp thiết private int age; private String name; }

Như vậy lúc nào thì cũng phải có abstraction, vì khi code không thể nào liệt kê tất cả tính chất của đối tượng người dùng được. Nên nhớ các tính chất khác của OOP đều là tùy chọn, không bắt buộc sử dụng. Ví dụ một class có thể không tuân theo tính đóng gói, không có thừa kế cũng như đa hình.

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

Vấn đề thứ hai, có 2 lợi ích chính khi sử dụng tính trừu tượng:

  • Đơn giản hóa việc sử dụng chức năng của đối tượng người dùng
  • Giảm sự phụ thuộc (coupling) giữa các đối tượng người dùng

Nếu giảng giải Abstraction như khái niệm đầu bài thì không thể hiện được 2 lợi ích trên. Vì chỉ có một class duy nhất, lúc nào thì cũng phải dùng class này, nên không thể vận dụng vào được.

Như phần trên, tất cả chúng ta biết rằng Abstraction không phải là việc “chỉ lựa chọn những thông tin, chức năng cấp thiết”. Vậy đâu mới là khái niệm đúng của Abstraction, và nên hiểu như vậy thế nào?

Abstraction là việc ẩn đi các rõ ràng và cụ thể triển khai bên trong, chỉ hiển thị những gì cấp thiết ra bên phía ngoài.

Xem Thêm : Tempo và những điều cần biết

Nói cách khác, người dùng chỉ nên tìm hiểu có thể thực hiện những gì (what), còn việc thực hiện ra sao thì không cần quan tâm (how).

Khái niệm như trên vẫn còn tương đối trừu tượng, không sao, abstract mà. Hãy xem tiếp ví dụ thực tế phía dưới.

2.1. Mẩu chuyện về cái remote TV

Ví dụ này mình hay dùng để làm giảng giải cho tính trừu tượng.

800wm.jpg

Hiện tại, mình đưa cho bạn cái remote không có vỏ (phần ở trên) và yêu cầu bạn bật qua kênh 7. Tất nhiên là cuối cùng bạn cũng sẽ tìm được nút nào là kênh 7, nhưng việc đó khá mất thời kì.

Tiếp theo, mình lắp lại phần vỏ cho remote, và yêu cầu bạn chuyển qua kênh 5. Easy game, right?

Như vậy, cái remote không có vỏ vẫn là cái remote, vẫn sử dụng được thường nhật. Tuy nhiên, nếu có thêm lớp vỏ bên phía ngoài nữa thì việc sử dụng sẽ dễ dàng hơn.

2.2. Thực chất của Abstraction

Thực chất của tính trừu tượng là tạo thêm 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.

Như ví dụ về cái remote TV ở trên, phần vỏ đó chính là abstraction layer. Trên vỏ có những nút kí hiệu, sắc tố giúp người dùng dễ sử dụng. Còn khi bấm nút bên trong hoạt động ra sao, dòng điện chạy ra sao không cần quan tâm.

Như vậy, abstraction phải là quá trình ẩn đi thông tin và cách triển khai chức năng, chứ không phải việc lựa chọn những gì cấp thiết để tạo thành đối tượng người dùng.

2.3. Sự mơ hồ trong khái niệm

Hãy xét tiếp một khái niệm khác ví như sau, nguồn từ Guru99.

Abstraction is the concept of object-oriented programming that “shows” only essential attributes and “hides” unnecessary information.

The main purpose of abstraction is hiding the unnecessary details from the users.

Abstraction is selecting data from a larger pool to show only relevant details of the object to the user.

Khái niệm của Guru99 khác hoàn toàn với khái niệm sai ở đầu bài. Theo mình nó vẫn chỉ ở tầm mức tạm ổn, nhưng còn hơi mơ hồ:

  • Làm người đọc ngầm hiểu chỉ có một đối tượng người dùng duy nhất. Không phân biệt ra abstraction layer và implementation.
  • Chưa nêu ra cách “show”, “hide”, “select data” ra sao. Người học sẽ thắc mắc có phải “show” là dùng public, còn “hide” là dùng private? Nếu tách biệt ra 2 phần như mục 1 thì sẽ dễ hiểu hơn.

3.1. Trường hợp Data abstraction

Như trên, khi class ẩn tài liệu khỏi bên phía ngoài thì cũng là thực hiện data abstraction. Bạn cũng có thể thắc mắc, như vậy thì chỉ có một class thôi, làm thế nào phân biệt abstraction layer và implementation?

Xem Thêm : Alien Worlds (TLM) là gì? Phân tích kỹ thuật dự án

Thật ra lúc này, cả abstraction layer và implementation đều nằm chung một class:

  • Implementation là toàn bộ mọi thứ của class đó
  • Abstraction layer là phần public cho bên phía ngoài sử dụng

Ví dụ như đoạn code sau, một phần class Person gồm các public field và public method đó chính là abstraction layer.

class Person { public String name = “Vu”; private int birthYear = 2001; public int getAge() { return 2022 – birthYear; } }

3.2. Abstraction với những dynamic language

Các tiếng nói dynamic như JavaScript,… không có từ khóa abstract và interface. Như vậy, abstraction có thể thực hiện được hay là không?

Lời giải đáp là vẫn có abstraction trong các tiếng nói này. Tuy nhiên sẽ sở hữu được đôi chút khác biệt với Java hay C# (static language). Ở đây mình chọn JavaScript để so sánh nhé.

Trước hết, JavaScript không có access modifier thực sự, chỉ có những convention phân biệt (dùng prefix # cho những private member). Nhưng vậy cũng đủ để sở hữu Data abstraction, vì vẫn phân biệt được abstraction layer và phần implementation.

Thứ hai, JavaScript có thể dùng object bất kì làm abstraction layer (do là weak language và có duck typing). Java thì phải khai báo rõ ràng abstraction layer là một interface hay abstract class, JavaScript thì không cần.

function use(duck) { // Thông 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’) } })

Phần implementation thực sự đã được ẩn đi trong văn cảnh hàm use(). Hàm này chỉ biết rằng thông số duck sẽ gọi được method quack(), nhưng không biết được quack() hoạt động ra sao.

Như vậy, qua quá trình “tam sao thất bản”, mỗi người giảng giải theo một cách khác nhau đã làm sai lệch đi khái niệm của tính trừu tượng trong OOP. Hi vọng các độc giả được nội dung bài viết này sẽ hiểu được xác thực và không còn bị mơ hồ khi nói về chủ đề này nữa.

Nội dung bài viết có tham khảo tri thức từ các nguồn sau, khuyến khích đọc thêm nhé.

https://www.digitalocean.com/community/tutorials/what-is-abstraction-in-oops

https://www.journaldev.com/33191/what-is-abstraction-in-oops

https://www.guru99.com/java-data-abstraction.html

Bonus thêm post mình tìm được trên Stack Overflow cũng nói về điều này, nhưng không được quan tâm nhiều.

https://stackoverflow.com/questions/64520515/what-is-the-correct-definition-of-abstract-in-oop

You May Also Like

About the Author: v1000