2013-08-09 63 views
8

Tôi đã đọc "The C++ Programming Language" Stroustrup và ông đề cập đến "trừu tượng" rất nhiều:"trừu tượng" là gì?

Nhiều trừu tượng linh hoạt nhất, hiệu quả và hữu ích liên quan đến việc tham số hóa các loại (lớp) và các thuật toán (chức năng) với các loại khác và các thuật toán

C++ là một ngôn ngữ để phát triển và sử dụng trừu tượng thanh lịch và hiệu quả.

Đây có phải là cách liên quan đến các lớp trừu tượng trong C++ không? Hoặc với việc sử dụng đa hình, thừa kế hoặc mẫu?

Có thể ai đó đưa ra ví dụ không?

+2

Hãy tưởng tượng phải mất rất nhiều công sức để hoàn thành một tác vụ. Bây giờ hãy tưởng tượng họ là một chức năng đơn giản để làm điều đó. Thì đấy, một sự trừu tượng. – chris

+1

B.Stroustrup (http://www.stroustrup.com/glossary.html) - * trừu tượng - hành động chỉ định một giao diện chung ẩn chi tiết triển khai. Các lớp, các lớp trừu tượng và các khuôn mẫu là các cơ chế trừu tượng chính trong C++. Xem thêm: đóng gói. * – SChepurin

+2

vui lòng mở lại câu hỏi này, [có một câu trả lời đúng cho nó] (http://www.boost.org/community/generic_programming.html#concept) – TemplateRex

Trả lời

15

trừu tượng (n) - chất lượng đối phó với những ý tưởng chứ không phải là sự kiện

— nguồn: Oxford English Dictionary

Stroustrup không đề cập đến lớp trừu tượng hay ý tưởng cụ thể khác trong lập trình. Thay vào đó, ông đang đề cập đến từ trừu tượng của chính nó.

Tóm tắt là những người trợ giúp tinh thần. Chúng giúp chúng ta suy nghĩ trong "lý thuyết" hơn là ứng dụng trực tiếp. Toán học là nghệ thuật trừu tượng. Lập trình là nghệ thuật trừu tượng được áp dụng.

Tóm tắt giúp chúng tôi hình thành các mô hình tinh thần, chẳng hạn như phân cấp, để giúp chúng tôi nghĩ về mọi thứ. Đa hình là có thể vì trừu tượng. Chúng ta hãy xem một ví dụ.

Ví dụ

1st level

Tôi có một Oleksiy Dobrodum. Tôi gọi nó là Oleksiy Dobrodum, tôi coi nó như một Oleksiy Dobrodum, tất cả nó sẽ là một Oleksiy Dobrodum. Tất cả những gì tôi làm với Oleksiy Dobrodum này là đặc biệt cho nó. Bây giờ chúng ta đang ở cấp độ trừu tượng thứ nhất, hoặc cụ thể nhất mà chúng ta từng làm khi làm việc với Oleksiy Dobrodum này.

Gần đây tôi đã mua một chiếc Zach Latta, vì vậy bây giờ tôi có cả Oleksiy Dobrodum và Zach Latta.

More 1st level

tôi có thể giới thiệu cho họ cả hai cá nhân, vì vậy như một Oleksiy Dobrodum và như là một Zach Latta, nhưng điều đó sẽ nhanh chóng phát triển dư thừa và chứng minh không được linh hoạt. Thay vào đó, chúng ta chỉ có thể nhóm Oleksiy Dobrodum và Zach Latta lại với nhau và gọi chúng là Con người. Bây giờ chúng ta đã đạt được mức trừu tượng 2. Thay vì đối phó với từng cá nhân, chúng ta có thể gọi chúng là Con người. Bằng cách này, chúng tôi đã trừu tượng hóa "triển khai", hoặc các chi tiết cụ thể của từng người và đã bắt đầu tập trung vào các ý tưởng, do đó chúng tôi đang suy nghĩ trong phần tóm tắt.

More 2nd level

Dĩ nhiên chúng ta có thể trừu tượng này hơn nữa, nhưng hy vọng bạn đang bắt đầu để có được ý tưởng đằng sau khái niệm trừu tượng. Điều quan trọng từ việc này là việc trừu tượng ẩn các chi tiết (hoặc triển khai). Bằng cách che giấu các chi tiết trong sự trừu tượng của con người, chúng ta cho phép chúng ta nói chung. Chúng ta sẽ nói ngắn gọn về cách áp dụng điều này trong lập trình trong phần tiếp theo.

Áp dụng các thao tác trừu tượng

Bây giờ chúng tôi đã chạm vào một thời gian ngắn về khái niệm trừu tượng là gì, hãy áp dụng nó. Đa hình là có thể vì trừu tượng. Theo mô hình của các ví dụ trước, nói rằng chúng ta có hai loại sau đây:

class OleksiyDobrodum 
    name = "Oleksiy Dobrodum" 
    smarts = :mega-smart 
    mood = :happy 
    favorite_candy = :chocolate 
end 

class ZachLatta 
    name = "Zach Latta" 
    smarts = :so-so 
    mood = :indifferent 
    hair_color = :brown 
end 

Nếu tôi muốn tương tác với một thể hiện của ZachLatta tôi phải đề cập đến nó đặc biệt. Tương tự với các trường hợp OleksiyDobrodum.

zach = new ZachLatta 
print zach.name 

oleksiy = new OleksiyDobrodum 
print oleksiy.favorite_candy 

Nếu tôi có thể tạo một lớp trừu tượng gọi là Human và có cả OleksiyDobrodumZachLatta kế thừa từ nó, sau đó tôi có thể trừu tượng đi thi của cả hai lớp và chỉ cần đề cập đến cả hai trường hợp trong số họ là Human.

class Human 
    name 
    smarts 
    mood 
end 

class OleksiyDobrodum < Human 
    name = "Oleksiy Dobrodum" 
    smarts = :mega-smart 
    mood = :happy 
    favorite_candy = :chocolate 
end 

class ZachLatta < Human 
    name = "Zach Latta" 
    smarts = :so-so 
    mood = :indifferent 
    hair_color = :brown 
end 

sơ đồ lớp của chúng tôi bây giờ trông giống như sau:

Class diagram for code above

tôi có thể dông dài trên về thực hiện mãi mãi, nhưng chúng ta hãy chuyển sang takeaways chính của chúng tôi.

chính takeaways

  • trừu tượng là những ý tưởng, chứ không phải sự kiện cụ thể
  • để trừu tượng một cái gì đó là để di chuyển ra khỏi việc thực hiện và suy nghĩ về những ý tưởng lớn
  • trừu tượng có thể được dùng để sắp xếp mã (và nhiều những thứ khác) có hiệu quả
  • lập trình hướng đối tượng hoàn toàn phụ thuộc vào sự trừu tượng hóa. xem dấu đầu dòng ở trên.
+0

Bạn có thể cho ví dụ được không? – Oleksiy

+1

@ Zach Latta: Tôi đồng ý và đã upvoted câu trả lời của bạn, nhưng trừu tượng là nhiều hơn những người giúp đỡ tinh thần và các mô hình tinh thần. Họ tổ chức mã thực tế. – Frodo

+1

@Frodo * some * abstractions có thể giúp sắp xếp mã. – juanchopanza

1

Có nó có liên quan đến các lớp trừu tượng trong C++ và nó không giới hạn trong bối cảnh đó, ông giải thích theo một cách chung chung nói rằng C++ có hỗ trợ đầy đủ trừu tượng.

Ví dụ: Trong C++, chúng ta có thể sử dụng kiểu lớp hoặc gọi hàm trong các loại khác. Ví dụ: hàm gọi có thể có loại/hàm làm tham số, cả hàm và lớp đều tham chiếu biểu mẫu trừu tượng- (ở đây trừu tượng đề cập đến việc ẩn định nghĩa của hàm hoặc một lớp từ người dùng)

+0

Nó thực sự rộng hơn các lớp trừu tượng. Ví dụ, khi viết trong lập trình chung (mẫu), bạn đối phó với trừu tượng: kiểu tham số chính xác là không xác định, nhưng bạn có một số kỳ vọng. –

2

Trong lập trình chung, trừu tượng có ý nghĩa chính xác và được gọi là "khái niệm". Một khái niệm là defined as follows:

Khái niệm là tập hợp các yêu cầu bao gồm các biểu thức hợp lệ, loại liên quan, bất biến và đảm bảo phức tạp.Một loại đáp ứng các yêu cầu được cho là mô hình hóa khái niệm. Một khái niệm có thể mở rộng các yêu cầu của một khái niệm khác, được gọi là tinh lọc.

Expressions
  • trị là C++ biểu thức mà phải lập thành công cho các đối tượng tham gia vào các biểu thức để được xem xét mô hình của khái niệm này.
  • Các loại liên quan là các loại có liên quan đến loại mô hình hóa ở chỗ chúng tham gia vào một hoặc nhiều biểu thức hợp lệ. Thông thường các kiểu liên kết có thể được truy cập thông qua typedefs lồng nhau trong một định nghĩa lớp cho kiểu mô hình hóa, hoặc chúng được truy cập thông qua một lớp đặc điểm.
  • Các biến thể là các đặc tính thời gian chạy của các đối tượng phải luôn đúng, nghĩa là các hàm liên quan đến các đối tượng phải bảo toàn các đặc tính này. Các bất biến thường có dạng tiền xử lý và hậu điều kiện.
  • Đảm bảo phức tạp là giới hạn tối đa về việc thực hiện một trong các biểu thức hợp lệ trong bao lâu hoặc sử dụng bao nhiêu tài nguyên khác nhau. Các khái niệm được sử dụng trong Thư viện chuẩn C++ được ghi lại tại số SGI STL site.

Việc triển khai khái niệm thành mã thực có thể được thực hiện bằng nhiều cách. Cách tiếp cận OOP cổ điển là viết một lớp cơ sở trừu tượng cung cấp các biểu thức hợp lệ và các kiểu liên kết. Các lớp dẫn xuất cụ thể sau đó cung cấp các bất biến và độ phức tạp đảm bảo. Đối với các mẫu, các biểu thức hợp lệ sẽ ẩn chứa nhiều hơn và chỉ được kiểm tra sau khi khởi tạo. khái niệm mẫu thực hiện là một hình thức duck typing: nếu nó trông giống như một con vịt, quacks như một con vịt, ....

Quá trình phát triển C++ 0x devoted a lot of effort để làm cho khái niệm trực tiếp thể biểu diễn thành mã, nhưng nó đã được not incorporated into the C++11 Standard. Tuy nhiên, phiên bản Concepts Lite có khả năng sẽ xuất hiện trong tiêu chuẩn C++ 14 tiếp theo.

Các vấn đề liên quan