Werden externe Konfigurationsdateien als Antimuster betrachtet?

8

Ich war oft in einer Situation, in der eine Anwendung anscheinend defekt ist, nur um festzustellen, dass eine externe Konfigurationsdatei fehlerhaft war. Dies liegt normalerweise daran, dass die falsche Datei vorhanden ist oder falsche Daten enthält.

Gibt es eine bessere Möglichkeit, einem externen Benutzer / Prozess zu ermöglichen, die Laufzeitmerkmale einer Anwendung zu ändern, oder ist dies die bekannteste Lösung für das Problem?

Ich würde gerne eine Diskussion über den allgemeinen Fall sehen, anstatt mich beispielsweise auf Unix /etc oder Java JNDI usw. zu konzentrieren.

Gary Rowe
quelle
2
Wie können Sie sonst test / dev / live / verschiedene Live-Umgebungen konfigurieren? Mein Punkt ist die einzige Option - es wird immer eine externe Abhängigkeit geben.
NimChimpsky
5
Was auch immer Sie haben, wird extern sein. Das Problem, das Sie haben, ist nicht, dass die Konfiguration extern ist, sondern dass sie schlecht verwaltet und verstanden wird.
Oded
2
Aber das ist die Sache - Konfigurationsdateien werden in der Regel schlecht verwaltet oder verstanden.
Telastyn
4
Was die "falsche Datei" betrifft, gibt es eine nette Unixish-Technik: Verwenden Sie einen Skript-Wrapper, um Ihre Binärdatei zu starten, und legen Sie alle Konfigurationsumgebungsvariablen lokal fest. Auf diese Weise ist immer klar, welche Konfiguration Sie aufgenommen haben.
SK-Logik
1
Die "Alternative" besteht darin, dass 99% der Konfigurationsparameter optional sind. Es sollte sinnvolle Standardwerte geben. Wenn die Konfiguration eine eigene dedizierte Datei benötigt und länger als der ausführbare Code wird, bedeutet dies, dass die Konfigurierbarkeit über die Nützlichkeit hinausgeht. Stellen Sie sich vor, Sie müssten 35 Parameter angeben, bevor Sie ausgeführt werden können curl.
Sridhar Sarnobat

Antworten:

13

Die meisten Anwendungen erfordern eine externe Konfiguration. Sie können dies ausblenden, indem Sie es von magischen Variablen abhängig machen oder an einem internen Ort speichern. Dadurch wird die Notwendigkeit jedoch nicht beseitigt. Ziel ist es zu erkennen, was extern sein soll und was intern sein kann. Es können nur die Innenteile geprüft werden.

Eine Anwendung sollte nicht darauf vertrauen, dass eine externe Konfigurationsdatei korrekt ist. Es sollte die Richtigkeit überprüfen und Fehler melden. Wenn die Anwendung die Konfigurationsdatei nicht überprüfen kann, machen Sie wahrscheinlich zu viel damit. Wenn die Konfigurationsdatei das Verhalten der Anwendung ändert, sollte sie meiner Meinung nach nicht extern sein.

Beispielsweise kann ein Datenbankbenutzername / -kennwort von der Anwendung leicht überprüft werden, indem versucht wird, eine Verbindung zur Datenbank herzustellen. Wenn dies fehlschlägt, kann es dies melden, und es ist offensichtlich kein Fehler im Anwendungscode. Ebenso können für einen Dateipfad die Existenz- und Zugriffsrechte überprüft werden.

Wenn Sie nun SQL-Abfragen in die Konfigurationsdatei einfügen, kann die Anwendung die Richtigkeit dieser Abfragen nicht einfach überprüfen. Gleiches gilt für eine vollständige Abhängigkeitsinjektionsspezifikationsdatei (a la Java-Spring XML). Diese sollten sich nicht in externen Konfigurationsdateien befinden.

Aber wenn die angegebene Konfiguration etwas Externes beschreibt und Sie schnell die Richtigkeit überprüfen können, glaube ich nicht, dass mit externen Konfigurationsdateien etwas nicht stimmt.

Bearbeiten: Stellen Sie außerdem sicher, dass in Ihren Fehlerberichten angegeben ist, welche Konfigurationsdatei verwendet wird. Nichts ist frustrierender, als herauszufinden, dass Sie nach stundenlangem Versuch, herauszufinden, was daran falsch ist, die falsche Datei angesehen haben.

Jaap
quelle
4
+1 für die interne Validierungsempfehlung - definitiv ein Muss, um das Muster zu vervollständigen
Gary Rowe
6

