Где и как используется термин WRAPPER в программировании, для чего он помогает?


87

Я сталкиваюсь с разработчиками программного обеспечения, использующими термин создание оболочек других классов, API или даже некоторых кодов, это термин, используемый опытными программистами.

Итак, любая идея, что они подразумевают под этим;

например, простой вопрос; у нас есть два типа методов сортировки массивов, давайте создадим для них обертку

Выше приведен очень простой пример.

Ответы:


137

Термин «обертка» часто используется. Обычно он используется для описания класса, который содержит экземпляр другого класса, но не предоставляет этот экземпляр напрямую. Основная цель оболочки - предоставить «другой» способ использования обернутого объекта (возможно, оболочка обеспечивает более простой интерфейс или добавляет некоторые функции).

Слово «оболочка» также можно использовать при описании классических шаблонов проектирования.

Обертывание объекта для упрощения интерфейса часто описывается как паттерн «Фасад». Обертка - это фасад.

Иногда у вас может быть класс, который подходит для определенного интерфейса, но вы не можете изменить его код, чтобы он соответствовал этому интерфейсу. Вы можете создать оболочку для этого класса, которая реализует интерфейс, но направляет большую часть вызовов на обернутый объект. Это шаблон «Адаптер». Обертка - это переходник.

Описываемый вами экземпляр, в котором у вас есть два класса, которые могут выполнять сортировку массивов с использованием разных алгоритмов, звучит как шаблон «Стратегия», в котором вы предоставляете способ выполнения операции над некоторым объектом, но алгоритм, используемый для этой операции, может отличаться в зависимости от на структуру этого объекта.

Например, один из ваших алгоритмов сортировки может отлично подходить для массивов длиной менее 100, но тогда производительность может быть для него проблемой. Другой алгоритм может быть хорош для больших массивов. Вы можете создать «оболочку» для двух алгоритмов, которая поддерживает операцию сортировки, но решает, какой алгоритм использовать, в зависимости от длины массива.

Подавляющее большинство оболочек существует, чтобы скрыть какую-то сложность.


5
ох, понял ... Спасибо :) очень подробный ответ, там мои проблемы с обёрткой решили :)
— Basit Anwer

