Montag, 16. Mai 2011

Die intern-Methode der String-Klasse

Die Klasse java.lang.String besitzt eine intern-Methode, um an die String-Referenz zu gelangen, die für den String-Wert im Java-Cache abgelegt wurde. Das ist nützlich, wenn ein String durch new erzeugt, oder mittels StringBuilder zusammengefügt wurde. Dann nämlich ist der String nicht aus dem Javainternen-Cache abrufbar. Das hat zur Folge, dass zum Beispiel bei der Verwendung von equals der tatsächliche Inhalt der Zeichenketten verglichen werden muss, was unperformanter ist, als der einfache Referenzvergleich, der sonst als erstes von der equals-Methode ausgeführt wird. Zur Verdeutlichung: das folgende Beispiel ergibt false

"foo" == new StringBuilder().append("f").append("oo").toString()

Dieses hier hingegen ist true

"foo" == new StringBuilder().append("f").append("oo").toString().intern()

Wird ein neu gebauter String später häufig verglichen, so kann es sich lohnen die intern-Methode zu verwenden, um unnötige operationen beim Stringvergleich zu vermeiden.

Interessant ist übrigens, dass das Java-Framework selbst ebenfalls davon gebrauch macht, um den Vergleich mit equals gleich ganz zu vermeiden. In der Klasse java.lang.Class findet sich zum Beispiel folgende Methode, die aber nur deshalb sicher funktioniert, weil die getName-Methode der Klasse java.lang.Field garantiert, immer einen interned-String zurückzugeben.

// Helpers for fetchers of one field, method, or constructor
    private Field searchFields(Field[] fields, String name) {
        String internedName = name.intern();
        for (int i = 0; i < fields.length; i++) {
            if (fields[i].getName() == internedName) {
                return getReflectionFactory().copyField(fields[i]);
            }
        }
        return null;
    }

*Update 19.5.11*
Links: mindprod, enicholas

Montag, 9. Mai 2011

Auskommentierter Code

Auskommentierter Code ist absolut nichts seltenes. Aber wie oft ist er eigentlich noch nützlich? Vor allem, wenn es Code ist, den man nicht selbst per Kommentarzeichen aufs Altenteil geschickt hat. Als ich als Entwickler anfing, sagte mir mal ein erfahrenerer Kollege, auskommentierter Code sei so eine Art Code-Dokumentation und würde für sich selbst stehen. Ich konnte damit nie viel anfangen und weiß heute, dass das quatsch ist. Der Auskommentierte Code sagt nämlich kaum etwas aus, sondern stört viel mehr den Lesefluss. In den meisten Fällen weiß ich nämlich nicht einmal, warum der Code auskommentiert wurde. War er defekt? Unperformant? Hat er Seiteneffekte Produziert? Wurde er vielleicht zum Testen auskommentiert und sollte später wieder rein? Das könnte natürlich auch dazugeschrieben werden, was mir aber in den seltensten Fällen untergekommen ist. Ich stehe mitlerweilen auf dem Stand, dass das Versionierungssystem viel besser für Altcode geeignet ist als Kommantarloser Kommentarcode. Im Versionierungssystem lässt sich das alte Codefragment in seinem originalen Lebensraum begutachten, was viel mehr Aussagekraft besitzt, als etwas loses.

Das schönste sind aber Stellen, die für Verwirrung sorgen. In einem Projekt habe ich eine Codestelle, an der seit 2007 steht: TODO: Das muss noch ausprogrammiert werden. Das ist natürlich ein Hinweis, mit dem kein Mensch mehr etwas anfangen kann. Scheinbar hat sich an der bestehenden Funktionalität keiner mehr gestört.

Ebenfalls häufig anzutreffen sind auskommentierte stellen wie alert("hier") oder System.out.println("message +" " + id"). Das sind dann Überreste, die beim Debugging gebraucht wurden und schlicht vergessen wurden, wobei "vergessen" gut gemeint ist. Ich habe schon Code gehabt, wo ich ein Minnimum von mindestens zwei auskommentierten Debugg-Meldungen pro Methode hatte. Das stört dann sehr beim Lesen und ich kann dem auch nichts praktisches mehr abgewinnen.

Zum Glück nicht ganz so häufig, aber leider auch nicht selten, sind die Verquickungen von Auskommentierten und funktionalem Code. Da habe ich gerade ein aktuelles Beispiel vor mir. Ich nehme an, so etwas entsteht, wenn man mal eben etwas ausprobieren will. Ob die Kommentarzeichen nur vergessen wurden oder das return an dieser Stelle einfach falsch gewesen ist, lässt sich leider nicht mehr so einfach herausfinden.

    else if (document.multiBox.id != formDiv.id){
    //  return;
    }

Samstag, 7. Mai 2011

Python Lesestoff

Lesestoff für Python Einsteiger. Die Python Special Edition 1 vom Full Circle Magazine ist eine Zusammenfassung der Serie „Programming in Python“ der Ausgaben 35 bis 42.

via menzer.net

Swing-Bibliothek Japura

In letzter Zeit habe ich mal wieder ein bisschen was mit Swing gemacht. Dafür wollte ich eine Multiselect-ComboBox-Komponente, die ich in dem noch jungen Swing-Framework Japura (LGPL) gefunden habe. Auch nach ein bisschen Herumprobieren gefällt mir Japura gut. Einiges an Features hat noch platz, dafür sind die Komponenten nicht überfrachtet und eigene Änderungen sind ebenfalls schnell eingepflegt. Einzig die Dokumentation beschränkt sich auf einige Beispiele auf der Webseite während die Code-Dokumentation gegen null tendiert. Neben verschiedenen Komponenten, bringt Japura auch ein paar nützliche Klassen, zum Beispiel für Controller/View-Aufbauten oder für Hintergrundprozesse mit.

Donnerstag, 5. Mai 2011

Einstieg in die Arbeit mit regulären Ausdrücken

Wenn man jemandem die Arbeit mit regulären Ausdrücken näher bringen oder erklären möchte, gibt es da die ganz klassische Klick-Lernschwelle - also jene Lernschwelle an der man es plötzlich verstanden hat, es also Klick gemacht hat. Dazu ist es nützlich als erstes zu verstehen, wie die Ausdrücke funktionieren. Dazu habe ich kürzlich etwas gefunden, was zum Spielen einlädt und bei dem gleich praktische Beispiele produziert werden können. Nämlich den regular expression generator txt2r. Der erzeugt zwar ein Perl-Script, aber das soll nicht weiter stören. Der reguläre Ausdruck lässt sich ohne weiteres daraus zusammensetzen.

Wenn dann genügend zusammengeklickt wurde, sollten die Ausdrücke verfeinert werden. Dafür ist zum einen eine Übersicht sehr nützlich, wie sie in der Java-Klassendokumentation vorliegt, als auch ein Editor, der einem zeigt, welcher Teil der Zeichenkette bei Veränderungen des Ausdrucks noch passt und welcher nicht. Da hat mir der Online-Editor RegExr sehr gute gefallen. Die zuvor mit txt2r zusammengeklickten Ausdrücke können hier nämlich 1a erweitert und verändert werden.

Mittwoch, 4. Mai 2011

Linktips

Software-Kanban im Einsatz: Ein handliche Einführung in Kanban für den Einsatz in der Softwareentwicklung.
Addition mit Grazie: Magische Quadrate in der Mathematik. Wozu der Mensch das braucht erschließt sich wahrscheinlich nur Mathematikern, aber interessant ist es trotzdem.
Softwaremetriken: Zyklomatische Komplexität: Die McCabe-Metrik in verständlicher Kürze. Absolut Lesenswert!