Ich würde sie eher als "bekanntes Problembereich" als als Antimuster klassifizieren. Sofern Sie keine feste Konfiguration bereitstellen möchten, müssen Sie die Konfigurationsinformationen irgendwo speichern . Normalerweise möchte ich die meisten meiner Konfigurationsinformationen in der Datenbank speichern, aber Sie müssen die Datenbankverbindungsinformationen immer noch irgendwo speichern. Ich bevorzuge den Java / Spring-Ansatz, die Konfigurationsinformationen in der Anwendungsstruktur selbst zu speichern, anstatt (sagen wir) im Home-Verzeichnis des Benutzers oder in der Windows-Registrierung, aber das ist nur eine persönliche Präferenz.

TMN
quelle
5

Externe Konfigurationsdateien sind KEIN Anti-Pattern. Wie alles andere können sie je nach System gut oder schlecht eingesetzt werden.

Sie scheinen auf einige Apps gestoßen zu sein, bei denen die externe Konfiguration die App beschädigen kann, ohne dem Benutzer mitzuteilen, was los ist. Das ist schlecht, aber es liegt nicht an den Konfigurationsdateien, sondern daran, wer entschieden hat, welche Teile in den Konfigurationsdateien und welche Teile in der App enthalten sind und wie mit Fehlern umgegangen werden soll.

Michael Kohne
quelle
4

Meiner Meinung nach: NEIN , externe Konfigurationsdateien sind kein Antimuster.

Es ist nur eine Technik, ein architektonisches Muster, um die Komplexität der Software zu verwalten.

Im Zeitalter der SOLID-Entwurfsprinzipien haben Sie die Softwarekomplexität von Monolithic_application auf unabhängigere Module verlagert , die zusammengesteckt werden müssen.

Die Alternative zu "externen Konfigurationsdateien" wäre die direkte Konfiguration von Modulen per Code.

k3b
quelle
Muster sind nicht auf Code beschränkt - eine externe Konfigurationsdatei ist eher ein Architekturmuster als nur eine Technik.
Gary Rowe
4

Wenn überhaupt, wird das Verschieben der Konfiguration von der Logik zu den Daten bevorzugt. Sie können die Anwendung flexibler gestalten, ohne Ihren Code überarbeiten zu müssen. Fehlende Datendateien sind eher ein Fall von zu wenig Dokumentation oder schlampiger Arbeit bei der Installation als eine schlechte Praxis in Bezug auf die Codierung IMHO.

Onno
quelle
Ich stimme zu, dass deklarative Aussagen eine direktere und leichter verständliche Methode zur Angabe von Eigenschaften und (in gewissem Umfang) Verhalten sind. +1.
William Payne
3

Lassen Sie Ihr Lieblings-SCM-Tool als CM-Tool doppelte Aufgaben ausführen: Legen Sie Ihre Konfigurationsdateien im Repository ab. Um die Konfiguration zu ändern, übernehmen Sie die Änderungen und lassen Sie sie von Ihren automatisierten Bereitstellungstools in die Produktion übertragen (natürlich nach einer Reihe automatisierter Tests!).

Et Voila! Sie haben eine Aufzeichnung aller Konfigurationsänderungen sowie das zusätzliche Sicherheitsnetz eines automatisierten CI / Test-Systems!

Wie bereits erwähnt, beschränken sich Architektur- und Designmuster nicht nur auf das Produktsystem selbst, sondern erstrecken sich auch auf das Team / den Prozess / die Systeme, die bei der Erstellung helfen.

William Payne
quelle
1
+1 für eine nützliche Implementierungsstrategie - so wie Heroku es mit GitHub-Projekten macht.
Gary Rowe
Sie müssen sicherstellen, dass sich Ihre Konfigurationen nicht im selben Repo wie Ihr Code befinden, da sich dies auf die Verzweigung und Kennzeichnung von Releases auswirkt.
Dietbuddha
1
Ich stimme dir nicht zu. Die Konfigurationen sollten sich wirklich im selben Repo wie der Code befinden. Ich glaube, dass eine Produktionsänderung an einer Konfigurationsdatei ein gültiger Grund ist, ein Commit für (zum Beispiel) einen Svn-Tag-Zweig vorzunehmen. Der Hauptvorteil besteht darin, dass Sie an einem Ort (dem Repository) nachsehen können, um alles (so viel wie möglich) zu sehen, was die Produktion beeinträchtigen könnte. Es ist viel einfacher, Gremlins und Käfer zu jagen, wenn Sie wissen, wo Sie alles finden. (Besonders wenn Sie etwas wie Graphite verwenden, um Commits gegen Leistungsmetriken und Warnungen aufzuzeichnen)
William Payne