Sự khác biệt giữa 'lớp trừu tượng' và 'mức độ gián tiếp' là gì?


38

Tôi không chắc chắn nếu cả hai thuật ngữ có thể được sử dụng thay thế cho nhau. Có lẽ có một số khác biệt về học thuật trong khoa học máy tính không liên quan đến lập trình hàng ngày? Hoặc tôi có thể sử dụng cả hai thuật ngữ thay thế cho nhau mà không bị sai? Có lẽ nó phụ thuộc vào bối cảnh mà tôi sử dụng cả hai thuật ngữ?

Chỉnh sửa: Về lý do tại sao tôi thấy cả hai thuật ngữ có thể hoán đổi cho nhau là một mục Wikipedia về lớp Trừu tượng . Ở đó bạn có thể tìm thấy câu nói của David Wheelers 'Tất cả các vấn đề trong khoa học máy tính có thể được giải quyết bằng một mức độ khác nhau.'


7
... Ngoại trừ vấn đề quá nhiều cấp độ gián tiếp!
Mason Wheeler

@MasonWheeler: Bạn có thể thêm một cấp độ gián tiếp khác, ít gián tiếp hơn
Jon Purdy

C ++ cho phép bạn thêm một lớp trừu tượng mà không cần một lớp gián tiếp, vì vậy chúng không có nghĩa giống nhau.
dòng chảy

Câu trả lời:


30

Giao dịch trừu tượng với đơn giản hóa,giao dịch gián tiếp với vị trí.

  • Trừu tượnglà một cơ chế "che giấu" các chi tiết phức tạp của một đối tượng theo các thuật ngữ đơn giản hơn, dễ thao tác hơn. Trong lập trình, một ví dụ điển hình là sự khác biệt về chi tiết giữa mã máy và các công cụ khác nhau để tạo các ứng dụng cuối cùng dựa trên mã máy. Xem xét việc tạo một ứng dụng Windows Form với Visual Studio IDE. IDE cho phép bạn nghĩ về ứng dụng theo các mục dễ thao tác theo cách What-You-See-Is-What-You-Get. Vị trí của tiện ích màn hình được trừu tượng hóa thành một vị trí trực quan trong khung mà bạn có thể thay đổi bằng cách kéo tiện ích xung quanh. Trong nội bộ, IDE thao tác các widget bằng cách sử dụng một lớp trừu tượng khác, chẳng hạn như ngôn ngữ cấp cao (chẳng hạn như C #). Bản thân C # không bị thao túng bằng mã máy, nó được xử lý bằng "Môi trường thời gian chạy chung"

  • Cảm ứng đề cập đến việc làm cho vị trí của một mục trong suốt. Nếu bạn biết URI của tài nguyên web, bạn có thể truy cập tài nguyên mà không cần biết vị trí chính xác của tài nguyên web. Bạn không truy cập trực tiếp vào tài nguyên, thay vào đó bạn truy cập qua một kênh chuyển yêu cầu của bạn thông qua một loạt các máy chủ, ứng dụng và bộ định tuyến. Cảm ứng có thể được coi là một loại trừu tượng đặc biệt trong đó vị trí được trừu tượng hóa.


2
+1 câu trả lời tốt nhất cho đến nay! Đã định viết một cái nhưng cái này đủ gần với những gì tôi đã nghĩ.
Newtopian

27

Trừu tượng được thực hiện bằng cách sử dụng gián tiếp.

Ví dụ: bộ nhớ ảo: Sự trừu tượng là một không gian địa chỉ liền kề hoàn toàn theo ý của bạn. Sự trừu tượng hóa này được thực hiện bằng cách sử dụng gián tiếp thông qua bảng trang. Thay vì truy cập trực tiếp vào địa chỉ bộ nhớ vật lý, chúng được dịch từ địa chỉ ảo sang địa chỉ vật lý.

Để thêm một lớp trừu tượng, bạn phải thêm một lớp gián tiếp. Nhưng việc thêm sự gián tiếp không nhất thiết mang lại cho bạn sự trừu tượng. Ví dụ, có getters và setters trên mỗi biến duy nhất là một lớp không xác định, nhưng nếu tất cả những gì họ làm là nhận và đặt các giá trị đơn giản thì không có sự trừu tượng hóa.


2
Trong thực tế, ví dụ cuối cùng là không tốt. Đồng bằng getters và setters làm thêm trừu tượng. Người duy nhất biết, họ đơn giản, là lớp khai báo chúng. Nếu bạn quyết định thay đổi triển khai, bất kỳ mã nào được xây dựng dựa trên sự trừu tượng sẽ không bị ảnh hưởng.
back2dos

bạn có thể đưa ra bất kỳ ví dụ tốt hơn đó là sự gián tiếp nhưng không phải là abastraction?
Mr Coder

1
chắc chắn là một ví dụ sai
Morg.

3
Ai nói gì về lớp học? Tôi cũng không nói gì về việc thay đổi mức độ hiển thị của một biến. Không có gì ngăn cản bạn truy cập trực tiếp; nó là một biến Nhưng bạn cũng có thể làm điều đó với một mức độ gián tiếp thông qua getter và setter. Vì ngữ nghĩa của việc sử dụng getter và setter giống như truy cập trực tiếp vào biến, nên không có sự trừu tượng hóa.
Austin

2
Ngoại trừ việc getter và setter không nhất thiết 'chỉ' truy cập vào biến. Nếu bạn đang sử dụng một getter và setter, bạn đang thêm một sự trừu tượng hóa vì bạn có thể thay đổi chúng để sử dụng một biến khác mà không cần người dùng biết về nó, do đó là một sự trừu tượng hóa.
Dominique McDonnell

9

Trước tiên, hãy thử định nghĩa đúng cho các điều khoản:

  1. Lớp trừu tượng có nghĩa là:

     a) there is large number of positions which use abstraction
          (layer = all the positions together)
     b) each position is hiding some complex stuff, but allows invoking it 
          using only simple code. 
         (abstraction == one-to-one mapping between simple code and complex code)
    
  2. Mặt khác, mức độ gián tiếp có nghĩa là:

      a) you're counting levels
      b) indirection==there are several steps before you can reach or access the data
      c) level of indirection is just how many steps it takes to access the data
    

