Archiv für die Kategorie ‘Quälkot’

Innere Werte

Mittwoch, 01. September 2010

Folgende kleine und gruselige “extension method” für C# habe ich aufgetan.

    public static Exception GetInnermost(this Exception ex)
    {
        Exception ActualInnerEx = ex;
        while (ActualInnerEx != null)
        {
            ActualInnerEx = ActualInnerEx.InnerException;
            if (ActualInnerEx != null)
                ex = ActualInnerEx;
        }
        return ex;
    }

Diese Methode soll die innerste Exception einer abgefangenen Exception ermitteln. Hier sieht man mal wieder wie umständlich etwas im Grunde sehr einfaches umgesetzt werden kann.

Übung: Wie könnte man diese Methode besser und schöner gestalten?

(weiterlesen…)

Sequenzialisierte Schleife

Freitag, 23. April 2010

Wie wäre es damit?

for( int i = 1 ; i <= 3 ; i++)
{
    if(i==1) {...}
    else  if(i==2) {...}
    else if(i==3) {...}
    else {...}
}

Sowas kann man sich wirklich nicht selbst ausdenken :)

Solange Du Deine Füße unter meinen Tisch stellst…

Montag, 06. Juli 2009

…bzw. solange Du Dich von mir ableitest, machst Du was ich sage!

Ich finde, dies ist mal wieder ein wunderschönes Beispiel dafür, wie Objektorientierung nicht funktioniert! Gefunden von meinem Kollegen in freier Wildbahn (Namen wurden von der Redaktion geändert :) )

Image-37

If und If gesellt sich gern

Mittwoch, 09. April 2008

Heute ist mir bei einem Code-Review wieder ein kleines Schmankerl unter die Augen gekommen.
Wie immer reduziere ich es auf das Wesentliche…

Der Aufbau war wie folgt:

if( A )
{
    a;
}
if( !A )
{
    b;
}
else
{
    c;
}

Als kleine Denksportaufgabe, könnte Ihr euch ja mal RatzFatz überlegen, wie das wohl einfacher geht… Und wenn Ihr eine Idee habt, einfach den ganzen Artikel anschauen…

(weiterlesen…)

this kann doch nicht sein…

Donnerstag, 14. Juni 2007

Von einem Arbeitskollegen habe ich folgendes kleines Schmuckstück erzählt bekommen, welches ich zum besseren Verständnis einfach mal in ein kleines, kurzes und zusammenhängendes Beispiel gegossen habe:

class MeineKlasse
{
public:

void set( int x )
{
if( this == NULL ) throw new ArgumentNullException();
this.x = x;
}

private: int x;
};

Zu dieser Originalität fällt mir nichts ein, was ich darauf noch sagen könnte…

Wenn “de Morgan” leise graut…

Donnerstag, 24. Mai 2007

Heute bin ich in unserem Quellcode auf folgendes Schuckstück gestoßen:

if( x1 >= x2 || ( !( x1 < x2 || y1 < y2 ) && z1 >= z2 ) )
{
// Do other very crazy stuff
}

Als ich dies gelesen habe, hat mich sofort ein komisches Gefühl beschlichen ohne sofort zu wissen warum (Intuition?). Dann habe ich den Ausdruck mal näher untersucht.

Zuerst habe ich mal !( x1 < x2 || y1 < y2 ) aufgelöst.
Nach den Gesetzen von De Morgan ist !( A || B ) = !A && !B. Das ergibt:

!(x1<x2) && !(y1<y2)

Wenn jetzt x1<x2 bzw. y1<y2 wahr ist, so ist x1>=x2 bzw. y1>=y2 falsch. Daraus folgt:

!( x1 < x2 || y1 < y2 ) == x1 >= x2 && y1 >= y2

Dies setzen wir wieder in die gesamte Logikgleichung ein:

x1 >= x2 || ( x1 >= x2 && y1 >= y2 && z1 >= z2)

