Припустимо, у вас є великий проект, підтримуваний базою API. Проект також постачає публічний API, який можуть використовувати кінцеві користувачі.
Іноді потрібно внести зміни до бази API, яка підтримує ваш проект. Наприклад, вам потрібно додати функцію, яка потребує зміни API, новий метод або потребує зміни одного з об'єктів або формату одного з цих об'єктів, переданого в API або з нього.
Якщо припустити, що ви також використовуєте ці об’єкти у своєму загальнодоступному API, публічні об’єкти також змінюватимуться щоразу, коли ви це зробите, що небажано, оскільки ваші клієнти можуть покластися на те, що об’єкти API залишаються ідентичними для їхнього коду розбору. (кашель С ++ клієнтів WSDL ...)
Отже, одне потенційне рішення - це версія API. Але коли ми кажемо API "версія", це здається, що це також повинно означати версію об'єктів API, а також надання дублюючих викликів методів для кожної зміненої підпису методу. Тож у мене тоді з'явиться звичайний старий об’єкт clr для кожної версії мого api, що знову здається небажаним. І навіть якщо я це роблю, я, безумовно, не буду будувати кожен об'єкт з нуля, оскільки це в кінцевому підсумку має велику кількість дублюваного коду. Швидше за все, API, швидше за все, поширить приватні об'єкти, які ми використовуємо для базового API, але тоді ми зіткнемося з тією ж проблемою, оскільки додані властивості також будуть доступні в загальнодоступному API, коли вони не повинні бути.
Отже, яка певна розумність, яка зазвичай застосовується в цій ситуації? Я знаю, що багато публічних служб, таких як Git for Windows, підтримує API, що працює на версії, але у мене виникають проблеми уявити архітектуру, яка підтримує це без великої кількості дублікатів коду, що покриває різні способи та об'єкти введення / виведення.
Мені відомо, що такі процеси, як семантична версія, намагаються поставити певний розум, коли має відбуватися розрив публічного API. Проблема полягає в тому, що здається, що багато або більшість змін вимагають зламати відкритий API, якщо об'єкти не розділені більше, але я не бачу хорошого способу зробити це без дублювання коду.
I don't see a good way to do that without duplicating code
- Ваш новий API завжди може викликати методи у вашому старому API, або навпаки.