Argument übergeben Strategie - Umwelt-Variablen vs. Kommandozeile
Meisten Anwendungen, die wir Entwickler schreiben müssen extern eingestellt, die beim Systemstart. Wir übergeben die Datei-Pfade, die Namen der pipe, TCP/IP-Adressen etc. Bisher habe ich mit Befehlszeile, übergeben Sie diese an den appplication ins Leben gerufen. Ich hatte zum Parsen der Kommandozeile in main
und die Argumente an, wo Sie gebraucht werden, das ist natürlich eine gutes design, aber ist schwer zu pflegen für eine große Anzahl von Argumenten. Vor kurzem habe ich beschlossen, die Umgebungsvariablen Mechanismus. Sie sind global und von überall aus zugänglich, die weniger elegant aus architektonischer Sicht, aber begrenzt die Menge an code, die.
Diese sind mein erstes (und möglicherweise Recht flach) Eindrücke auf beide Strategien aber ich würde gerne Meinungen zu hören von erfahrenen Entwicklern -- Was sind die ups und downs der Verwendung von Umgebungsvariablen und Kommandozeilen-Argumente übergeben werden Argumente für ein Prozess? Ich würde gerne berücksichtigen die folgenden Fragen:
- design Qualität (Flexibilität/Wartbarkeit),
- Speicher Einschränkungen,
- Lösung Portabilität.
Bemerkungen:
Ad. 1. Dies ist der wichtigste Aspekt der mich interessiert.
Ad. 2. Das ist ein bisschen pragmatisch. Ich weiß von einigen Einschränkungen unter Windows, die derzeit riesige (über 32kB für beide Kommandozeile und environment block). Ich denke, dies ist nicht ein Problem, aber, da Sie nur verwenden sollten, eine Datei zu übergeben, Tonnen von Argumenten, wenn Sie brauchen.
Ad. 3. Ich weiß fast nichts von Unix, also bin ich nicht sicher, ob beide Strategien sind als ähnlich zu bedienen wie unter Windows. Erläutern Sie dies, wenn Sie bitte.
- Würden Sie geben mehr Einzelheiten, als in der tatsächlichen Anzahl der Parameter? und wenn es Gruppierungen, um Sie oder sind Sie alle zufällig? und welche Sprache ist das? java, c++, etc... Der Grund, warum ich verlange, dass die level-of-detail ist, dass, während es könnte ein problem in jeder Sprache, es kann eine Sprache sein, die Durchführung spezifische Lösung, die Sie nicht bewusst sind.
- Nur zu schweigen von *nix-Betriebssystemen, haben Sie nichts, wie "Globale Umgebungsvariablen" und jeder env var vererbt vom übergeordneten Prozess zum untergeordneten Prozess an der Gabel auf Zeit. Also, "global" ist das nicht ein pro für die env-var über command line, zumindest für Diejenigen, die OSs.
- Hi, @jamesDrinkard. Ich bin interessiert im Allgemeinen Ansatz. Wenn Sie überholen wollte 20 verschiedene beschriftet string - /integral - /real-Zahl-Argumente aus einem Python-Skript ausgeführt wird, indem eine 32-bit-interpreter auf eine 64-bit-Anwendung in C++ geschrieben, welche Methode würden Sie verwenden?
- Hi, @shr. Danke für die *nix beachten. Raymond wies darauf hin, unten, für diese Aufgabe eine solche globalität ist nicht ein pro an alle.
- Dies könnte relevant sein und setzt Umgebungsvariablen: devcenter.heroku.com/articles/config-vars
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) ich würde empfehlen, die Vermeidung von Umwelt-Variablen, so viel wie möglich.
Profis von Umgebungsvariablen
Nachteile von Umgebungsvariablen
Meiner Meinung nach
They are global and accessible from anywhere, which is less elegant from architectural point of view, but limits the amount of code
erinnert mich an Rechtfertigungen für die Verwendung von globalen Variablen 😉Meine Narben vom erleben aus Erster hand die Schrecken des Umwelt-Variablen übernutzung
2) Grenzen
Wenn ich an die Grenzen, was der Befehl-Linie halten kann, oder was der Umwelt verarbeiten kann, würde ich umgestalten sofort.
Ich verwendet habe, JSON in der Vergangenheit für eine Befehlszeile-Anwendung, die benötigt eine Menge von Parametern. Es war sehr praktisch, um in der Lage sein zu verwenden Wörterbücher und-Listen, zusammen mit strings und zahlen. Die Anwendung dauerte nur ein paar Kommandozeilen-Argumente, von denen war die Lage der JSON-Datei.
Vorteile dieses Ansatzes
What won't fit into command line parameters?
) wie ListenHinweis: ich möchte unterscheiden diese von der .config-file-Ansatz-das ist nicht für das speichern von Benutzer-Konfiguration. Vielleicht sollte ich nennen dies den "command-line-parameter-Datei" - Ansatz, weil ich es für ein Programm, dass die Bedürfnisse, die viele Werte, die nicht passen, auch auf der Kommandozeile.
3) Lösung Portabilität: ich weiß nicht, eine ganze Menge über die Unterschiede zwischen Mac, PC und Linux mit Bezug auf Umgebungsvariablen und Kommandozeilen-Argumente, aber ich kann Ihnen sagen:
Ja, ich weiß-es war nicht sehr hilfreich. Tut mir Leid. Aber der entscheidende Punkt ist, dass Sie kann erwarten eine vernünftige Lösung, um tragbar sein, obwohl Sie würden auf jeden Fall wollen zu überprüfen, ob dies für Ihre Programme (zum Beispiel, sind command line args case sensitive auf allen Plattformen? auf allen Plattformen? Ich weiß es nicht).
Einen letzten Punkt:
Als Tomasz erwähnt, sollte es keine Rolle, zu den meisten von der Anwendung, in denen der Parameter kam.
Sollten Sie abstract: Lesen Parameter mit Strategie Muster. Erstellen Sie eine Abstraktion namens
ConfigurationSource
mitreadConfig(key) -> value
Methode (oder wieder einigeConfiguration
Objekt/Struktur) mit folgenden Implementierungen:CommandLineConfigurationSource
EnvironmentVariableConfigurationSource
WindowsFileConfigurationSource
- laden einer Konfigurationsdatei vonC:/Document and settings...
WindowsRegistryConfigurationSource
NetworkConfigrationSource
UnixFileConfigurationSource
- - laden einer Konfigurationsdatei von/home/user/...
DefaultConfigurationSource
- defaultsKönnen Sie auch Kette der Verantwortung pattern-chain-Quellen in verschiedenen Konfigurationen wie: wenn command-line-argument nicht angegeben wird, versucht die environment-variable und wenn alles andere fehlschlägt, defauls zurück.
Ad 1. Dieser Ansatz ermöglicht nicht nur das abstract Lesen Konfiguration, aber Sie können leicht ändern Sie den zugrunde liegenden Mechanismus ohne Auswirkungen auf den client-code. Sie können auch mehrere Quellen auf einmal, fällt zurück oder sammeln Konfiguration aus verschiedenen Quellen.
Ad 2. Wählen Sie einfach je nachdem, was die Umsetzung geeignet ist. Natürlich werden einige Einstellungen nicht passen beispielsweise in die Befehlszeile Argumente.
Ad 3. Wenn einige Implementierungen sind nicht tragbar, haben zwei, eins ignoriert/übersprungen, wenn nicht geeignet für ein gegebenes system.
rem
undset
. Wenn Sie laichen ein Prozess, den Sie geradesetenv
was Sie wollen, bevorspawnl
-ing. Es ist praktisch, gut lesbar und flexibel. Warum würden Sie verwenden .config anstatt die Umwelt? das ist die Frage.ACTION
und eine optionaleNOTIFY
. Programm A setztACTION=if owner=nobody set owner=bob
undNOTIFY=send
dann läuft Ihr Programm. Ihre Programm-updates ein Element, dann sieht, dassNOTIFY
eingestellt ist und läuftsend
. Diesend
Programm sendet E-Mail an Bob und führt dann das Programm erneut, EinstellungACTION=set last_send = today
. Es will keine Benachrichtigung, so ist es nichtNOTIFY
. Aber Sie geerbtNOTIFY
aus dem Programm Ein, so dass Ihre Programm-updates der letzten-laufen bis heute, und läuft dannsend
. Unendliche Schleife.Ich denke, diese Frage beantwortet sich Recht gut schon, aber ich habe das Gefühl, es verdient 2018 aktualisieren. Ich fühle mich wie eine unerwähnt profitieren von Umwelt-Variablen ist, dass Sie erfordern in der Regel weniger boiler plate code, mit zu arbeiten. Das macht für Reiniger besser lesbaren code. Allerdings ein großes disadvatnage ist, dass Sie entfernen von Schichten von Isolierung, die aus verschiedenen Anwendungen auf dem gleichen Rechner laufen. Ich denke, das ist, wo Andockfenster wirklich glänzt. Meine Lieblings-design-Muster ist, das ausschließlich Umwelt-Variablen, und führen Sie die Anwendung innerhalb eines Docker-container. Dies entfernt die Isolierung Problem.