Dies entspricht dem Boolschen Ausdruck A || ( A && B && C ). Wenn A also true ist, ist perse der ganze Ausdruck wegen der Veroderung mit A true. Ist A false, so kann der ganze Ausdruck nur noch true werden, wenn A && B && C true wird. Da A in diesem Fall aber false ist, ist A && B && C auch immer false. Somit entspricht dieser Ausdruck einfach A.

Dies bedeutet, die obige if Anweisung kann auf folgende reduziert werden:

if( x1 >= x2 ) {…}

&& geht sogar in if(…)

Donnerstag, 15. März 2007

Dieser Beitrag ist wieder vom “Ist doch klar, sowas macht doch keiner”-Typus. Leider sieht die Sache ganz anders aus. Folgendes sehe ich JEDEN Tag häufiger:

ififif 1

Ganz schlaue Experten gehen sogar einen Schritt weiter und optimieren die Klammern weg, weil es Tipparbeit spart und “sinniger” erscheint:

ififif 2

Ich weiss nicht wie es anderen “Durchschnittsprogrammierern” geht wenn sie so etwas sehen, ich jedenfalls habe das Gefühl das sich meine Retina ablöst… Für alle die noch nicht gesehen haben, warum dies Augenkrebs verursachen kann, hier nochmal der Hinweis: Es gibt für logische Ausdrücke Boolsche-Operatoren. Jede Programmiersprache hält ein paar griffige bereit. Die Untermenge postuliere ich jetzt einfach mal auf UND, ODER und NICHT! In C/C++/C# werden sie mit &&, || bzw. ! ausgeschrieben. Eine saubere Formulierung dieser Abfrage wäre somit:

ififif 3

Eine Ausrede die ich diesbezüglich nicht mehr hören kann ist: Ja, früher hat ja in den if’s noch mehr dringestanden. Das ist dann alles nach und nach rausgefallen. DAS IST KEINE AUSREDE! DAS IST BULLSHIT! Wenn ich etwas aus/in einer if (oder sonstwo) lösche/ändere/hinzufüge, habe ich nicht nur das Privileg sondern auch die hoheitliche Pflicht sich den umgebenen Quellcode anzuschauen. Und sollte ich durch meine Änderungen ein solches Konstrukt “hinterlassen”, bin ich nicht besser als jener, der sowas initial in die Tastatur rotzt.

Wenn nicht nicht in Ordnung nicht falsch ist…

Sonntag, 11. März 2007

Dieses Beispiel hat mir freundlicherweise ein Arbeitskollege zur Verfügung gestellt. notOK ist ein Boolean (Wahrheitswert).

if( !notOK != false ) …

Auch hier bemerkt man wieder, das Programmierer Anweisungen in Programme einbauen, die sie niemals im Alltag verwenden würden. Oder hat wirklich jemand zu seinem Kind, nachdem es hingefallen ist,  folgendes gesagt: Wenns nicht nicht in Ordnung nicht falsch ist, brauchen wir kein Pflaster drauf kleben.

Es sollte auch vermieden werden, eine Verneinung mit in den Variablennamen einzubauen. Dies kann bei späteren Vergleichen und Abfragen (siehe oben) zu einem Knoten im Gehirn führen. Deshalb sollte schonmal die Variable einfach OK heissen, besser noch bOK, damit man erkennt das es sich um einen Wahrheitswert handelt. Möchte man es noch weiter verbessern, wäre ein “sinvoller” Variablenname besser geeignet. OK kann alles bedeuten. Es sollte möglich sein, die Operation oder den Zustand zu assoziieren, für welche(n) dieser Wahrheitswert steht. Zum Beispiel bFileSaved für eine erfolgte Dateispeicherung. Somit wäre die obige Anweisung einfach durch

if( bFileSaved ) …

