Thuật ngữ WRAPPER được sử dụng ở đâu và như thế nào trong lập trình, nó giúp làm gì?


83

Tôi bắt gặp các nhà phát triển phần mềm sử dụng thuật ngữ tạo Wrappers của các lớp hoặc API khác hoặc thậm chí một số mã, đây là thuật ngữ được các Lập trình viên phần mềm có kinh nghiệm sử dụng

Vì vậy, bất kỳ ý tưởng nào họ có nghĩa là gì;

ví dụ một câu hỏi đơn giản; chúng tôi có hai loại kỹ thuật sắp xếp mảng, hãy tạo một trình bao bọc cho nó

Ở trên là một ví dụ rất đơn giản

Câu trả lời:


132

Thuật ngữ 'wrapper' được sử dụng rất nhiều. Nói chung, nó được sử dụng để mô tả một lớp có chứa một thể hiện của một lớp khác, nhưng không trực tiếp hiển thị cá thể đó. Mục đích chính của trình bao bọc là cung cấp một cách 'khác' để sử dụng đối tượng được bao bọc (có lẽ trình bao bọc cung cấp giao diện đơn giản hơn hoặc thêm một số chức năng).

Từ 'wrapper' cũng có thể được sử dụng khi mô tả các mẫu thiết kế cổ điển.

Bao bọc một đối tượng để cung cấp một giao diện đơn giản cho nó thường được mô tả là mẫu 'Mặt tiền'. Trình bao bọc là mặt tiền.

Đôi khi bạn có thể có một lớp phù hợp với một giao diện cụ thể, nhưng bạn không thể thay đổi mã cho nó để làm cho nó phù hợp với giao diện đó. Bạn có thể tạo một trình bao bọc cho lớp đó thực hiện giao diện, nhưng nó hướng hầu hết các lệnh gọi đến đối tượng được bao bọc. Đây là mẫu 'Bộ điều hợp'. Trình bao bọc là bộ điều hợp.

Ví dụ bạn mô tả, trong đó bạn có hai lớp có thể thực hiện sắp xếp mảng bằng các thuật toán khác nhau nghe giống như mẫu 'Chiến lược', nơi bạn cung cấp một cách để thực hiện một thao tác trên một số đối tượng, nhưng thuật toán được sử dụng cho thao tác đó có thể khác nhau tùy thuộc dựa trên cấu trúc của đối tượng đó.

Ví dụ: một trong các thuật toán sắp xếp của bạn có thể phù hợp với các mảng có độ dài nhỏ hơn 100, nhưng hiệu suất có thể là một vấn đề đối với nó. Thuật toán khác có thể tốt cho các mảng lớn hơn. Bạn có thể tạo 'trình bao bọc' cho hai thuật toán hỗ trợ hoạt động sắp xếp nhưng quyết định sử dụng thuật toán nào dựa trên độ dài mảng.

Phần lớn các trình bao bọc tồn tại để che giấu một số loại phức tạp.


5
oh, đã nhận nó ... Cảm ơn bạn :) một câu trả lời rất chi tiết, giải quyết vấn đề wrapper của tôi ở đó :)
— Basit Anwer

