Stilfrage: Zuweisungen in if-Klammern



  • CarstenJ schrieb:

    Jo. So richtig witzig find ich, dass sobald man in einem Thread das Wort "Stil" auch nur erwähnt, diese Threads immer in biblischen Ausmaßen expandieren.

    eigentlich ist das ziemlich gut.



  • hmmm, was mich nur interessiert:
    Wieso kommt ihr alle mit den Exception-Handling an??? 😕
    Ich bin bis jetzt gut gefahren, diese Funktion so zu implementieren, dass sie -1 als Fehlercode zurückgibt, ansonsten eben die Position im vector des gesuchten Ergebnisses. Damit wird aber auf jeden Fall ein gültiger Wert zurückgegeben und die Situtation, dass die Funktion fehlschlug, damit abgefangen.
    Ich finde Exception-Handling an dieser Stelle eigentlich
    a) stilistisch nicht so schön, da sie den Quellcode nur unheimlich aufbläht und dabei doch alles schön mit Fehlercodes gelöst werden kann.
    b) sowieso alles auf einer Ebene liegt und die Verwendungsmöglichkeiten der Except. hier imho abs. Overkill sind.
    Es geht mir nur prinzipiell darum, dass es praktischer ist, im weit oben von mir aufgeführten Fall die Zuweisung direkt in der Abfrage zu schreiben, damit ich da nicht unnötig eine weitere Ebene der if-Abfrage erstellen muß. Folgendes ist imo nicht sehr schön:

    int x=foo(a)
    if(x!=-1)
      //tu dies
    else
    {
    x=foo(b)
    if(x!=-1)
      //tu jenes
    else 
    //Fehlermeldung, nichts gefunden o.ä. 
    }
    

    Stattdessen:

    int x=0;
    if((x=foo(a))!=-1)
     //tu dies
    else if((x=foo(b))!=-1)
     //tu jenes
    else
     //Fehlermeldung
    

    Da ist nix Exceptions o.ä.
    Und ich lese darin:
    Wenn x nach der Zuweisung einen Wert hat, der ungleich -1 ist, tu dies...
    Eigentlich ziemlich eindeutig.
    Okay, es hängt da natürlich von der Definition der foo()-Fkt. ab. Wenn sie so implementiert ist, dass sie undefiniertes Verhalten haben kann, ist diese Art nicht sehr sicher. ...um mal wieder die Kurve zu kratzen 😉



  • DrGreenthumb schrieb:

    Ist ja kein Java hier, wo selbst ein EOF als Exception ankommt.

    So ziemlich alle Javamethoden liefern bei einem EOF eine -1 zurück. 🙄



  • DrGreenthumb schrieb:

    Ist ja kein Java hier, wo selbst ein EOF als Exception ankommt.

    Dieses Gerücht hält sich ja äußerst hartnäckig. Dabei habe ich das selber schon mindestens bei 3 Gelegenheiten gesagt. Vielleicht sollte man erstmal selber mit Java-Streams hantieren, bevor man schlaue Kommentare abgibt.



  • Optimizer schrieb:

    Vielleicht sollte man erstmal selber mit Java-Streams hantieren, bevor man schlaue Kommentare abgibt.

    Nein danke. Aber mir gings auch nicht darum, Java schlecht zu machen und euch Javaianer zu kränken, sondern eben um so ein Extrem-Beispiel und um die Tatsache, dass man doch noch recht oft Funktionen hat, bei denen man eine Fehler-Rückgabe bekommt.

    Fakt ist, in Java wird sehr viel mehr Gebrauch von Exceptions gemacht (was mir übrigens nicht gefällt) und da muss Java nunmal herhalten, wenn es um sowas geht.



  • DrGreenthumb schrieb:

    Fakt ist, in Java wird sehr viel mehr Gebrauch von Exceptions gemacht (was mir übrigens nicht gefällt) und da muss Java nunmal herhalten, wenn es um sowas geht.

    das erweckt den eindruck, als sei java eine mist-sprache. ist sie aber nicht wegen des exception-mißbrauchs. genauso könnte man argumentieren, c++ sei eine mist-sprache weil viele leute schutzverletzungen bauen.



  • Ich frag mich, wieso du eigentlich so auf Java schimpfst?!



  • CarstenJ schrieb:

    Ich frag mich, wieso du eigentlich so auf Java schimpfst?!

    Weil das in nem C++ Forum sehr l337 ist.



  • Wo schimpf ich denn? Genauso wenig, hab ich irgendwelche Java-ist-Mist-Eindrücke gebracht, bzw. bringen wollen. Habe das Java-EOF-Beispiel genommen, weil ich dachte das wäre tatsächlich so.



  • Ich meinte auch Volkard...Die Frage muss eigentlich auch nicht beantwortet werden, sonst wirds hier ja mega OT und das will ja sicher keiner... 😉



  • Doch, es muss klar heraus gearbeitet werden, warum Java "Mist" und C++ "die Sprache der Zukunft" ist. 😃 😉



  • interpreter schrieb:

    Wir sprechen hier über Zuweisungsoperatoren. Tja, was wird Integer dann wohl sein?

    ja, diesen zuweisungsoperator, den ein c++ compiler automatisch für's 'flache kopieren' anlegt ne?
    ist irgendwie an mir vorbeigezogen bei der länge des threads. ich war noch bei dem if (x=foo()) zeugs



  • CarstenJ schrieb:

    Ich frag mich, wieso du eigentlich so auf Java schimpfst?!

    ich hab geschrieben, daß sie keine mist-sprache ist.
    was willst du überhaupt hier?



  • CarstenJ schrieb:

    Ich meinte auch Volkard...Die Frage muss eigentlich auch nicht beantwortet werden, sonst wirds hier ja mega OT und das will ja sicher keiner... 😉

    angriffe machen und sich im namen aller wünschen, daß der angegriffene sich nicht wehrt. was bist denn du für einer?



  • otze schrieb:

    erstmal zu den exceptions: ich bin dagegen, bei jedem funktionsfehlschlag den programmfluss mittels exception zu unterbrechen, stellt euch mal vor,in der std::map würde find ne exception werfen, wenn das element nicht gefunden wurde,anstatt dem üblichen end-iterator. was ich damit sagen will:

    std::map<int,int> a;
    try{
        (*a.find(5))=6;
    }
    catch(std::end& b){//ein typ der die exception auswerfende map liefern kann
        b->map.insert(5,6);
    }
    

    wer sowas gut findet hat echt ein medizinisches problem 😮 .

    Ganz oft will ich aber genau sowas. Ich bin es satt immer:

    map<int,int>a;
    map<int,int>::iterator pos=a.find(4);
    if(pos==a.end())
      throw runtime_error("Couldn't find a value for ...");
    pos->second=6;
    

    Anstatt einfach:

    map<int,int>a;
    a.find(4)->second=6;
    

    (Wobei ich auch nicht dagegen hätte wenn ich das ->second weglassen könnte)

    otze schrieb:

    ps: und wenn ihr jetzt mit exception in der zuweisung kommt: JUHU der perfekte schlangencode

    try{
        if(!(x = foo()){
       
    
        //Setzt hier 40 zeilen code ein
    
        }
        else
        {
       
    
        //hier nochmal 20
        }
    catch(bad_alloc& a){
        //usw
    }
    

    Jetzt mal ganz davon abgesehen, dass eine Funktion mit mehr den 60 Zeilen eh schlechter Stil ist hat niemand gesagt, dass du pro Funktion nur einen try Block haben darfst, und bad_alloc zu fangen ist eh Schwachsinn da du entweder keinen Speicher mehr hast oder ein Memoryleak. Beides kannst du nicht lokal (wenn überhaupt) lösen. Also soll es in der Debug version aus der main Funktion raus fliegen und in der Release version in der main Funktion gefangen werden in cerr geschrieben werden und anschließend mit return 1 das Program abgebrochen werden. Bei deinem Beispiel fällt dann der gesamte try Block weg und ob ich nun:

    throw runtime_error("blabla");
    

    oder

    return -1;
    

    schreibe bläht mein Code ja so enorm auf...

    Und

    if(int i=foo()){
      //...
      return i;
    }
    return -1;
    

    ist

    int i=foo();
    //...
    return i;
    

    ja Meilen weit überlegen.

    net schrieb:

    die zuweisung schlägt fehl. ohne 'throw' wär das nicht passiert (es sei denn, die funktion stürzt ab)

    Falsch die Zuweisung findet erst gar nicht statt und somit bleibt x bei einem Fehlschlag von foo intakt wogegen es bei einem Fehlerrückgabe von foo in einen Zombiestatus versetzt wird und man darauf expilicit testen muss wo einem sehr dumme Fehler unterlaufen können.

    DrGreenthumb schrieb:

    Nein danke. Aber mir gings auch nicht darum, Java schlecht zu machen und euch Javaianer zu kränken, sondern eben um so ein Extrem-Beispiel und um die Tatsache, dass man doch noch recht oft Funktionen hat, bei denen man eine Fehler-Rückgabe bekommt.

    Ich kann kein Java und eigentlich ist es Schade, dass so wenige Funktionen Exceptions nutzen.

    PS:langsam sind Exceptions nur wenn sie viele Destruktoren aufrufen müssen (was auch bei der Rückgabe eines Fehlerwertes der Fall ist), wenn dies nicht der Fall ist dann sind sie nicht wirklich langam.



  • Wenn du in einer Collection was suchst, kann das durchaus ein normaler Vorgang sein, dass es nicht enthalten ist.
    In dem Fall eine Exception zu werfen ist also Unsinn. Exceptions sind für Situationen gedacht, die im planmäßigen Programmablauf nicht vorkommen sollten.



  • volkard schrieb:

    was willst du überhaupt hier?

    Äh..wie was will ich hier?



  • CarstenJ schrieb:

    volkard schrieb:

    was willst du überhaupt hier?

    Äh..wie was will ich hier?

    frage nicht beantwortbar, weil sie irgendwie quatsch ist? ja, das problem hatte ich bei deiner auch. ignoriere die frage einfach. ich weiß, was du hier willst.



  • volkard schrieb:

    ich hab geschrieben, daß sie keine mist-sprache ist.
    was willst du überhaupt hier?

    Auch, wenn schon präventiv der "Offtopic-Gang" verteufelt wurde, möchte ich dazu noch was schreiben, denn deine Kommasetzung ließ keinen so eindeutigen "Java ist kein Mist"-Schluß zu:

    volkard schrieb:

    ist sie**,** aber nicht wegen des exception-mißbrauchs.

    oder

    volkard schrieb:

    ist sie aber nicht**,** wegen des exception-mißbrauchs.

    Also, ich fand das auch mißverständlich. 😉



  • Naja...in der Bibel interpretiert man die Erzaehlungen auch grad so wie man es
    braucht...

    So genau muss man jetzt die Saetze auch wieder nicht auseinanderfriemeln. Sonst
    kann man wahrscheinlich fast jede Argumentation hier aushebeln (nein, ich habe
    und werde mir nicht die Muehe machen, dass zu pruefen).

    mfg
    v R


Anmelden zum Antworten