Angenommen, Sie möchten eine neue Funktion entwickeln, sind sich jedoch nicht sicher, ob sie den Benutzern gefallen wird, und Sie müssen eine Möglichkeit haben, sie schmerzlos auszublenden. Oder nehmen Sie an, Sie arbeiten an einer neuen großen Funktion und möchten Monster-Commits vermeiden. Oder Sie möchten das Verhalten der Site einfach konfigurierbar machen. Wie kann ich all diese Probleme lösen, lesen Sie unter der Katze.
Das Problem
Stellen Sie sich vor, die Entwicklungszyklen Ihres Teams dauern zwei Wochen, und die Implementierung einer neuen Funktion erfordert 3 Monate Entwicklungszeit vom Team. Auf den ersten Blick gibt es zwei mögliche Aktionsschemata:
- Erstellen Sie einen separaten Zweig und erledigen Sie die gesamte Arbeit darin drei Monate lang. Ziehen Sie dabei regelmäßig den übergeordneten Zweig ab
- Verwenden Sie das Konzept der kontinuierlichen Integration (kurz Continuious Integration oder kurz CI ): Zerlegen Sie die Aufgabe und frieren Sie den Code in kleinen Teilen ein
Beide Ansätze haben ihre offensichtlichen Vor- und Nachteile:
Verwenden von Funktionsumschaltern zur Lösung von Problemen
Ein solches Problem tritt in der Entwicklung häufig auf, und es gibt eine elegante Lösung, mit der Sie die oben beschriebenen Ansätze optimal nutzen können -
Feature Toggle oder
Feature Switcher .
Im Wesentlichen ist ein Feature-Switcher ein boolesches Flag, das in der Datenbank gespeichert ist und Informationen darüber enthält, ob ein Feature aktiviert werden soll oder nicht. Der Wert dieses Flags kann per Schlüssel aus der Datenbank abgerufen werden. Die Verwendung von Feature-Switchern bietet den Vorteil, dass sie von einem Geschäftsbenutzer zur Laufzeit über das Admin-Panel problemlos geändert werden können, ohne dass die Anwendung erneut bereitgestellt werden muss.
Das folgende Beispiel zeigt die Verwendung des Feature-Toggle in Java:
if (configurationManager.getParameter("is.some.functionality.enabled")) {
Im obigen Beispiel ist
configurationManager eine Klasse, mit der Sie den Wert eines bestimmten Feature-Switcher anhand seines Schlüssels aus der Datenbank abrufen können.
Mithilfe von Funktionsumschaltern können Sie auch bestimmte Elemente im Frontend ein- / ausblenden. Dazu müssen Sie den Flag-Wert in Model einfügen und wie unten gezeigt an View übergeben:
@ModelAttribute("isSomeFunctionalityEnabled") public void isSomeFunctionalityEnabled() { return configurationManager.getParameter("is.some.functionality.enabled"); }
Verwenden Sie dann den übergebenen Wert, um diesen oder jenen HTML-Code zu rendern:
<c:choose> <c:when test="${isSomeFunctionalityEnabled}"> <!-- Render some stuff --> </c:when> <c:otherwise> <!-- Render some other stuff --> </c:otherwise> </c:choose>
Arten von Funktionsumschaltern
Das beschriebene Konzept der Verwendung von Funktionsumschaltern ist nur ein möglicher Anwendungsfall, und solche Funktionsumschalter werden als Freigabeschalter bezeichnet. Insgesamt werden 3 verschiedene Arten von Funktionsumschaltern unterschieden:
- Release-Schalter - Mit dieser Option können Sie unvollständig implementierte Funktionen während ihrer Entwicklung ausblenden
- Experiment kippt - Schalter für A / B-Tests
- Berechtigungsumschalter - Ein- / Ausschalter für verschiedene Benutzergruppen
Mit Feature-Switchern können Sie also zwei verschiedene Versionen der Site auf derselben Codebasis erstellen, wobei Sie unterschiedliche Datenbanken und verschiedene Sätze von Feature-Switchern verwenden. Auf einer europäischen Website ist es beispielsweise sinnvoll, alle Funktionen im Zusammenhang mit der DSGVO einzuschließen. Auf einer russischen Website ist dies jedoch nicht möglich.

Probleme beim Umschalten von Funktionen
Da ich an einem Projekt arbeite, in dem Feature-Toggles zusätzlich zu den offensichtlichen Vorteilen ihrer Verwendung aktiv verwendet werden, bemerkte ich Probleme, die damit verbunden waren:
- Testen der Komplexität : Wenn eine neue Version veröffentlicht wird, testen die QS-Ingenieure alle darin enthaltenen Funktionen und versuchen, sie mithilfe von Funktionsumschaltern ein- und auszuschalten. Dies erfordert viel zusätzliche Zeit, da es ratsam ist, alle Arten von Kombinationen von Flags zu testen
- Das Auftreten von totem Code : Die Werte vieler Feature-Toggles ändern sich über einen längeren Zeitraum nicht oder überhaupt nicht, und daher wird der für einen anderen Flag-Wert geschriebene Code tatsächlich "tot".
- Unerwartete Site-Ausfälle : Viele der veralteten Feature-Switches haben die unglückliche Eigenschaft, beim Ändern ihres Werts etwas zu beschädigen (da niemand lange überprüft hat, ob sie funktionieren). Da Feature-Switches in der Datenbank gespeichert sind und von Geschäftsbenutzern über das Admin-Panel leicht geändert werden können, kommt es häufig zu Ausfällen aufgrund einer Wertänderung. Die Leistung von lange nicht verwendeten Feature-Switchern sollte zuerst in einer Testumgebung überprüft werden
Lösungen für einige der beschriebenen Probleme
Die folgenden Aktionen können zur Lösung der oben genannten Probleme beitragen:
- Dokumentation der verfügbaren Funktionsumschalter: Um zu verstehen, welche Auswirkungen ein bestimmter Funktionsumschalter hat und nach welchem Schlüssel in der Datenbank gesucht werden muss, müssen Sie eine detaillierte Dokumentation mit einer Beschreibung aller Funktionsumschalter erstellen.
- Regelmäßige Überarbeitung von Feature-Switchern: Um das Auftreten von totem Code zu vermeiden, entfernen Sie regelmäßig veraltete Feature-Switches und den zugehörigen Code
Zusammenfassung
Feature Switcher ist ein sehr einfacher und gleichzeitig leistungsstarker Mechanismus, mit dem Sie monströse Commits vermeiden, das Anwendungsverhalten leicht ändern oder mehrere verschiedene Anwendungen auf derselben Codebasis mithilfe verschiedener Feature-Toggle-Konfigurationen zusammenstellen können.
Es ist jedoch auch zu beachten, dass dieses Entwicklungsmuster einige Nachteile aufweist, die zu schwer lesbarem und schwer zu wartendem Code führen. Daher sollte eine übermäßige Verwendung dieses Musters vermieden werden und Feature-Switches und ihre Überarbeitungen regelmäßig dokumentieren, um nicht verwendete zu entfernen, und infolgedessen Löschen Sie das Projekt aus dem "toten" Code.
Nützliche Links