some random thoughts

Tag: 13. Februar 2013

Strings verknüpfen und verbinden

Anbei ein paar simple BestPractices zum verknüpfen und verbinden. Mit Sicherheit weder vollständig noch alternativlos, aber ein kleiner Einblick.

Das erste größer Programmier-Projekt steht an, und plötzlich funktionieren lieb gewonnene Vorgehensweisen nicht mehr.
Ein gern gemachter Fehler, der in Foren gern publikumswirksam zerrissen aber nicht erklärt wird, ist die Stringverknüpfung.

Ich möchte 2 Vorgehensweisen einmal ein wenig genauer vorstellen, die bei den ersten Schritten aber auch später immer noch sehr hilfreich sind.

String.format()

Häufig findet man sogar in Einsteiger-Tutorials Beispiele folgender Art:

String string1 = "Hallo";
String string2 = "Welt";
String ergebnis = string1 + " " + string2;

Das ist natürlich syntaktisch völlig richtig, wird aber bei größeren Aufgaben schnell unleserlich, und fehlerträchtig.
Viel besser kann hier die String-Format()-Methode verwendet werden, die es sowohl in Java als auch in der .NET-Welt gibt.

C#:
String ergebnis = String.Format("{0} {1}", string1, string2);
Java:
String ergebnis = String.Format("{%s %s", string1, string2);

In diesem simplen Beispiel mag das eher komplizierter aussehen, schon bei etwas größeren Aufgaben hat man einen imensen Gewinn an Überisicht. Vor allem weil die Funktion automatisch jeweils die toString()-Methode des entsprechenden Objekts verwendet.
So wird aus:

String ausgabe = "Hallo " + user.anrede.toString() + " " + user.nachname + ", sie waren zu letzt angemeldet am " + user.lastLoginTime.toString() + ";

ein entspanntes, und leicht zu lesendes:

String ausgabe = String.Format("Hallo {0} {1} , sie waren zu letzt angemeldet am {2}", user.anrede, user.nachname, user.lastLoginTime);

StringBuilder

Schneller ist der StringBuilder auch noch

 

Eine extrem wichtige, von Anfängern aber gern ignorierte Klasse ist der StringBuilder, des es ebenfalls in Java als auch in .NET gibt. Er sammelt Strings, und andere „strintgbare“ Daten und die vor allen Dingen sehr speichereffizient.
Angenommen wir haben einen längeren Text, den wir in unserem Programm benötigen. Diesen schreiben wir der Übersicht halber untereinander. Anfängern wählen dann gern folgende Methode:

String kinderlied = "Hänsel und Gretel verliefen sich im Wald.";
kinderlied += "Es war so finster und auch so bitter kalt.";
kinderlied += "Sie kamen an ein Häuschen von Pfefferkuchen fein.";
[...]
kinderlied += "Die Hexe musste braten, die Kinder geh´n nach Haus.";
kinderlied += "Nun ist das Märchen von Hans und Gretel aus.";

Das funktioniert natürlich, hat aber einen entscheidenden Nachteil.
Bei jeder Verknüpfung wird intern ein neuer String im Speicher abgelegt. Für das obige Beispiel heisst das:

Im ersten Schritt ist ein String im Speicher:
„Hänsel und Gretel verliefen sich im Wald.“

Im zweiten Schritt bereits 2:
„Hänsel und Gretel verliefen sich im Wald.“
„Hänsel und Gretel verliefen sich im Wald.Es war so finster und auch so bitter kalt.“

usw.
Das mag bei diesem Kinderlied mit seinen paar Zeilen kein Problem sein, wird aber zu einem Problem, sobald z.B. eine Datei eingelesen wird, und deren mehrere hundert Zeilen in einem String benötigt werden.
Die bessere Alternative ist hier der StringBuilder, dieser belegt den Speicher nur mit den entsprechenden Daten, und wäre folgendermaßen zu verwenden:

