2017-03-20 7 views
1

Gibt es Konventionen für die Benennung von Java-Paketen, die Klassen enthalten, die eine externe, versionierte API verwenden?Java-Paketnamen für die Versionierung externer APIs

Nehmen wir an, wir haben ein semantisches Versionshauptschema einer Dienstleistung und wir müssen einen Verbraucher implementieren, der mit einer bestimmten Version dieser API kompatibel und an diese gebunden ist. Was sind die besten Praktiken, um die Pakete (und Klassen) zu benennen?

Derzeit verwenden wir das Schema: ${service}_${M}_${N} (mit M = Hauptversion, N = Nebenversion). Zum Beispiel: com.example.theService_1_0.. Aber Sonarqube beschwert sich, dass es Konventionen nicht entspricht. Natürlich kann ich diese Regel einfach deaktivieren, aber ich frage mich, ob es Best Practices gibt?

Ich bin auf der Suche nach einem allgemeinen Ansatz, der nicht nur REST-spezifisch ist, weil ich Consumer-Implementierungen für WebService, REST und CORBA getroffen habe. Und ich bin nicht sicher, Artefakt-Versionierung (wie in Maven) funktioniert hier gut, da es sich auf die Version der Implementierung und nicht die API bezieht.

Ich weiß, es gibt Fragen um api versioning, aber das sind über den Hersteller, nicht der Verbraucher.

+0

Bedeutet dies nicht potenziell unnötigen Code neu schreibt. Jedes Mal, wenn der Hersteller die Version ändert, müssen Sie den Paketnamen und alle Importanweisungen in allen Klassen mit diesen Klassen ändern. – 7663233

+0

Ich habe in einigen Projekten (in der Finanzindustrie) gesehen, dass sie einfach Seite an Seite gehalten werden (mit den Kosten für doppelten Code), und Verbraucher getrennt halten, also ändert sich zu einer Verbraucherversion impl nicht einen anderen impl. Wenn eine neue Version auftaucht (was eine Frage von Jahren ist), beginnen sie damit, vorhandenen Code zu duplizieren. Es ist im Grunde ein Shared-Nothing-Ansatz. Es ist sicherlich eine pragmatische Praxis, aber ich frage mich, ob es (bessere?) Alternativen gibt? –

+0

Ich würde keine Pakete nach einer Ziel-API-Version benennen. Ihr Projekt sollte eine Abhängigkeit zu einer bestimmten API-Version deklarieren, und Sie würden Ihr Projekt einfach mit seiner eigenen Versionsnummer versionieren, jedes Mal wenn Sie eine andere API-Version als Ziel haben möchten (zB wenn Sie die Abhängigkeitsversion ändern). Beispiel: myproject Version 1.1 .8 verwendet theapi Version 2.3.0, myProject Version 1.2.0 verwendet theapi Version 2.4.6. – Berger

Antwort

1

Ja, Java-Paketnamen haben eine starke und mehrdeutige Konvention für die Angabe von Abhängigkeiten Versionen: nicht.

Wenn Sie Ihre Anwendung ändern, um eine neue Version einer externen API zu verwenden, erstellen Sie eine neue Version Ihrer Anwendung. Die Versionsnummer, nach der Sie suchen, ist die Versionsnummer Ihrer Anwendung. Bei vielen Java-Projekten werden die Versionen der Abhängigkeiten von einer Maven-Konfigurationsdatei verwaltet.

In jedem Fall, wenn Klassen eine bestimmte API-Version verwenden, haben die Klassen- und Paketnamen keinen Einfluss auf diese Informationen, was die Kapselung verletzen würde, abgesehen von allem anderen. Diese Namen haben einen anderen Zweck.

Beachten Sie, dass dies bei der Verwendung von HTTP/REST-APIs oder Java-APIs nicht anders ist. Schließlich glaube ich nicht, dass Sie Ihre Klasse TheServiceWithLog4J_12_1_5 nennen würden. Ich hoffe zumindest nicht.

Sie haben nicht erwähnt, ob Sie mehrere Versionen dieser externen API gleichzeitig unterstützen müssen. Selbst wenn Sie dies tun würden, würde ich dennoch nicht empfehlen, die API-Versionsnummer im Paketnamen anzugeben. Verwenden Sie stattdessen den Paketnamen, um anzugeben, warum Sie haben zwei Versionen und der wichtige Unterschied.