Angenommen, Sie haben ein großes Projekt, das von einer API-Basis unterstützt wird. Das Projekt liefert auch eine öffentliche API, die Endbenutzer verwenden können.
Manchmal müssen Sie Änderungen an der API-Basis vornehmen, die Ihr Projekt unterstützt. Beispielsweise müssen Sie eine Funktion hinzufügen, die eine API-Änderung oder eine neue Methode erfordert oder die Änderung eines der Objekte oder des Formats eines dieser Objekte erfordert, die an oder von der API übergeben werden.
Angenommen, Sie verwenden diese Objekte auch in Ihrer öffentlichen API, ändern sich die öffentlichen Objekte auch jedes Mal, wenn Sie dies tun. Dies ist unerwünscht, da Ihre Clients möglicherweise darauf angewiesen sind, dass die API-Objekte identisch bleiben, damit ihr Parsing-Code funktioniert. (Husten C ++ WSDL-Clients ...)
Eine mögliche Lösung besteht darin, die API zu versionieren. Wenn wir jedoch "Version" der API sagen, muss dies auch bedeuten, dass die API-Objekte versioniert und für jede geänderte Methodensignatur doppelte Methodenaufrufe bereitgestellt werden. Also hätte ich dann für jede Version meiner API ein einfaches altes clr-Objekt, was wiederum unerwünscht erscheint. Und selbst wenn ich das mache, werde ich sicherlich nicht jedes Objekt von Grund auf neu erstellen, da dies zu riesigen Mengen an dupliziertem Code führen würde. Vielmehr wird die API wahrscheinlich die privaten Objekte erweitern, die wir für unsere Basis-API verwenden, aber dann stoßen wir auf dasselbe Problem, da hinzugefügte Eigenschaften auch in der öffentlichen API verfügbar wären, wenn dies nicht der Fall sein sollte.
Was ist also eine Vernunft, die normalerweise auf diese Situation angewendet wird? Ich weiß, dass viele öffentliche Dienste wie Git für Windows eine versionierte API verwalten, aber ich habe Probleme, mir eine Architektur vorzustellen, die dies unterstützt, ohne große Mengen an doppeltem Code, der die verschiedenen versionierten Methoden und Eingabe- / Ausgabeobjekte abdeckt.
Mir ist bewusst, dass Prozesse wie die semantische Versionierung versuchen, ein gewisses Maß an Sicherheit zu schaffen, wenn öffentliche API-Unterbrechungen auftreten sollten. Das Problem ist eher, dass es so scheint, als ob viele oder die meisten Änderungen das Brechen der öffentlichen API erfordern, wenn die Objekte nicht stärker voneinander getrennt sind, aber ich sehe keinen guten Weg, dies zu tun, ohne Code zu duplizieren.
I don't see a good way to do that without duplicating code
- Ihre neue API kann immer Methoden in Ihrer alten API aufrufen oder umgekehrt.