Schlechte Praxis - Fall auf Umgebung einstellen


32

In den letzten drei Jahren, in denen ich als Entwickler gearbeitet habe, habe ich viele Beispiele gesehen, in denen Benutzer eine switch-Anweisung verwenden, um den Pfad (sowohl im Back-End als auch im Front-End) für eine URL festzulegen. Unten ist ein Beispiel dafür:

Backend-Beispiel (C #):

public static string getHost(EnvironmentEnum environment){
    var path = String.Empty;
    switch (environment)
    {
        case EnvironmentEnum.dev:
            path = "http://localhost:55793/";
            break;
        case EnvironmentEnum.uat:
            path = "http://dev.yourpath.com/";
            break;
        case EnvironmentEnum.production:
            path = "http://yourpath.com/";
            break;
    }
    return path;
}

Frontend-Beispiel (JavaScript):

(function () {
    if (window.location.host.indexOf("localhost") !== -1) {
        window.serviceUrl = "http://localhost:57939/";
    }
    else if (window.location.host.indexOf("qa") !== -1) {
        window.serviceUrl = "http://dev.yourpath.com/";
    }
    else {
        window.serviceUrl = "http://yourpath.com/";
    }
})();

Es wurde diskutiert, ob es sich um eine gute oder eine schlechte Praxis handelt, und ich denke, es ist eine schlechte Praxis, weil wir diese Art von Code vermeiden und eine richtige Konfiguration festlegen müssen. Aber um ehrlich zu sein, weiß ich wirklich nicht die richtige Antwort und warum wird es nicht empfohlen und was ist der richtige Weg, dies umzusetzen.

Kann jemand das Für und Wider der obigen Praxis erklären?


13
Diese Linie alleine ist nicht optimal. path = " yourpath.com "; Die Konfiguration sollte außerhalb des Codes erfolgen.
Paparazzo

2
Aus der Perspektive der reinen Codeüberprüfung Dictionaryist a eine viel sauberere Methode, dies in C # zu codieren. Siehe ideone.com/45g5xO . Oder verwenden Sie in JS ein gutes altes Objekt, siehe jsfiddle.net/1ouhovqq .
Danny Beckett

4
Was passiert, wenn sich Ihr Firmenname in etwas ändert, das "qa" enthält?
user253751

Denken Sie daran, dass eine Konfigurationsdatei, die Sie verwenden, in der Quellcodeverwaltung gesteuert werden muss. Wenn Sie neue Testcomputer einrichten, müssen Sie die Konfigurationsdatei möglicherweise mehrmals täglich bearbeiten. Ich denke immer noch, dass eine Konfigurationsdatei am besten ist, aber vielleicht möchten Sie zuerst nach einer Datei mit dem Namen based Environment suchen, bevor Sie sich die Detaul-Konfigurationsdatei ansehen.
Ian

1
Ich denke nicht, dass Sie die Dinge als schlechte Praxis bezeichnen sollten, wenn Sie nicht quantifizieren können, warum Sie denken, dass es eine schlechte Praxis ist
Roy

Antworten:


81

Code, der für Sie funktioniert und einfach zu warten ist, ist per Definition "gut". Sie sollten niemals Dinge ändern, nur um der Idee einer "guten Praxis" zu gehorchen, wenn diese Person nicht auf das Problem mit Ihrem Code hinweisen kann.

In diesem Fall besteht das offensichtlichste Problem darin, dass Ressourcen in Ihrer Anwendung fest codiert sind - auch wenn sie dynamisch ausgewählt wurden, sind sie immer noch fest codiert. Dies bedeutet, dass Sie diese Ressourcen nicht ändern können, ohne Ihre Anwendung neu zu kompilieren / erneut bereitzustellen. Mit einer externen Konfigurationsdatei müssten Sie nur diese Datei ändern und Ihre Anwendung neu starten / laden.

Ob das ein Problem ist oder nicht, hängt davon ab, was Sie damit machen. In einem JavaScript-Framework, das ohnehin bei jeder Anfrage automatisch neu verteilt wird, ist dies kein Problem - der geänderte Wert wird bei der nächsten Verwendung der Anwendung an alle Benutzer weitergegeben. Bei einer lokalen Bereitstellung in einer kompilierten Sprache an einem unzugänglichen Ort ist dies in der Tat ein sehr großes Problem. Das erneute Installieren der Anwendung kann viel Zeit in Anspruch nehmen, viel Geld kosten oder nachts durchgeführt werden, um die Verfügbarkeit zu gewährleisten.

Ob hartcodierte Werte ein Problem darstellen oder nicht, hängt davon ab, ob Ihre Situation eher dem ersten oder dem zweiten Beispiel entspricht.


15
Ich liebe deinen ersten Absatz. Sicher, Sie folgen dem mit dem Hinweis auf die Probleme, aber der Gedanke, dass "das ist schlecht, weil Blog XYZ das gesagt hat", ist die Ursache für mehr schlechten Code, als es tatsächlich verhindert.
corsiKa

5
Anfängern sollten erprobte Prinzipien gegeben werden, nach denen sie leben können, und nicht nur "wenn es für Sie funktioniert, dann ist es OK" -Relativismus. Ich glaube, ich bin nicht falsch zu behaupten, dass das Festcodieren von Umgebungswerten unter allen Umständen eine schlechte Praxis ist.
Tulains Córdova

3
@ jpmc26: Sie gehen natürlich davon aus, dass die Bereitstellung von serverseitigem Code nicht trivial ist und dass es einen separaten Prozess gibt, mit dem Konfigurationswerte mit weniger Aufwand aktualisiert werden können. Beides ist nicht unbedingt wahr. Viele Geschäfte haben sehr wenig Aufwand bei ihren Bereitstellungsprozessen. Auf der anderen Seite gibt es tatsächlich einige Shops, in denen Konfigurationsänderungen im Grunde genauso viel Aufwand verursachen wie das Bereitstellen von geändertem Code. (Validierung, Genehmigung durch eine ganze Reihe von Personen usw. erforderlich). Die Bedenken hinsichtlich der Vervielfältigung sind jedoch definitiv gültig.
Kevin Cathcart

2
Wenn die Umgebungseinstellungen mit Ihrem Anwendungscode gemischt sind, liegt ein logischer Fehler vor - oder eine unerwartete Änderung in der Ausführungsumgebung -, wenn Sie nicht den Test von der Produktion oder den Test von der Produktion oder eine andere unerwartete und möglicherweise katastrophale Kombination treffen. Das Pflegen von umgebungsspezifischen Eigenschaften, die vom Code in C # getrennt sind, ist im Allgemeinen trivial. Warum ein unnötiges Risiko eingehen?
John M Gant

1
@ user61852 "Ich glaube, ich bin nicht falsch zu behaupten, dass das Festcodieren von Umgebungswerten unter allen Lichtverhältnissen ausgesprochen schlechte Praxis ist." Parsen auf "Umgebungswerte hart zu codieren ist immer eine schlechte Praxis" Wenn dies immer eine schlechte Praxis ist, sollte es immer möglich sein, mindestens ein Problem zu identifizieren, das durch Umgebungswerte hart zu codieren verursacht wird.
Emory

14

Sie haben absolut Recht, wenn Sie denken, dass dies eine schlechte Praxis ist. Ich habe das im Produktionscode gesehen und es kommt immer wieder, um dich zu beißen.

Was passiert, wenn Sie eine weitere Umgebung hinzufügen möchten? Oder ändern Sie Ihren Entwicklungsserver? Oder müssen Sie an einen anderen Ort wechseln? Dies ist nicht möglich, da Ihre Konfiguration direkt an Code gebunden ist.

Die Konfiguration sollte aus dem Code heraus und in die Umgebung selbst gezwungen werden. Es ist ein Prinzip einer Zwölf-Faktoren-App ( http://12factor.net/config ), aber es ist eine gute Praxis für jede Anwendung. Möglicherweise stellen Sie fest, dass Umgebungsvariablen für Ihre Situation nicht geeignet sind. In diesem Fall würde ich empfehlen, diese Konfiguration in einer Datenbank mit Konfigurationsdateien zusammen mit Code (der jedoch nicht mit Code eingecheckt wurde) zu speichern.


Wenn Sie die Konfigurationsdatei nicht verfolgen, woher wissen Sie, ob die Konfigurationsdatei, über die Sie verfügen, für die Version der Software gültig ist, die Sie gerade aus Ihrem VCS ausgecheckt haben? (dh eine nicht protokollierte Konfigurationsdatei unterscheidet sich nicht von einer nicht
protokollierten Quelldatei.

Ich bin nicht anderer Meinung, dass eine nicht verfolgte Konfigurationsdatei eine schwierige Angelegenheit ist. Die Art und Weise, wie ich zuvor damit umgegangen bin, ist zweifach: Erstens enthält die zu implementierende Binärdatei auch ein XML-Schema, in dem die Konfiguration definiert ist (damit Sie überprüfen können, ob eine bestimmte Konfigurationsdatei funktioniert). Zweitens wurden die Konfigurationsdateien für jede Umgebung in einem Dokumentensteuerungssystem mit unterschiedlichen Ordnern für jede Umgebung gespeichert. Ähnliches könnte in Git mit Verzweigungen geschehen - versionskontrolliert, aber von Code ohne Umgebung abgegrenzt.
mgw854

5

Zum einen ist dies (wie andere bereits erwähnt haben) eine schlechte Idee, da Sie Implementierungsdetails in Ihren Code einbinden. Dies macht es schwierig, Dinge zu ändern.

Wie in dieser Antwort erwähnt , müssen Sie, wenn Sie jetzt eine neue Umgebung hinzufügen möchten, Ihren Code überall aktualisieren , anstatt Ihr Programm nur einer neuen Umgebung hinzuzufügen.

Es gibt einen weiteren schwerwiegenden Fehler bei der Ausführung in Ihrem Javascript-Code: Sie setzen die Interna Ihres Unternehmens potenziellen Angreifern aus. Sicher, Sie befinden sich möglicherweise hinter einer Firewall, haben jedoch möglicherweise einen verärgerten Mitarbeiter oder jemanden, der einen Virus hereinlässt.

Schlechte Nachrichtenbären.

Das Beste, was Sie tun können, ist, Ihre Konfiguration über die Umgebung festzulegen (wie in der zuvor verknüpften Antwort, hat die Zwölf-Faktoren-App gute Tipps zu diesem Thema). Es gibt verschiedene Möglichkeiten, dies abhängig von Ihrer Sprache zu tun. Eine der einfachsten ist (normalerweise), Umgebungsvariablen festzulegen. Dann ändern Sie einfach die Variablen, je nachdem, wo Sie ausgeführt werden - ob es sich um eine lokale Entwicklungsbox, eine QA-Datei oder eine Produktionsdatei handelt. Eine andere Option ist das Speichern der Werte in einer .iniDatei oder JSON. Eine weitere Alternative wäre, Ihre Konfigurationswerte als tatsächlichen Code zu speichern. Je nachdem, welche Sprache oder Umgebung Sie verwenden, ist dies möglicherweise eine gute oder keine gute Idee.

Das ultimative Ziel ist es jedoch, dass Sie eine Codebasis verwenden, diese auf jedem Computer ablegen , der über die unterstützte Architektur / Konnektivität verfügt, und sie ausführen können, ohne den Code in irgendeiner Weise zu ändern.


1

Was ist, wenn ich das Backend auf meinem eigenen Computer ausführen möchte, aber nicht auf Port 55793, z. B. wenn ich mehrere Versionen gleichzeitig ausgeführt habe, um sie zu vergleichen? Was ist, wenn ich das Anwendungs-Backend auf einem Computer ausführen, aber von einem anderen aus darauf zugreifen möchte? Was ist, wenn ich eine vierte Umgebung hinzufügen möchte? Wie bereits erwähnt, müssen Sie die Kompilierung erneut durchführen, um die Grundkonfiguration zu ändern.

Der Ansatz, den Sie beschrieben haben, hat sich bisher in der Praxis für Ihr Team bewährt, ist aber sinnlos einschränkend. Ein Konfigurationssystem, mit dem Parameter wie dieser Pfad in einer zentralen Konfigurationsdatei willkürlich festgelegt werden können, ist weitaus flexibler als ein System, das nur feste Optionen bereitstellt. Welchen Vorteil bietet der Ansatz mit switch-Anweisungen? Keiner!


0

Es ist eine schlechte Praxis .

Ein Grundprinzip des Software-Designs: Codieren Sie Konfigurationswerte nicht in Ihren Programmen. Dies gilt insbesondere für alles, was eine vernünftige Chance hat, sich in Zukunft zu ändern.

Der von Ihnen entwickelte Programmcode sollte mit dem Code identisch sein, der in Umgebungen wie QS-Tests, UATs und Produktionsumgebungen verwendet wird. Wenn jemand die Konfiguration später ändern muss, weil sich die Umgebung geändert hat, oder wenn er sie in einer neuen Umgebung verwenden muss, ist das in Ordnung. Sie sollten jedoch niemals Ihren Programmcode berühren müssen, um dies zu tun. Und Sie sollten nicht für jede Umgebung unterschiedliche Codeversionen haben. Wenn sich Ihr Programm seit dem Testen geändert hat, haben Sie diese Version nicht getestet. Fragen Sie einen Software-Ingenieur, einen Fachmann für Software-Qualitätssicherung, einen Fachmann für IT-Projektmanagement oder einen IT-Auditor.

Jemand könnte das Testen auf einen anderen Server verschieben. Jemand könnte entscheiden, ob er auch eine Anwenderschulungsumgebung oder eine Umgebung für Verkaufsvorführungen haben möchte. Sie sollten nicht zur administrativen Konfiguration zu einem Programmierer gehen müssen.

Software sollte flexibel und robust genug sein, um unerwartete Situationen innerhalb angemessener Grenzen zu bewältigen.

Darüber hinaus sollte Software nicht einfach geschrieben werden, aber im Moment erscheint es Ihnen am einfachsten. Die Kosten für die Softwareentwicklung sind im Vergleich zu den Kosten für die Softwarewartung über die gesamte Lebensdauer gering. Sagen wir, in einem Jahr könnten Sie nicht derjenige sein, der an diesem Code arbeitet. Sie sollten darüber nachdenken, was Sie für den nächsten armen Dummkopf hinterlassen, der alles aufheben muss, was Sie hinterlassen haben, vielleicht Jahre nachdem Sie auf grünere Weiden gegangen sind. Oder Sie sind derjenige, der den Code Jahre später aufgreift und nicht glaubt, was Sie damals getan haben.

Codieren Sie die Dinge richtig, so gut Sie können. Es ist weniger wahrscheinlich, dass es später zu einem Problem wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.