Feature Flags sind ein Engineering-Gerät, mit dem sich langlebige Verzweigungen und Konflikte bei der Produktentwicklung vermeiden lassen. Auf diese Weise kann der Kontext einer objektorientierten Sprache verwendet werden, um Entwicklern bei der Zusammenarbeit an einem bestimmten Produktmerkmal zu helfen, während eine neue Version bearbeitet wird. Diese Lösung kann auch in nicht objektorientierten Kontexten verwendet werden, sofern der Begriff „Schnittstelle“ existiert. ( Siehe OCaml-Modulsystem.)
Zur Veranschaulichung wird von einem Tool ausgegangen, das Berichte über in einer Datenbank gespeicherte Daten präsentiert. Der Code implementiert eine DatabaseClient- Klasse, die zum Ausführen von Anforderungen verwendet wird. Mit dem Anwachsen des Datasets wird deutlich, dass ein alternatives Datenlayout die Anwendungsleistung verbessern würde. Daher wird Alice eine neue Version des DatabaseClient entwickeln, mit der Daten aus den Strukturen mit verbessertem Layout abgerufen werden können, während Bob den historischen DatabaseClient verwaltet .
Mit den folgenden Schritten können Alice und Bob an kurzlebigen Zweigen zusammenarbeiten und gleichzeitig ihre Konflikte minimieren.
Alice benennt DatabaseClient in DatabaseClient_v1 um und erstellt eine Delegatklasse mit dem Namen DatabaseClient , die ein Objekt DatabaseClient_v1 verwendet und eine Schnittstelle mit dem Namen DatabaseClientInterface implementiert . (Wenn möglich, sollte dieses DatabaseClientInterface ein Code-Artefakt sein, aber Sprachen, die vom Typ Ente stammen, unterstützen dies nicht immer.)
Bob überprüft die von Alice in 1 vorgenommenen Änderungen und ist sich bewusst, dass sein Wartungsauftrag auf DatabaseClient_v1 erfolgen sollte .
Alice führt ein neues Konfigurationsflag in der Anwendung ein, das das Verhalten des DatabaseClient- Delegaten steuert und einen DatabaseClient_v2- Platzhalter implementiert, eine Klasse, die das DatabaseClientInterface implementiert, dessen Methoden alle eine Ausnahme "Nicht implementiert" auslösen.
Danach können Alice und Bob ohne explizite Synchronisation zusammenarbeiten, da der in ihren jeweiligen Iterationen geschriebene Code dem DatabaseClientInterface unterliegt . Dies minimiert das Risiko eines Konflikts, der sich aus ihrer gleichzeitigen Arbeit ergibt.
Iterationen von Alice können sehr kurz sein, z. B. das Implementieren eines Tests, das Implementieren einer Methode oder auch nur teilweise, da der Code in der Produktion nicht für die Verwendung ausgewählt ist und nicht voll funktionsfähig sein muss. Die automatisierte Testsuite sollte so konfiguriert sein, dass DatabaseClientInterface immer DatabaseClient_v1 verwendet, während Alice beim lokalen Ausführen der Testsuite - oder in einem benutzerdefinierten CI-Setup - problemlos zu DatabaseClient_v2 wechseln kann. Sobald alles fertig ist, kann eine einzelne Festschreibung die Änderung durchführen, indem der Konfigurationswert für den DatabaseClient- Delegaten aktualisiert wird .
Michael Le Barbier Grünewald
quelle