StringBuilder kinderliedStringBuilder = new StringBuilder();
kinderliedStringBuilder.append("Hänsel und Gretel verliefen sich im Wald.");
kinderliedStringBuilder.append("Es war so finster und auch so bitter kalt.");
kinderliedStringBuilder.append("Sie kamen an ein Häuschen von Pfefferkuchen fein.");
[...]

Falls man daraus wieder einen String machen möchte, erhält man diesen einfach per .toString-Methode.

Gedanken über Fleisch

Es ist nun fast 10 Jahre her, dass ich vegetarisch gelebt habe. Das war Überzeugung, und die Erkenntnis, dass aufgrund eigener Bequemlichkeit keine anderen Lebewesen Qualen oder Misshandlung erleiden sollten. Nach etwa 2 Jahren stellte sich bei mir eine innere Unzufriedenheit ein, ich war zermürbt von den immer wiederkehrenden blöden Sprüchen von Bekannten und Kollegen, und hatte schlichtweg keine Lust mehr dieses Dogma mit mir herum zu tragen. Gibt es doch im Leben schon genug unfreiwillige Regeln an die es sich zu halten gilt.

Ich begann also wieder Fleisch zu essen, und ehrlich gesagt war es damals eine Erleichterung. Ich genoss in Folge die Situationen, in welchen man einfach „mitmachen“ konnte; Mit den Kollegen nen Burger essen, nach der Party nen Döner und bei Feiern nicht bei jedem Gericht nach den Zutaten fragen. Die vorher häufig unangenehmen Situationen waren einfach weg, aber das schlechte Gewissen nur verdrängt.

In den letzten Jahren war die eigene Beruhigung dann besonders einfach. Bei uns zu Hause gibt es eigentlich nie Fleisch, und wenn dann alle paar Wochen mal ein wenig Wurst aus Bio-Haltung. Welch eine wunderbare Grundlage um sein Gewissen rein zu halten, sind doch sämtliche Außer-Haus-Fleischgerichte lediglich Ausnahmen, und die Gesamtbilanz immer noch deutlich besser als die des durchschnittlichen nicht-vegetarischen Konsumenten. Nur macht das die Sache nicht besser, und den Konsum definitiv nicht bewusster.

Echt lecker (Bild: vegway.de)

Ich werde nicht wieder zum Vegetarier werden, und ein Veganer wird wohl in diesem Leben auch nicht mehr aus mir, auch wenn die Argumente für eine solche Lebensweise nicht abstreitbar sind (aus ethischen, ökologischen und gesundheitlichen Gründen), wohl aber meinen Konsum genauer überdenken.

Vollständig verzichten werde ich nicht, und den Anspruch will ich auch gar nicht (wieder) an mich selbst anlegen. Die selbst aufgezogenen Hähnchens eines Freundes werde ich sicherlich nicht ablehnen, und ein gutes Stück Wild auch nicht. Und auch bei Tante Ernas 80. Geburtstag, ist doch der einzige Effekt den man erzielt, dass Tante Erna todtraurig ist dass dem Jungen das Essen nicht „schmeckt“. Und wahrscheinlich gibt es noch etliche anderen Situationen dieser Art, und um die soll es nicht gehen.

Das 1€-Frikadellenbrötchen an der Fleischtheke im Supermarkt muss nun wirklich nicht sein, und auch den Döner kann man galant gegen eine Falafel austauschen. Den Burger gibt’s inzwischen auch ohne Fleisch aber mit Geschmack, und sogar bei Grillgut eine wirklich tolle Auswahl (was vor 10 Jahren definitiv noch nicht so war). Aus Pizza mit Salami wird eine Funghi, und aus Pommes-Currywust die doppelte Pommes Schranke.

Was will ich eigentlich damit sagen? Ich weiß es selbst nicht genau, wahrscheinlich will ich nur mich selbst an gute Vorsätze erinnern, den Gedanken festhalten und vor allem beim nächsten Hamburger kritische Nachfragen provozieren. Jetzt schon mal vielen Dank dafür.