Soll ich eine Konfigurationsdatei oder -datenbank zum Speichern von Geschäftsregeln verwenden?

41

Ich habe kürzlich The Pragmatic Programmer gelesen, in dem es heißt:

Details bringen unseren ursprünglichen Code durcheinander - vor allem, wenn sie sich häufig ändern. Jedes Mal, wenn wir den Code ändern müssen, um Änderungen der Geschäftslogik, des Gesetzes oder des persönlichen Geschmacks des Managements Rechnung zu tragen, laufen wir Gefahr, das System zu brechen - einen neuen Fehler einzuführen.

Hunt, Andrew; Thomas, David (20.10.1999). Der Pragmatische Programmierer: Vom Gesellen zum Meister (Kindle Locations 2651-2653). Pearson Education (USA). Kindle Edition.

Ich programmiere derzeit eine Web-App mit einigen Modellen, deren Eigenschaften nur aus einer Reihe von Werten stammen können.

Licht-> Typ = Kugel / Würfel / Zylinder

Der Lichttyp kann nur die obigen drei Werte sein, aber laut TPP sollte ich immer so codieren, als ob sie ihre Werte ändern und in eine Konfigurationsdatei stellen könnten. Da es in der gesamten App mehrere Vorfälle gibt, lautet meine Frage:

Sollte ich Werte wie diese speichern in:

  • eine Konfigurationsdatei:
    'light-types' => array(sphere, cube, cylinder),
    'other-type' => value,
    'etc' => etc-value

  • eine einzelne Tabelle in einer Datenbank mit einer Zeile für jedes Konfigurationselement

  • eine Datenbank mit einer Tabelle für jeden Konfigurationspunkt (zB Tabelle: light_types; Spalten: id, name)

  • auf andere Weise?

Vielen Dank für jede Hilfe / Expertise.

foiseworth
quelle

Antworten:

45

Die gleiche Frage stellt sich in den meisten Projekten, an denen ich arbeite. Normalerweise mache ich das:

  1. Wenn sich der Satz möglicher Werte wahrscheinlich nicht bald ändern wird, verwende ich Klassen- / Schnittstellenkonstanten oder Aufzählungen im Code und Aufzählungsfelder in der Datenbank. Beispiel: Status der Veröffentlichung von Blogeinträgen: "nicht veröffentlicht", "unter Moderation", "veröffentlicht" usw.
  2. Die Werte werden sich wahrscheinlich ändern, aber Änderungen wirken sich nicht auf die Programmlogik - Konfigurationsdateien aus. Beispiel: Liste von "Wie haben Sie unsere Website gefunden?" Optionen für eine Dropdown-Liste im Online-Kaufformular.
  3. Es ist wahrscheinlich, dass sich die Werte häufig ändern und / oder von Nicht-Entwicklern bearbeitet werden sollen. Diese Änderungen wirken sich jedoch nicht auf die Logik aus - eine Datenbank oder zumindest ein Schlüsselwertspeicher mit einer benutzerfreundlichen Oberfläche zum Bearbeiten.
  4. Das Ändern der Werte wirkt sich auf die Logik aus. Möglicherweise muss das System neu entworfen werden (häufig ist dies der Fall), oder es ist eine Geschäftsregelengine erforderlich. Der schwierigste Fall, den ich bisher gesehen habe, war der psychologische Testkonstrukteur, an dem mein Kollege gearbeitet hat. Jede Art von Test kann ein eigenes Bewertungssystem haben, das von der einfachen Hinzufügung mehrerer Merkmalsskalen mit positiven und negativen Werten bis hin zur menschlichen Bewertung von Antworten variieren kann. Nach einigen Diskussionen über dieses Projekt haben wir schließlich Lua als Skript-Engine verwendet, was der Fähigkeit von Nicht-Entwicklern, neue Tests zu erstellen, völlig widerspricht (obwohl Lua eine relativ einfache Sprache ist, sollten Sie nicht erwarten, dass ein Nicht-Programmierer werde es lernen).

Über das Zitat von TPP. Ich denke, es ist wahr für unberührten Code, aber im wirklichen Leben sollten Sie einfach anfangen ( KISS-Prinzip ) und später Funktionen hinzufügen, wenn sie wirklich benötigt werden ( YAGNI ).

