Tính trừu tượng (abstraction) là gì?

oop

(Long Nguyen) #1

Câu hỏi này em đã search và tìm ra các câu trả lời nhưng vẫn chưa hiểu rõ lắm.
Theo như cách hiểu của em thì abstraction là một tính chất của lập trình oop giúp tạo ra các phương thức thuộc tính mà nhiều class đều dùng chung. Thông qua việc sử dụng abstract hoặc interface.
Cách hiểu này đúng không mọi người.


(rogp10) #2

Không phải. Trừu tượng hóa nghĩa là chỉ phơi bày các đặc trưng cần thiết của đối tượng.


(Tên Gì Cũng Được) #3

giúp tạo ra các phương thức thuộc tính mà nhiều class đều dùng chung
không đúng (hoặc có thể bạn diễn đạt sai ý bạn hiểu)

abstract, interface mô tả phương thức, thuộc tính
mà những class được extends hoặc implements từ abstract, interface đó sẽ phải hiện thực những cái mô tả đó

Ví dụ

abstract class DongVat

có method di_chuyen
(nhưng nó ko có tả là di chuyển thế nào)

class Chim extends DongVat

Phải hiện thực hàm di chuyển đó

di_chuyen() { 
    // bay
}
class Ca extends DongVat

Phải hiện thực hàm di chuyển đó

di_chuyen() { 
    // boi
}
class Khi extends DongVat

Phải hiện thực hàm di chuyển đó

di_chuyen() { 
    // leo
}

đại khái là sẽ có những mô tả mà ko nói cụ thể là cái đó nó xử lí như thế nào
phải hiện thực cho từng class


(Huy Nguyễn) #4

Như này thì mình thấy giống polymorphsm chứ nhỉ


(Tên Gì Cũng Được) #5

Đúng là nhầm thiệt
trừu tượng là chỉ biết phương thức đó dùng để làm gì thôi, không biết chi tiết là nó xử lý thế nào mới đúng :))
“abstraction là một tính chất của lập trình oop giúp tạo ra các phương thức thuộc tính mà nhiều class đều dùng chung”
đọc xong câu hỏi nhầm qua đa hình luôn :))


(Huy Nguyễn) #6

Mình nghĩ là bạn hiểu. Theo mình thì abstraction là sự lược bỏ chi tiết, giữ lại những đặc điểm chung của 1 nhóm đối tượng.


(明玉) #7

Trích từ điển Hán Việt: “chỉ hoạt động tư tưởng, từ những sự vật riêng biệt, phân tích rút ra những điểm chung và tổng hợp thành khái niệm.”

Ví dụ:

function printTenTimes(str) {
    for (let i = 0; i < 10; i++) console.log(str);
}
function printFiveTimes(str) {
    for (let i = 0; i < 5; i++) console.log(str);
}
printTenTimes(str);
printFiveTimes(str);

Cái chung ở đây là gì, là đều chạy vòng lặp n lần nào đó để in ra str;
Vậy chúng ta “trừu tượng” nó:

function printNTimes(str, n) {
   for (let i = 0; i < n; i++) console.log(str);
}
printNTimes(str, 10);
printNTimes(str, 5);

Ví dụ OOP (mình biết trong C++ đã có mấy api/class đọc file, thực chất mấy api đó là mẫu mực cho abstraction):

void readFileA() {
   auto fp = fopen("A.txt", "r");
   while((ch = fgetc(fp)) != EOF)
      printf("%c", ch);
   fclose(fp);
}
void readFileB() {
   auto fp = fopen("B.txt", "r");
   while((ch = fgetc(fp)) != EOF)
      printf("%c", ch);
   fclose(fp);
}
int main() {
   readFileA();
   readFileB();
   return 0;
}

Trùng lặp khá nhiều (don’t repeat yourself), cần “trừu tượng hóa”:

class Reader {
private:
   FILE fp;
public:
   Reader(char* fileName) {
      this->fp = fopen(fileName, "r");
   }
   ~Reader() {
      fclose(this->fp);
   }
   void printAll() {
      while((ch = fgetc(this->fp)) != EOF)
          printf("%c", ch);
   }
}
void readFileA() {
   auto reader = Reader("A.txt");
   reader.printAll();
}
void readFileB() {
   auto reader = Reader("B.txt");
   reader.printAll();
}
int main() {
   readFileA();
   readFileB();
   return 0;
}

Có thể thấy không chỉ riêng gì oop mới có abstraction.
Cá nhân mình nhận định: abstraction và encapsulation có nhiều điểm chung và điểm riêng, và trong phần lớn trường hợp thì luôn luôn có nhau.


(rogp10) #8

Đây là tổng quát/chuyên biệt hóa :smiley:


(明玉) #9

Cũng chẳng khác gì việc viết interface/abstract chung cho nhiều class đâu :smiley:


(Trần Hoàn) #10

Vì OOP là một khái niệm “thô sơ” nên ứng dụng cũng rất rộng rãi và đa dạng. Mỗi lập trình viên và người thiết kế hệ thống đều mang trong mình những kinh nghiệm khác nhau, và cách suy nghĩ về các tính chất của OOP của mỗi người đều bị ảnh hưởng bởi nhiều yếu tố.

Các tính chất kế thừa, trừu tượng, đa hình, che giấu thông tin… là do người ta đúc kết ra trong quá trình làm việc với OOP chứ không hẳn là định nghĩa, để có một khái niệm tuyệt đối e là khó khăn. Ngôn ngữ đầu tiên sử dụng OOP làm chủ đạo là C++ cũng thể hiện các tính chất đó rất mơ hồ.


(rogp10) #11

“Abstraction” này dịch chuẩn nhất là “trừu tượng hóa”. https://toc.123doc.org/document/847220-c-truu-tuong-hoa-va-khai-quat-hoa.htm


(Long Nguyen) #12

Hiêu rồi. Thank mọi người. Trừu tượng là ẩn đi các chi tiết triển khai và chỉ thể hiện ra tính năng người dùng. Thông qua việc sử dụng interface hay abstract class. Chỉ khai báo phương thức nhưng ẩn đi chi tiết cách thực hiện và đến lớp con mới triển khai


(Giang Phan) #13

Tính trừu tượng là một tiến trình ẩn các chi tiết trình triển khai và chỉ hiển thị tính năng tới người dùng. Tính trừu tượng cho phép bạn loại bỏ tính chất phức tạp của đối tượng bằng cách chỉ đưa ra các thuộc tính và phương thức cần thiết của đối tượng trong lập trình.

Tính trừu tượng giúp bạn tập trung vào những cốt lõi cần thiết của đối tượng thay vì quan tâm đến cách nó thực hiện.

Trong Java, chúng ta sử dụng abstract classabstract interface để có tính trừu tượng.

Chi tiết bạn xem thêm: Tính trừu tượng (Abstraction)ví dụ 4 tính chất của lập trình hướng đối tượng trong Java.


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?