Java: автоматический способ инкапсуляции библиотеки - PullRequest
1 голос
/ 07 октября 2011

У меня есть следующий сценарий: я использую очень большую внешнюю библиотеку в своем приложении Eclipse RCP для определенной цели.

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

Есть ли простой способ инкапсулировать целую библиотеку каким-либо автоматическим способом?

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Если только часть интерфейса библиотеки, которую вы на самом деле используете, не является полностью тривиальной или стандартизированной, как в JSF или JAX-B (в этом случае вам не нужна инкапсуляция), это совершенно напрасная трата усилий.

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

0 голосов
/ 07 октября 2011

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

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

Представьте, что замена будет предоставлять разные методы и даже использовать другую семантику (в некоторой степени). Что, если при замене отсутствовали методы / поля и т. Д.

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

Пример :

Для 3D-программирования вы можете использовать OpenGL или Direct3D. Оба имеют несколько разные API, но используют одни и те же основные понятия. Таким образом, вы можете создать оболочку для них, которая предоставляет унифицированный API. Эта обертка может затем преобразовать некоторые данные и т. Д. (Например, сделать ориентированные на столбцы матрицы ориентированными на строки и наоборот), но поскольку основные концепции одинаковы, это должно быть выполнимо.

Однако вам необходимо придерживаться основных концепций и не использовать дополнительные функции. Например, Direct3D также предоставит еще более высокий уровень API (Direct3DX), который не предоставляется OpenGL.

...