В python есть пакет xdress github.com/xdress/xdress . Он говорит, что это генератор оболочки. Что это значит в этом контексте? Создает ли он исполняемый файл на C (который действительно предоставляет «другой» (на C) способ использования обернутого объекта (в Python), или я запутался?

79

Простое объяснение по аналогии: что такое упаковка?

Код не используется для объяснения.

Пример 1: Ipad «оборачивает» Iphone

Что делает ipad, чего не делает iphone?

Разве это не одно и то же, только у одного экран побольше?

Ipad «оборачивает» iphone: это означает, что вы получаете все преимущества iphone ВНУТРИ самого ipad, И имеете преимущества большего экрана и т. Д. Но по сути, внутри ipad находится Iphone.

Что же тогда другое? Единственное, что отличается - это внешний вид: у вас экран побольше, и, возможно, вы не можете звонить на Ipad.

Айфон - единственное, что есть внутри iPad.  Ipad буквально окутывает Iphone.  За исключением того, что вы не можете совершать звонки с Ipad, потому что возможность совершать телефонные звонки не была «раскрыта».  Apple хочет, чтобы вы покупали продукты x2, а не только один: P

То же самое и с «объектами».

............. внутри есть все то же самое, но другой внешний вид. Другая обертка.

«Обертки могут предоставлять отличные от базового объекта функции» ... хорошо, но что это значит?

Иногда обертка может ограничивать то, к чему вы можете получить доступ внутри. Например, ipad может ограничивать вашу способность совершать телефонные звонки, даже если Iphone, спрятанный внутри него, имеет такую ​​возможность.

Пример 2: Автомобиль с автоматической коробкой передач действует как обертка для автомобиля с ручным управлением

Подумайте об автомобиле с автоматической коробкой передач и о машине с ручным управлением. За кулисами, в автомобиле с автоматической коробкой передач, есть некий инженерный механизм, который автоматически переключает передачи за вас, но, по сути, под поверхностью автомобиль все еще является автомобилем с ручным управлением. Другими словами, автоматические функции автомобиля «оборачивают» ручную функциональность автомобиля. Если вы захотели вручную переключить передачи в автомобиле с автоматом - у вас просто не получится. Возможность переключения передач в автомате «не выставлена». Но это выставлено на ручной машине. Конечно, эта аналогия немного натянута, но я надеюсь, вы понимаете, к чему я клоню.

Но какова цель обертки?

Вы бы написали класс-оболочку, если хотите упростить. Вы должны создать простую в использовании «оболочку» и оставить все сложные биты внутри оболочки, гарантируя, что эти сложные биты не будут «раскрыты».

Например, у вас может быть оболочка .net, которая внизу выполняет вызовы COM. Если бы у вас не было оболочки, вам пришлось бы выполнять эти вызовы COM самостоятельно. К счастью, с оболочкой вы просто вызовете код оболочки .net, который, в свою очередь, будет выполнять эти вызовы COM. Надеюсь, это упростит вам жизнь.


8
Мне нравятся подобные объяснения при объяснении технических жаргонов. Вы знаете, что какие-то сайты специально это делают? Благодарю.
— viggy28

3
это так много смысла.
— Л. Дай

11

Просто вы пишете простой в использовании код, чтобы скрыть сложность кода. Это особенно полезно, когда вам нужно вызвать какой-нибудь низкоуровневый API из языка более высокого уровня, и вы хотите скрыть весь «уродливый» код.

Изменить: вы можете найти больше об этом в этих двух статьях вики: библиотека и функция


4

Wrapper - это код, который создается для внутреннего вызова некоторого API без изменения фактического API.

Примером этого является выпуск Facebook своего SDK C # для Facebook . SDK на самом деле является оболочкой, поскольку он позволяет вам вызывать только свою базовую платформу, не предоставляя вам конкретных методов и классов. С другой стороны, Facebook Developer Toolkit - это полный API.


Мне нужно написать программу на C #, которая создает файл сценария (язык сценариев зависит от аппаратного устройства и называется CoraScript). В CoraScript около 50 команд, например, одна, которая подключается к устройству, другая, которая отправляет файлы на это устройство, сообщает ему, что нужно запустить приложение во флэш-памяти и т. Д. Вместо того, чтобы вручную кодировать CoraScript, я бы хотелось бы создать библиотеку C #, которая будет генерировать такой сценарий. Можно ли назвать эту библиотеку C # wrapper libraryдля языка сценариев CoraScript?
— Минь Тран

Интерпретатор командной строки для этого языка сценариев - это консольное приложение. Пока это приложение работает, оно принимает команды CoraScript, выполняет их и возвращает выходные данные этой команды (например, команда Connect localhostCoraScript вернет строку, +connect,"coralib3.dll version 1,8,11"указывающую, что команда была выполнена успешно).
— Минь Тран

2

Существует множество примеров «оберток», и этот термин иногда используется как синонимы. Вот пара примеров, которые приходят на ум:

DLL-оболочка

Раньше я создавал COM-оболочку вокруг .NET DLL, чтобы использовать расширенные функции .NET в старых приложениях, которые понимают COM, но не понимают .NET.

Обертка объекта (Java)

В Java в java.langпакете есть класс для предоставления объектных методов для восьми примитивных типов. Все примитивные классы-оболочки в Java неизменяемы. Таким образом, Wrapperклассы используются для представления примитивных значений, когда Objectтребуется.



-1

Допустим, вы хотите добавить в свой код дополнительные функции, но не можете его изменить. Вот здесь и помогает обертка. Вы можете использовать оболочку для получения вывода, не изменяя исходный код.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.