zu ersetzen. Nun kann man  mit einem Blick die ganze Situation erfassen. Oder meint Ihr nicht, das ich nicht nicht Recht habe, wenn ich die antinegierte Aussage, welche ich oben nicht nicht getroffen habe,  als nicht Richtig unter der Berücksichtigung einer unnegativen Nichtverneinung deute? 

if oder !if, das ist hier die Frage

Montag, 26. Februar 2007

Ich wühle mich momentan wieder durch einen riesigen Haufen Code! Und da habe ich dieses Schmankerl aufgetan:´

BOOL config_fits = Check();
if( config_fits )
{
    ...
}
else if( !config_fits )
{
    ...
}

Solangsam glaube ich, das Programmierer die größten Probleme mit Wahrheitswerten haben. Aber mal unter uns: Wie wichtig können die schon bei der Softwareentwicklung sein?

Boolean, die Wahrheit liegt irgendwo dazwischen

Freitag, 23. Februar 2007

Es gibt Tage, da hinterfrage ich meine Sicht der Dinge. Denn manchmal habe ich das Gefühl, dass ich der einzige bin, bei dem es in den Gehirnwindungen knarzt, wenn er sowas sieht:

switch
( CanLink(val,id,type) )
{
  case TRUE  : Message("CanLink() == TRUE" ); break;
  case FALSE : Message("CanLink() == FALSE"); break;
  default    : RvalOut( rVal, "AUTCanLink" ); break;
}

Natürlich weiss ich das TRUE unter Windows definitionsgemäß gleich 1 und FALSE gleich 0 ist. Was sogar in diesem Fall bedeuten könnte, das er tatsächlich manchmal in den default Block verzweigt. Doch erstens frage ich mich, ob eine Methode die “CanLink” heißst nicht wirklich nur true oder false zurückgeben sollte und zweitens wo die Logik bleibt, wenn wir bei bei einem binären Wahrheitswert eine dritte Möglichkeit abfragen.

Für ein solches Konstrukt gibt es in unserer Welt keine Entsprechung. Wenn wir eine Münze werfen und vorher auf Kopf oder Zahl setzen, diese Münze dann mit der Hand fangen und auf den Handrücken knallen, kommt kein Mensch auf die Idee vorher auszumachen, was passiert, wenn die Münze auf dem Rand landet.
Ein weiteres Beispiel wäre, dass ich jedesmal bevor ich jemanden frage: “Möchtest Du einen Kaffee?” erstmal Tee koche.

Was mir nicht klar ist, das Programme oft so undurchsichtig und krumm sind. Sie liefern oft eine Lösung von hinten durch die Brust ins Auge. Niemand würde nach “Feierabend” so verschroben denken. Warum aber während der Programmierung?

Da fällt mir einer dieser Programmierwitze ein, den eigentlich jeder Programmierer kennt und darüber lacht oder wenigstens schmunzelt. Er geht so:

bool Hoelle     = true;
bool Zugefroren = false;

if( Hoelle == Zugefroren )
{
    printf("Diese Applikation laeuft stabil!");
}

Für die Unkundigen: Hoelle und Zugefroren sind Wahrheitswerte und können nur wahr (true) oder falsch (false) sein. Dieses kleine Programm sagt nur aus, das die Software erst stabil läuft, wenn die Hölle zugefroren ist. Durch die Vorbelegung ist aber Hoelle==Zugefroren immer falsch und demnach wird diese Software niemals stabil laufen. Auch ich habe im ersten Moment geschmunzelt, weil es der täglichen Erfahrung ziemlich nahe kommt. Doch auch wenn die Aussage wahr ist, der Weg ist unschön. Der Wahrheitswert von Zugefroren ist völlig korrekt. Es beschreibt einen Zustand. Entweder ist etwas zugefroren oder nicht. Aber was will mir Hoelle=true sagen? Die Hölle ist kein Zustand der wahr oder falsch sein kann. Was würde mir Auto=false oder Wasser=true andeuten wollen? Auch hier sieht man wieder, der Teufel steckt nicht in der Hölle, sondern immer im Detail.