Trong python có gói xdress github.com/xdress/xdress . Nó nói rằng nó là một trình tạo trình bao bọc. Trong bối cảnh này, điều đó có nghĩa là gì? Liệu nó tạo ra một thực thi trong C (mà thực sự sẽ cung cấp một cách 'khác nhau' (trong C) để sử dụng đối tượng bọc (bằng Python), hay tôi bị nhầm lẫn?

75

Giải thích đơn giản bằng phép tương tự: Gói là gì?

Mã không được sử dụng để giải thích.

Ví dụ 1: Một chiếc Ipad "bọc" một chiếc Iphone

IPad làm được gì mà iphone không làm được?

Không phải về cơ bản chúng giống nhau, ngoại trừ một cái có màn hình lớn hơn?

Ipad "bao bọc" iphone: nghĩa là bạn có tất cả các lợi ích của iphone TRONG NGAY ipad, VÀ có những lợi ích của màn hình lớn hơn, vv Nhưng về cơ bản, bên trong ipad, nằm ở một chiếc Iphone.

Sau đó là gì khác nhau? Điểm khác biệt duy nhất là bên ngoài: bạn có màn hình lớn hơn và có lẽ, bạn không thể gọi điện trên Ipad.

IPhone là thứ duy nhất bên trong Ipad.  Ipad thực sự bao bọc Iphone.  Ngoại trừ việc bạn không thể gọi điện bằng Ipad vì khả năng gọi điện vẫn chưa được "phơi bày".  Apple muốn bạn mua sản phẩm x2 không chỉ một: P

Nó thực sự giống như điều với "vật thể".

............. bên trong có tất cả những thứ tốt giống nhau, nhưng bên ngoài khác. Một trình bao bọc khác.

"Wrappers có thể hiển thị các tính năng khác với đối tượng bên dưới" ...... được rồi, nhưng điều này có nghĩa là gì?

Đôi khi trình bao bọc có thể giới hạn những thứ bạn có thể truy cập bên trong. Ví dụ, ipad có thể hạn chế khả năng gọi điện của bạn, mặc dù Iphone được chôn trong nó có khả năng đó.

Ví dụ 2: Ô tô tự động hoạt động như một lớp bọc cho ô tô thủ công

Hãy nghĩ về xe số tự động và xe số sàn. Đằng sau, trong một chiếc xe số tự động, có một số cơ chế kỹ thuật tự động thay đổi các bánh răng cho bạn, nhưng về cơ bản, dưới bề mặt, chiếc xe vẫn là một chiếc xe số tay. Nói cách khác, các tính năng tự động của xe "gói gọn" chức năng thủ công của xe. Nếu bạn muốn tự mình thay đổi các bánh răng trên xe ô tô số tự động - đơn giản là bạn không thể làm được. Khả năng sang số "không lộ liễu" ở xe số tự động. Nhưng nó được phơi bày trong một chiếc xe thủ công. Cho rằng phép loại suy hơi căng thẳng, nhưng tôi hy vọng bạn sẽ thấy những gì tôi đang đạt được.

Nhưng mục đích của wrapper là gì?

Bạn sẽ viết một lớp gói nếu bạn muốn đơn giản hóa mọi thứ. Bạn sẽ tạo một 'wrapper' dễ sử dụng và để lại tất cả các bit phức tạp bên trong wrapper, đảm bảo rằng những bit phức tạp đó không bị 'lộ ra ngoài'.

Ví dụ, bạn có thể có một trình bao bọc .net, bên dưới, thực hiện các cuộc gọi COM. Nếu bạn không có trình bao bọc, thì bạn buộc phải tự thực hiện các lệnh gọi COM đó. May mắn thay với trình bao bọc, bạn chỉ cần thực hiện các cuộc gọi tới mã gói .net - từ đó sẽ thực hiện các cuộc gọi COM đó. Và điều đó hy vọng sẽ đơn giản hóa mọi thứ cho bạn.


8
Tôi thích những lời giải thích kiểu này khi giải thích các thuật ngữ công nghệ. Bạn có biết bất kỳ trang web cụ thể làm điều đó? Cảm ơn.
— viggy28:

2
Điều này làm cho rất nhiều ý nghĩa.
— L. Dai

10

Nó chỉ là bạn viết một số mã dễ sử dụng để che giấu sự phức tạp của mã bên dưới. Nó đặc biệt hữu ích khi bạn cần gọi một số API cấp thấp từ một ngôn ngữ cấp cao hơn và bạn muốn ẩn tất cả mã "xấu xí" đi.

Chỉnh sửa: Bạn có thể tìm thêm về nó trong hai bài viết wiki sau: thư viện và chức năng


4

Trình bao bọc là một số mã được tạo để gọi một số API trong nội bộ mà không thay đổi API thực tế.

Ví dụ về điều này là việc Facebook phát hành Facebook C # SDK của họ . SDK thực sự là một trình bao bọc vì nó chỉ cho phép bạn gọi nền tảng cơ bản của nó mà không cung cấp cho bạn các phương thức và lớp cụ thể. Mặt khác, Bộ công cụ dành cho nhà phát triển Facebook là API đầy đủ của nó.


Tôi cần viết chương trình C # để tạo tệp tập lệnh (ngôn ngữ tập lệnh dành riêng cho thiết bị phần cứng và được gọi CoraScript). Có khoảng 50 lệnh trong CoraScript, ví dụ, một lệnh kết nối với một thiết bị, một lệnh gửi tệp ra thiết bị đó, yêu cầu nó thực thi một ứng dụng trong bộ nhớ Flash của nó, v.v. Thay vì viết tay một CoraScript, tôi muốn muốn tạo một thư viện C # sẽ tạo ra một tập lệnh như vậy. Thư viện C # này có được gọi là wrapper libraryngôn ngữ kịch bản dành cho CoraScript không?
— Minh Tran

Trình thông dịch dòng lệnh cho ngôn ngữ kịch bản đó là một ứng dụng bảng điều khiển. Trong khi ứng dụng đó chạy, nó sẽ nhận các lệnh CoraScript, thực thi chúng và trả về đầu ra của lệnh đó (ví dụ: Connect localhostlệnh CoraScript sẽ trả về chuỗi +connect,"coralib3.dll version 1,8,11"để chỉ ra rằng lệnh đã được thực thi thành công).
— Minh Tran,

2

Có rất nhiều ví dụ về "wrappers" và thuật ngữ này đôi khi được sử dụng thay thế cho nhau. Sau đây là một số ví dụ đáng nhớ:

DLL Wrapper

Trước đây, tôi đã tạo một trình bao bọc COM xung quanh .NET DLL để sử dụng các tính năng nâng cao của .NET trong các ứng dụng cũ hơn hiểu COM nhưng không hiểu .NET.

Object Wrapper (Java)

Trong Java, có một lớp được cung cấp trong java.langgói để cung cấp các phương thức đối tượng cho tám kiểu nguyên thủy. Tất cả các lớp trình bao bọc nguyên thủy trong Java là bất biến. Vì vậy, Wrappercác lớp được sử dụng để biểu diễn các giá trị nguyên thủy khi một Objectđược yêu cầu.



-1

Giả sử bạn muốn thêm một số chức năng khác vào mã của mình nhưng bạn không thể thay đổi mã. Đó là nơi mà wrapper sẽ giúp. Bạn có thể sử dụng một trình bao bọc để lấy đầu ra mà không cần thay đổi mã gốc.

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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.