Как стать автором
Обновить

Комментарии 18

А нельзя просто ввести версионность у компонента? Тогда при новом релизе вашей системы/приложения вы прост используете необходимую версию компонента и нет необходимости ничего модифицировать, если речь не идёт о закрытии уязвимостей и т.п.

Можно. Если в принципе не предполагается, что понадобится новая версия компонента (и так все устраивает в текущей), то можно «заморозить» версию, внести нужные изменения и больше не обновлять.
Используйте изолирующий слой и другие техники для удаления зависимости разрабатываемого ПО от изменений используемых компонентов и от проприетарных интерфейсов.

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

Недавний пример из мира Java: Jersey 1.x содержит внутри себя JAX-RS 1.0 классы, которые конфликтуют с JAX-RS 2.0 классами из других библиотек. Как тут не пиши изолирующий слой, если оно все внутри одного процесса запущено, конфликта не избежать.
Ну, можно попытаться загружать их в разных загрузчиках классов…
Понятно, что решение можно придумать. Но это как раз-таки и будет завязка на вендора :) Т.к. в следующей версии, к примеру, будет использоваться свой загрузчик, не совместимый с костыльным.
Ну, надо делать такой загрузчик, чтобы он не отличался от системного, вот и все…
Скажу честно, рассматривали такой подход, уже не помню, почему так не сделали.
Возможно, было проще перепаковать библиотеку и отправить pull request (в итоге они все же пофиксили это).
Например, можно использовать паттерн Стратегия, который будет выдавать реализацию посредника исходя из версии используемой сторонней библиотеки. Конкретный посредник будет учитывать баги и особенности конкретной версии сторонней библиотеки.
Некоторые вещи не решаются только на уровне языка, к сожалению. Иногда необходимо вносить изменения в исходный код (в случае багов) или же, к примеру, перепаковывать библиотеку.

Но, думаю, в статье больше велась речь про непосредственное использование Vendor API из приложения.
Тут я полностью согласен про изолирующие слои.
Это антипаттерн, только когда люди подписываются на подобное, не понимая стоимости сопровождения. Иметь несколько патчей на апстрим, которые форвард-портятся по мере выхода новых версий — совершенно нормальная практика, если она осознаётся как требующая периодического внимания.

Весьма часто патчи тривиальны, и если у кода хорошее покрытие тестами форвард-порт патчей занимает разумное время и даёт разумную уверенность в устойчивости и работоспособности решения.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Видел разные переводы и решил использовать самый нейтральный, но изначальное словосочетание изменить не мог.
В последнее время я для себя решил эту проблему банально через пулл реквесты авторам, если меня что-то не устраивает в коде их проекта. Даже если режектнут — я свой форк всегда могу держать в живом состоянии.
Тот же jersey принимал мой pull request год :) Потом все равно отказали, мотивируя тем, что «мы уже сами все сделали» :)
Ну главное все это время вы могли пользоваться форком и у вас не болела голова, что какие-то изменения пройдут незамеченными.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории