Предположим, у вас есть большой проект, поддерживаемый базой API. Проект также предоставляет публичный API, который могут использовать конечные пользователи.
Иногда вам нужно внести изменения в базу API, которая поддерживает ваш проект. Например, вам нужно добавить функцию, которая требует изменения API, нового метода или требует изменения одного из объектов или формата одного из этих объектов, передаваемых в или из API.
Предполагая, что вы также используете эти объекты в вашем общедоступном API, публичные объекты также будут меняться каждый раз, когда вы делаете это, что нежелательно, поскольку ваши клиенты могут полагаться на объекты API, оставшиеся идентичными, чтобы их код синтаксического анализа работал. (кашляют C ++ WSDL клиенты ...)
Поэтому одним из возможных решений является версия API. Но когда мы говорим «версия» API, это звучит так, как будто это также должно означать версию объектов API, а также предоставление дублирующих вызовов методов для каждой измененной сигнатуры метода. Таким образом, я бы тогда имел простой старый объект clr для каждой версии моего API, что опять-таки кажется нежелательным. И даже если я сделаю это, я, конечно, не буду создавать каждый объект с нуля, так как это приведет к огромному количеству дублированного кода. Скорее API может расширять частные объекты, которые мы используем для нашего базового API, но затем мы сталкиваемся с той же проблемой, потому что добавленные свойства также будут доступны в общедоступном API, когда они не должны быть.
Так какое здравомыслие обычно применяется в этой ситуации? Я знаю, что многие публичные сервисы, такие как Git для Windows, поддерживают версионный API, но мне сложно представить архитектуру, которая поддерживает это без огромного количества дублирующегося кода, охватывающего различные версионные методы и объекты ввода / вывода.
Мне известно, что такие процессы, как семантическое управление версиями, пытаются придать здравый смысл, когда должны произойти разрывы публичного API. Проблема в том, что многие или большинство изменений требуют нарушения открытого API, если объекты не разделены более, но я не вижу хорошего способа сделать это без дублирования кода.
I don't see a good way to do that without duplicating code- Ваш новый API всегда может вызывать методы в вашем старом API или наоборот.