Unter dieser neuen Kategorie möchte ich in Zukunft regelmäßig einige Fragen aufzeigen die im Alltag eines Programmierers, oder zumindest bei mir, öfters auftauchen. Es geht um Kontrukte, bei denen man sich manchmal nicht sicher ist wie es nun in der Praxis “richtig” geschrieben wird. Ich habe mich im letzten halben Jahr sehr oft gefragt welche schreibweise verschiedener Konstrukte wohl am üblichsten ist, was am besten lesbar ist, welches Naming wohl am verständlichsten ist, oder sogar welche Konstrukte möglicherweise Fehleranfällig sind.
In diesem ersten Beitrag zum Thema “Do’s and Don’ts” möchte ich direkt auf ein Szenario stoßen, welches ich gestern in dem Blog von Coding Horror gefunden habe. Es geht um die weitverbreitete Implementierung der CompareTo() Methode (wichtig z.B. bei Sortierungen). Einige Leute wollen besonders viel aus ihrer Optimierung herausholen und versuchen beispielsweise folgenden Ansatz …
DON’T !
public int CompareTo( int valueA, int valueB )
{
return valueA - valueB
}
Auf den ersten Blick macht das ganze vielleicht Sinn, denn sollten beide wirklich gleich groß sein wird 0 zurückgegeben und ansonsten halt ein Wert der entweder >0 oder <0 ist. Gar nicht mal so schlecht denn man spart sich ein paar If Konstrukte innerhalb der Methode. Stellt euch jedoch einmal vor man würde die Methode folgendermaßen aufrufen :
CompareTo( int.maxValue, int.minValue );
Die Folge wäre das man folgende Rechnung hätte : int.maxValue – int.minValue (welcher negativ ist und somit addiert werden würde)
also : 2147483647 – (-2147483648) = 4294967295 -> 0xFFFFFFFF
Dieser Wert entspricht in der Komplementdarstellung jedoch dem Wert -1 (anstatt 1 wie man es erwarten würde). Mehr dazu könnt ihr auch nochmal bei Coding Horror nachlesen.
Stattdessen :
DO !
public int CompareTo( int valueA, int valueB )
{
if ( valueA > valueB )
{
return 1;
}
else if ( valueA < valueB )
{
return -1;
}
else
{
return 0;
}
}
Oder wenn ihr es doch etwas kompakter und geringfügig schneller haben wollte geht auch die Kurzschreibweise :
public int CompareTo( int valueA, int valueB )
{
return ( valueA > valueB ) ? 1 : ( valueA < valueB ) ? -1 : 0;
}
Deutsch
Englisch


Salute Michael
Ich wäre ja nie auf die Idee gekommen, das so zu implementieren
.
In der Dokumentation gibt es ja eine Referenzimplementation.
Gruss Peter
Hallo Peter
Ja ich weiß, ich bin auch nie auf die Idee gekommen, das so zu implementieren, jedoch scheint es ein paar Köpfe zu geben die glauben sie seien schlauer
. Oder halt eben auch nicht
Aber es geht bei dem Beispiel ja auch eher ums allgemeine Verständnis