OOP – Tính trừu tượng (Abstraction)

Đây là một trong 4 tính chất cơ bản của lập trình hướng đối tượng.

Tính trừu tượng nhằm che dấu đi chi tiết cụ thể của mã nguồn, chỉ đưa ra bức tranh tổng quan về hành vi của lớp hoặc của phương thức. Với các ngôn ngữ có hỗ trợ OOP, việc thể hiện tính trừu tượng có thể sử dụng mã nguồn thuần túy hoặc sử dụng một công cụ được hỗ trợ là lớp trừu tượng (abstract class), nội dung sau đây sẽ chỉ ra hai cách thể hiện này.

1. Trừu tượng hành vi của lớp không dùng abstract class.

  1. Mô tả bài toán: Một cửa hàng thực hiện bán hàng xỉ, mỗi mặt hàng là trên một hóa đơn với số lượng lớn. Nhân viên bán hàng sẽ liên lạc với kho để lấy hàng, rồi yêu cầu hóa đơn từ kế toán cho khách hàng khi bán. Thể hiện bài toán này sử dụng OOP.
  2. Phân tích: Nhận thấy rằng nhân viên bán hàng sẽ không cần quan tâm đến việc kho hàng xuất kho ra sao, và kế toán viết hóa đơn thế nào. Đối với nhân viên bán hàng, chỉ cần nắm rõ các bước của việc bán xỉ là:
    1. Xuất hàng khỏi kho chuyển cho khách
    2. Ghi hóa đơn
    3. In hóa đơn gửi cho khách

Nhưng người này không quan tâm đến việc nhân viên kho lưu-chuyển hàng ra sao, kế toán viết hóa đơn chi tiết thế nào.

Do vậy, ta sẽ tạo ra các lớp Kho, và Kế Toán để mô tả riêng, còn đối với hành vi bán hàng của nhân viên bán, sẽ chỉ có chứa tổng thể thao tác bán gồm những gì mà không quan tâm đến chi tiết đó làm thế nào.

c. Mã nguồn: (C#)

d. Kết quả:

Ta thấy rằng cách làm sẽ sử dụng đối tượng hoạt động cụ thể vào lớp Cửa Hàng là đối tượng khohang và hoadon. Hai đối tượng này đại diện cho việc xuất kho, làm hóa đơn, vốn là những công việc không liên quan đến người bán hàng. Nhưng người này khi bán sẽ biết đầu việc cần phải làm gì để bán được, còn chi tiết những việc cần làm đó làm thế nào thì sẽ do bên khác thực hiện.

2. Trừu tượng sử dụng abstrac class.

  1. Mô tả bài toán: Một công ty dịch vụ cần in hóa đơn cho các mảng dịch vụ của mình sao cho cách thức in là chung với các mảng dịch vụ như dịch vụ tiền điện, nước, sửa chữa, bán hàng, mua hàng... với các bước chung là kết nối máy in, lấy mẫu hóa đơn, nạp dữ liệu hóa đơn, và in hóa đơn.
  2. Phân tích: Ta nhận thấy khó khăn ở chỗ mỗi loại hóa đơn sẽ có mẫu hóa đơn và dữ liệu khác nhau, làm thế nào để có thể nạp các mẫu và loại đó lên cùng một lớp trong khi phải lệ thuộc vào việc hóa đơn đó là hóa đơn gì? Cho nên ta sẽ  xây dựng lớp abstract Hóa Đơn, mô tả chung các hành vi, còn hóa đơn cụ thể sẽ mô tả các hành vi đó.
  3. Mã nguồn: (C#)
  4. Kết quả:

Ta thấy rằng lớp Hóa Đơn không cần quan tâm đến hóa đơn cụ thể là hóa đơn gì, có mẫu hình hóa đơn ra sao và dữ liệu thế nào, nó chỉ cần quan tâm đến việc In Hóa Đơn có 4 bước một cách tổng quát của nó, còn chi tiết sẽ được thể hiện bới các lớp cụ thể khác.

3. Kết luận:

  • Tính trừu tượng cho ta cái nhìn tổng thể về hành vi của lớp hơn là đi vào chi tiết, qua đó tránh được mã lặp, tái sử dụng lại mã nhiều hơn và hiệu quả hơn.
  • Sự khác nhau rõ rệt nhất của tính trừu tượng và đóng gói:

Trừu tượng

Đóng gói

Giải quyết bài toán ở mức thiết kế

Giải quyết bài toán ở mức viết mã chi tiết

Thể hiện hành vi, che đi chi tiết

Che dấu giữ liệu khỏi bên ngoài lớp

Sử dụng đối tượng từ lớp khác hoặc công cụ abstract class để thể hiện

Sử dụng phạm vi truy cập và get – set để thể hiện

Dùng khi mô tả hành vi lớp tổng thể

Dùng khi mô tả dữ liệu của thực thể

Khánh Nguyễn