scriptin
quelle
7

Wenn sich Ihre Daten in einer Datenbank befinden, würde ich empfehlen, eine Tabelle mit 'light_types' in derselben Datenbank zu haben. Auf diese Weise können Sie Fremdschlüssel verwenden, um eine Einschränkung zu erzwingen, dass light-> type nur einer dieser Werte sein kann. Selbst wenn der Code fehlerhaft ist, sind die Daten in der Datenbank immer gültig.

Wenn die Daten nicht in einer Datenbank gespeichert werden, hilft es nicht viel, eine Datenbank nur für eine Reihe von Aufzählungen zu erstellen. Ich kann eine Konfigurationsdatei empfehlen, wenn Sie wirklich vermeiden möchten, die Werte hart zu codieren.

(Ich warne Sie jedoch davor, bei der Vermeidung von Hardcodierung zu weit zu gehen. In jedem nicht trivialen System wird es Annahmen über Geschäftsregeln und -anforderungen geben, unabhängig davon, ob die Autoren dies erkennen oder nicht. Selbst wenn Sie es irgendwie schaffen, alles zu vermeiden.) Annahmen und Soft-Code absolut alles, Sie enden im Grunde nur mit einer "Regel-Engine", einer Art System innerhalb eines Systems und / oder einer Metasprache, und Sie haben eine Menge Sachen in der Metasprache zu erledigen Sie haben keine Arbeit gespeichert oder an Flexibilität gewonnen, Sie mussten lediglich eine andere Sprache erstellen und / oder lernen.

Wenn Sie nun ein vorhandenes Regelmodul suchen und verwenden möchten , können Sie sich ein wenig Arbeit sparen (zusammen mit der Beantwortung der Frage, wo die Aufzählungen gespeichert werden sollen). Aber wenn Sie Ihr eigenes System erstellen, verdoppelt sich die Arbeitslast und Sie erhalten unweigerlich ein halbherziges System, das von Leuten erstellt wurde, die wirklich nicht wissen, wie man eine anständige Regel-Engine erstellt.)

cHao
quelle
0

Im Allgemeinen sollte eine Datenbank für Daten und eine Konfigurationsdatei für die Konfiguration verwendet werden. (wie der Name schon sagt :)). Das Beibehalten der Konfiguration in der Datenbank ist eine schlechte Trennung von Bedenken und sollte nur durchgeführt werden, wenn Sie einen guten Anwendungsfall haben, um dies zu rechtfertigen.

Es muss ein Gleichgewicht gefunden werden, wenn entschieden wird, wie viel Konfiguration verwendet werden soll. Sie sollten Ihre Konfigurationsdateien genauso wie den Code als Teil einer Anwendung behandeln. Halten Sie es so knapp wie möglich. Es ist sehr einfach für Anwendungen, die unter einer aufgeblähten Konfiguration leiden, bei der Sie eine riesige XML-Datei voller magischer Zeichenfolgen erhalten.

In dem von Ihnen beschriebenen Fall wäre es sinnvoll, ein Konfigurationselement zu haben, um die zu verwendende CSS-Datei zu definieren. (Sie können es dann einfach ändern, wenn sich die Anforderungen ändern). Es wäre übertrieben, den Stil jedes Elements in der Konfigurationsdatei zu konfigurieren

Tom Squires
quelle
1
Wie definieren Sie, was Konfiguration und was Daten sind?
Nafg
3
Ihre Antwort erklärt nicht, warum das Speichern einer Konfiguration in einer Datenbank gegen die Trennung von Anliegen verstößt (das Anliegen einer Datenbank ist das Speichern von Daten; es ist egal, welche Daten Sie dort speichern), oder warum dies eine schlechte Sache ist und Ihre Die Antwort wird jetzt an anderer Stelle als Beweis dafür angeführt , dass es eine schlechte Sache ist.
Robert Harvey
Datenbanken können sich bei Bedarf ändern. Wir können sie asynchron wie MySQL haben. Unterstützt statische Dateien dies? AUF KEINEN FALL! Also habe ich abgelehnt :)
AmirHossein
@AmirHossein Statische Dateien unterstützen Änderungen bei Bedarf, solange sie nicht gesperrt sind. Das ist kein Argument.
Zimano