Parameter und Schalter in Konsolenanwendungen
Und am siebten Tage schuf Microsoft die Konsole. – So oder so ähnlich könnte man heute auf die Vergangenheit der modernen, fensterbasierenden Programmierung zurückblicken. Vorbei die Zeit in der ominöse kleine schwarze Kommandozeilen über unsere Monitore flackerten und auf Benutzereingaben warteten.
Doch hin und wieder ertappt man sich selber, wie man wieder in gewohnte Muster zurückfällt und auf eine ansehliche Oberfläche verzichtet. Genau hier möchte ich mit dem ersten Blog-Eintrag einhaken. Wie sollte ein solches Projekt beginnen? Was ist zu beachten?
Das Erste, womit man sich beschäftigen sollte, sofern benötigt, ist die Übergabe von Parametern und Schaltern.
Bei mir ein gern genutztes Sprichwort. In den meisten Anwendungen ist es sinnvoll, dem Nutzer die Möglichkeit zu bieten, die Nutzung der Anwendung zu optimieren, indem er Parameter oder Schalter hinzufügen kann. Ich denke, jeder hat solche Konsolenanwendungen bereits gesehen.
Programm.exe -a para1 -b para2 /schalter1 /schalter2
Diese Werte sollten optimal vom Programm abgefangen werden, ohne aber zu viel Zeit darauf zu verschwenden. Ich nutze hierfür immer gerne eine kleine Parameter-Klasse. Diese besteht aus allen Variablen, die über Parameter (int, string, char, double, etc.) oder Schalter (bool) übergeben werden können. Zusätzlich enthält sie noch zwei Funktionen mit denen es möglich ist, zu überprüfen, welche Werte ein entsprechender Parameter hat oder ob ein Schalter aktiviert ist.
Die Grundfunktionen (C#):
// Parameter auswerten private string GetArgument(string ArgName) { // Alle Parameter durchlaufen for (int i = 0; i < Arguments.Length; i++) { // Wurde das Keyword gefunden, Wert zurückliefern // Hierbei wird auf den Bindestrich geprüft und ob ein Wert folgt if (Arguments[i] == "-" + ArgName && Arguments.Length >= i) { return Arguments[i + 1]; } } // Wenn nichts gefunden wurde, Leerstring zurückgeben return ""; } // Schalter auswerten private bool GetSwitch(string SwitchName) { // Alle Parameter durchlaufen foreach (string item in Arguments) { // Wurde ein Schalter gefunden, TRUE zurückgeben // Beim Schalter prüfen wir auf den Schrägstrich if (item.Contains("/" + SwitchName)) return true; } return false; }
Hiermit habe ich nun zwei Funktionen die mir, mit Übergabe der Namen der Parameter oder Schalter, die passenden Werte zurückliefern. Optimal lässt sich dies in der Parameter-Klasse im Konstruktor einbauen, so dass man direkt ein entsprechendes Objekt nutzen kann, ohne weiter auf die Funktionen zurückzugreifen.
Die gesamte Klasse (C#):
namespace MyProgramm { class ArgumentHandler { // Übergabevariablen protected static string[] Arguments; // Variablendeklaration protected string para1; protected long para2; protected int para3; protected bool switch1; protected bool switch2; // Getter & Setter public string Para1 { get { return _para1; } } public long Para2 { get { return _para2; } } public int Para3 { get { return _para3; } } public bool Switch1 { get { return _switch1; } } public bool Switch2 { get { return _switch2; } } // Konstruktor public ArgumentHandler(string[] args) { Arguments = args; // Diese liefert mir meine Main-Klasse // Variableninitialisierung _para1 = ""; _para2 = 0; _para3 = 0; _switch1 = false; _switch2 = false; } // Prüfen, ob Kernelemente gesetzt sind public bool CheckArguments() { try { _para1 = GetParameter("para1"); long.TryParse(GetParameter("para2"), out _para2); int.TryParse(GetParameter("para3"), out _para3); _switch1 = GetSwitch("switch1"); _switch2 = GetSwitch("switch2"); // Prüfen ob vorhanden if (string.IsNullOrEmpty(_para1.ToString())) { return false; } if (_para2 <= 0) { return false; } if (_para3 <= 0) { return false; } } catch { return false; } return true; } private string GetArgument(string ArgName) { for (int i = 0; i < Arguments.Length; i++) { if (Arguments[i] == "-" + ArgName && Arguments.Length >= i) { return Arguments[i + 1]; } } return ""; } private bool GetSwitch(string SwitchName) { foreach (string item in Arguments) { if (item.Contains("/" + SwitchName)) return true; } return false; } } }
Wie immer gilt: Dies ist freier Code, Ihr könnt Ihn einsetzen, wie und wo Ihr wollt!
Leave a comment
