1) Ich würde empfehlen, Umgebungsvariablen so weit wie möglich zu vermeiden.
Vorteile von Umgebungsvariablen
- einfach zu bedienen, da sie von überall sichtbar sind. Wenn viele unabhängige Programme Informationen benötigen, ist dieser Ansatz wesentlich praktischer.
Nachteile von Umgebungsvariablen
- schwer richtig zu verwenden, da sie von überall sichtbar (löschbar, einstellbar) sind. Wenn ich ein neues Programm installiere, das auf Umgebungsvariablen basiert, werden diese dann auf meine vorhandenen stampfen? Habe ich versehentlich meine Umgebungsvariablen vermasselt, als ich gestern herumgespielt habe?
Meine Meinung
- Verwenden Sie Befehlszeilenargumente für diejenigen Argumente, die bei jedem einzelnen Aufruf des Programms am wahrscheinlichsten unterschiedlich sind (dh n für ein Programm, das n berechnet!).
- Verwenden Sie Konfigurationsdateien für Argumente, die ein Benutzer möglicherweise vernünftigerweise ändern möchte, jedoch nicht sehr häufig (dh Anzeigegröße, wenn das Fenster angezeigt wird).
- Verwenden Sie Umgebungsvariablen sparsam - vorzugsweise nur für Argumente, von denen erwartet wird, dass sie sich nicht ändern (dh die Position des Python-Interpreters).
- Ihr Punkt
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 globaler Variablen;)
Meine Narben, weil ich die Schrecken der Überbeanspruchung durch Umgebungsvariablen aus erster Hand erlebt habe
- Zwei Programme, die wir bei der Arbeit benötigen und die aufgrund von Umweltkonflikten nicht gleichzeitig auf demselben Computer ausgeführt werden können
- Mehrere Versionen von Programmen mit demselben Namen, aber unterschiedlichen Fehlern - brachten einen ganzen Workshop stundenlang in die Knie, weil der Speicherort des Programms aus der Umgebung entfernt wurde und (lautlos, subtil) falsch war.
2) Grenzen
Wenn ich die Grenzen dessen verschieben würde, was die Befehlszeile enthalten kann oder was die Umgebung verarbeiten kann, würde ich sofort umgestalten.
Ich habe JSON in der Vergangenheit für eine Befehlszeilenanwendung verwendet, die viele Parameter benötigte. Es war sehr praktisch, Wörterbücher und Listen zusammen mit Zeichenfolgen und Zahlen verwenden zu können. Die Anwendung benötigte nur einige Befehlszeilenargumente, von denen eines der Speicherort der JSON-Datei war.
Vorteile dieses Ansatzes
- Es musste nicht viel (schmerzhafter) Code geschrieben werden, um mit einer CLI-Bibliothek zu interagieren. Es kann schwierig sein, viele der gängigen Bibliotheken dazu zu bringen, komplizierte Einschränkungen durchzusetzen (mit "kompliziert" meine ich komplexer als das Suchen nach a spezifischer Schlüssel oder Wechsel zwischen einem Schlüsselsatz)
- Sie müssen sich nicht um die Anforderungen der CLI-Bibliotheken für die Reihenfolge der Argumente kümmern - verwenden Sie einfach ein JSON-Objekt!
- einfach, komplizierte Daten (Antworten
What won't fit into command line parameters?
) wie Listen darzustellen
- Einfache Verwendung der Daten aus anderen Anwendungen - sowohl zum Erstellen als auch zum programmgesteuerten Parsen
- einfach, zukünftige Erweiterungen unterzubringen
Hinweis : Ich möchte dies vom Ansatz der .config-Datei unterscheiden - dies dient nicht zum Speichern der Benutzerkonfiguration. Vielleicht sollte ich dies den Ansatz der 'Befehlszeilen-Parameterdatei' nennen, weil ich ihn für ein Programm verwende, das viele Werte benötigt, die nicht gut in die Befehlszeile passen.
3) Portabilität der Lösung: Ich weiß nicht viel über die Unterschiede zwischen Mac, PC und Linux in Bezug auf Umgebungsvariablen und Befehlszeilenargumente, aber ich kann Ihnen sagen:
- Alle drei unterstützen Umgebungsvariablen
- Sie alle unterstützen Befehlszeilenargumente
Ja, ich weiß - es war nicht sehr hilfreich. Es tut mir Leid. Der entscheidende Punkt ist jedoch, dass Sie erwarten können, dass eine vernünftige Lösung portabel ist, obwohl Sie dies auf jeden Fall für Ihre Programme überprüfen möchten (z. B. wird bei Befehlszeilenargumenten auf allen Plattformen zwischen Groß- und Kleinschreibung unterschieden - auf allen Plattformen - ich weiß es nicht ).
Ein letzter Punkt:
Wie Tomasz erwähnte, sollte es für die meisten Anwendungen, aus denen die Parameter stammen, keine Rolle spielen.