Cả hai điều này đều có thể có cùng một ý nghĩa, miễn là bạn sử dụng:

  a) step = going from simple code to complex code. 

7

Sự hiểu biết của tôi là sự trừu tượng chủ yếu đề cập đến các chức năng và sự gián tiếp chủ yếu đề cập đến dữ liệu. Nói cách khác, mức độ trừu tượng là mức độ theo dõi ngăn xếp của bạn sâu đến mức nào và mức độ gián tiếp là số lượng con trỏ bạn phải thực hiện. Ít nhất đó là cách tôi sử dụng các thuật ngữ.


với các chức năng ảo được mô hình hóa như con trỏ đến các chức năng?
Caleth

7

Lớp trừu tượng và mức độ cảm ứng là những khái niệm riêng biệt. Trừu tượng là sự tổng hợp và đặt tên có ý nghĩa của một số yếu tố, chẳng hạn như các phần dữ liệu hoặc hướng dẫn chương trình, ví dụ như khái niệm về một cuộc gọi tệp hoặc phương thức, trong khi đó, việc tách rời các thực thể để tạo thuận lợi cho việc hoãn thực hiện mối quan hệ của chúng, ví dụ, việc sử dụng JNDI để phân tách nhận dạng tài nguyên trong một chương trình khỏi tài nguyên thực tế mà cuối cùng có thể được cung cấp bởi một thùng chứa ứng dụng.

Thường thì các khái niệm đi đôi với nhau và cái nào áp dụng cho một cấu trúc cụ thể phụ thuộc vào việc tập thể dục hoặc thảo luận đang diễn ra. Chẳng hạn, bản chất trừu tượng của một giao diện rất quan trọng khi học hoặc ghi lại API; thuộc tính của sự gián tiếp rất quan trọng khi thêm khả năng mở rộng hoặc tạo các thử nghiệm cho một ứng dụng.

Một lớp trừu tượng là sự tổng hợp của trừu tượng hóa và mang lại cho chúng tính toàn vẹn về mặt khái niệm và tính nhất quán của việc sử dụng. CreatProcess là tên API win32 cho một nhóm mã xây dựng và thực thi một quy trình. "Tên" rất có ý nghĩa đối với bối cảnh này bởi vì nếu chúng ta gọi hàm này là một cái gì đó giống như DoAllocMemThenMakeEnvThenFindEntryPoint ... thì nó thực sự sẽ không trừu tượng lắm. Một lớp như API Win32 cung cấp một rào cản mà qua đó một lập trình viên có thể được khuyên không nên mạo hiểm. Nó loại bỏ sự phức tạp khỏi quan điểm của người gọi với chi phí giảm công suất (tính linh hoạt, hiệu suất, v.v.). Sự đánh đổi này được nhấn mạnh bằng thảo luận thường xuyên về trừu tượng bị rò rỉ: chúng ta vẫn có thể cần thực hiện các cuộc gọi SQL trực tiếp khi sử dụng Hibernate hoặc thực hiện các cuộc gọi Win32 khi sử dụng .NET.

