lazy evaluation bei klassen instantiierung



  • Ich stehe vor der frage dass ich nicht weiß was sauberer ist.
    Sollte ich immer erst dann ein Objekt einer Klasse instantiieren wenn ich es unmittelbar brauche oder sollte ich für die Übersicht alle variablen/objekte in einer methode ganz am anfang anlegen:

    welche variante würdet ihr vorziehen und warum:

    int Class::mymethod()
    {
          int    a = 9,
                  b,
                  c,
                  myvar;
    
         double mydouble = 9.9,
                     yourdouble;
    
         Class myclass;
    
         Class2* yourclass = new Class2();
    
     // ab hier ist alles instaniiert und kann benutzt werden. klare trennung zwischen 
    // objekt/variablen initialisierung und dem eigentlich methoden-rumpf.
    }
    
    int Class::mymethod()
    {
          int    a = 9;
          for (int a = 0; a < 50; a++)
          { 
              // ... 
           }
    
           int b;
    
           if ( somevariable < b) //...
    
           Class2* yourclass = new Class2();
           yourclass->foo();
    }
    

    danke



  • Hallo

    Es spricht nichts gegen Variante 2. Kann mehr Übersichtlichkeit bringen, und eventuell mehr Geschwindigkeit (wenn es nämlich Fälle gibt, bei denen die Methode vorzeitig beendet wird, und damit einige Speicherbereiche auf dem Heap gar nicht gebraucht wurden)

    bis bald
    akari



  • ganz klar 2

    objekte/variablen immer so lokal wie möglich, so spät wie möglich, und so const wie möglich machen.
    spart viel ärger, und macht übersichtlichere programme.



  • Aber das hat gar nichts mit lazy evaluation zu tun.



  • hustbaer schrieb:

    objekte/variablen immer so lokal wie möglich, so spät wie möglich, und so const wie möglich machen.

    Oft auch so automatisch wie möglich. Besonders wenn eine Funktion komplizierter wird (mehrere Ablaufpfade, Exceptions), kann sich RAII sehr schnell auszahlen, weil man eine Absicherung für korrekte Zerstörung und Speicherfreigabe hat. Nebenbei kommt einem oft zugute, dass sich dadurch die Codekomplexität stark reduziert, da If-Orgien hinfällig werden.

    Class2* yourclass = new Class2();
    

    Wenn in einer Funktion überhaupt ein lokales Objekt dynamisch angefordert werden muss (was bei mir z.B. eher selten vorkommt), sollte man die Freigabe nicht vergessen. Diese stellt in vielen Fällen zwar kein Problem dar, aber man sollte bedenken, dass man durch scoped_ptr & Co. praktisch keine Nachteile hat.



  • Nexus schrieb:

    hustbaer schrieb:

    objekte/variablen immer so lokal wie möglich, so spät wie möglich, und so const wie möglich machen.

    Oft auch so automatisch wie möglich. Besonders wenn eine Funktion komplizierter wird (mehrere Ablaufpfade, Exceptions), kann sich RAII sehr schnell auszahlen, weil man eine Absicherung für korrekte Zerstörung und Speicherfreigabe hat. Nebenbei kommt einem oft zugute, dass sich dadurch die Codekomplexität stark reduziert, da If-Orgien hinfällig werden.

    Class2* yourclass = new Class2();
    

    Wenn in einer Funktion überhaupt ein lokales Objekt dynamisch angefordert werden muss (was bei mir z.B. eher selten vorkommt), sollte man die Freigabe nicht vergessen. Diese stellt in vielen Fällen zwar kein Problem dar, aber man sollte bedenken, dass man durch scoped_ptr & Co. praktisch keine Nachteile hat.

    Ja, klar. Ist für mich aber ein anderes Thema.



  • hustbaer schrieb:

    Ja, klar. Ist für mich aber ein anderes Thema.

    Ja, das war auch eher an Uffob gerichtet. 😉



  • Achso, ja, weil er da ein ziemlich sinnloses "new" drinnen hat, und danach auch nicht aufräumt.

    Ja, stümmt 🙂


Anmelden zum Antworten