Liên quan đến vấn đề gián tiếp, hầu hết các chương trình không tầm thường đều hoạt động với một số hình thức xác định mã hóa người dùng, chứng kiến ​​phần INPUT-OUTPUT của COBOL từ trước hòm. Khi truy cập vào một tài nguyên như cơ sở dữ liệu, chúng ta có thể thấy việc nhúng chuỗi kết nối JDBC trong mã dưới dạng không xác định cấp 0, kết nối JNDI (ủy quyền lựa chọn tài nguyên cho vùng chứa ứng dụng) như Cấp 1 và một số Spring xây dựng ánh xạ định danh JNDI của ứng dụng cho một trong nhiều tài nguyên bộ chứa là Cấp 2. Nhiều cấp cho phép một số bên ngoài mối quan hệ (trong trường hợp này là mối quan hệ giữa thực thi mã và cơ sở dữ liệu) để thao tác mối quan hệ đó. Điều này áp dụng như nhau cho các thành phần chương trình nội bộ như giao diện và sự kiện.

Chúng tôi thấy rằng, bất kể phẩm chất nào khác của họ, sự trừu tượng làm giảm sự phức tạp trong khi sự gián tiếp làm tăng nó. Trừu tượng làm giảm sức mạnh trong khi sự gián tiếp làm tăng nó. Cảm ứng có thể được sử dụng để khôi phục sức mạnh của sự trừu tượng bằng cách cho phép hành vi mặc định bị ghi đè bởi các cuộc gọi lại tùy chỉnh.


1

Một con trỏ tới một con trỏ tới một con trỏ tới một con trỏ tới một con trỏ tới một con trỏ tới int có sáu mức độ không xác định, nhưng không có lớp trừu tượng nào.


0

Một ví dụ điển hình về sự trừu tượng là gọi một phương thức duy nhất để lưu trữ một mục trong cơ sở dữ liệu. Phương thức trừu tượng hóa các chi tiết kết nối và gọi cơ sở dữ liệu. Trong đó một ví dụ về sự gián tiếp đang sử dụng một cấu trúc để truy cập các ngắt. Bạn vẫn đang truy cập ngắt khi bạn đặt giá trị trong cấu trúc. nó chỉ gián tiếp thông qua cấu trúc bằng cách đặt tên thành viên cấu trúc cho các điểm cụ thể trong bộ nhớ.

Vì vậy, sự trừu tượng che giấu các chi tiết của việc thực hiện trong đó chỉ định cung cấp một giao diện "gián tiếp" thông qua đó để truy cập một cái gì đó.

Trừu tượng là khi bạn không cần phải hiểu những gì đang bị che giấu, nơi mà bạn không thể làm được.


-1

Thêm một mức độ (hoặc lớp) trừu tượng và thêm một mức độ gián tiếp là hai cách đơn giản để nói cùng một điều. Khi bạn giải quyết một vấn đề, bạn thường thử một giải pháp trực tiếp. Đôi khi điều đó là không thể, vì vậy bạn hãy thử một giải pháp gián tiếp. Điều này đòi hỏi phải giới thiệu một số trừu tượng để đơn giản hóa vấn đề - vì đó là do vấn đề phức tạp nên không thể giải quyết trực tiếp. Đã giải quyết vấn đề bằng cách tiếp cận gián tiếp, không có lý do gì để không xem xét giải quyết vấn đề một lần nữa, nhưng nhìn chung hơn; Điều này sẽ liên quan đến việc giới thiệu một mức độ trừu tượng cao hơn. Và giải pháp mới, tổng quát hơn này thậm chí còn gián tiếp hơn so với giải pháp gián tiếp ban đầu - tức là một mức độ gián tiếp khác đã được đưa ra.


3
điều này dường như không thêm bất cứ điều gì đáng kể vào các điểm được thực hiện và giải thích trong 7 câu trả lời trước
gnat

Cảm ơn, Gnat. Tôi nêu quan điểm của bạn, và thật đáng tiếc câu hỏi thú vị này thu hút rất nhiều thư rác!
ChrisC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.