Große, unübersichtliche memberfunktion auf mehrere Funktionen runterbrechen - Wie?



  • Hallo!

    In dem Programm, dass ich zur Zeit finde gibt es eine Memberfunktion einer Klasse, die mittlerweile mehr als 350 Zeilen Code umfasst.

    Es ist so viel Code, dass ich selbst schon fast nicht mehr durchblicke. Jetzt weiß ich aber nicht, wie ich diese Funktion auf kleinere Funktionen runterbrechen kann.

    Soll ich eine neue Klasse machen und dort eue Funktionen, die ich dann wieder in meiner jetzigen Funktion verwende?

    Oder wäre es besser in der .cpp Datei mehrere (kleine) Funktionen zu definieren, die ich dann in meine große Funktion packe?

    Oder gibt es noch eine bessere Möglichkeit? Globale Funktionen?

    mfg



  • EDIT:: Sorry Doppelpost



  • kewlBandit schrieb:

    Soll ich eine neue Klasse machen und dort eue Funktionen, die ich dann wieder in meiner jetzigen Funktion verwende?

    eher nicht

    kewlBandit schrieb:

    Oder wäre es besser in der .cpp Datei mehrere (kleine) Funktionen zu definieren, die ich dann in meine große Funktion packe?

    ich würd es fast so machen^^

    kewlBandit schrieb:

    Oder gibt es noch eine bessere Möglichkeit? Globale Funktionen?

    niemals

    void Klasse::KleineFunk1(){
    //...
    }
    
    void Klasse::KleineFunk2(){
    //...
    }
    
    void Klasse::GrosseFunk() {
    KleineFunc1();
    KleineFunc2();
    }
    


  • grundsätzlich sollte man immer das machen, was einem vernünftig erscheint. wenn neue klassen sinn machen, mach doch welche. wenn nicht, teile in sinnvolle kleine funktionen.



  • Erstmal in kleinere Funktionen aufteilen. Für jede Aufgabe erstellst eine neue Funktion. Wenn die Aufgabe ist, von zwei Werten den größeren weiter zu verwenden -> mach eine eigene Funktion draus (diese spezielle gibt's natürlich schon fertig).

    Ob du das dann noch objektorientierter machst, kannst du entscheiden, wenn du fertig bist.



  • Eindeutig in kleinere Funktionen bzw. Memberfunktionen aufbrechen. Die Sachen in Klassen verteilen, macht das ganze nicht besser.

    Übrigens, das was du machen willst, nennt sich Refactoring. Soll heißen, den Sourcecode bearbeiten/ändern, ohne die eigentliche Funktionalität bzw. Verhalten zu ändern. Und dafür gibt es auch Refactoring Tools, die einem dabei unterstützten. Ein Beispiel:

    void foo()
    {
         int x = 0;
         for(int i=0; i<2; i++)
              int y = x + 12;
    }
    

    Sagen wir mal, diese Funktion ist einem zu lang. Dann kann man die for-Schleife in eine andere Funktion auslagern, und bekommt das raus:

    void bar(int x)
    {
         for(int i=0; i<2; i++)
             int y = x + 12;
    }
    
    void foo()
    {
         int x = 0;
         bar(x);
    }
    

    Ein refactoring Tool kann in sofern Abhilfe schaffen, das es z.B. weiß, das bar einen int Parameter benötigt. Als User markiert man nur die for-Schleife und sagt dem Tool, es soll es in eine neue Funktion auslagern. Der bar(x) Aufruf wird dann auch gleich mit vom Tool reingeschrieben.

    Bei größeren Projekten ist das hilfreicher als alles von Hand zu machen.

    Hier kannste dir auch ein Video anschauen: http://www.refpp.com/

    http://www.slickedit.com/
    http://xref-tech.com/xrefactory/main.html



  • Was haltet Ihr davon:

    void kleineFunk1()
    {
       ...
    }
    
    void kleineFunk2()
    {
       ...
    }
    
    .
    .
    .
    
    void Klasse::GroßeFunk1()
    {
    
       KleineFunk1();
       kleineFunk2();
    
    .
    .
    .
    
    }
    


  • Im Prinzip schon richtig, aber warum sind die kleinen Funktionen nicht als Klassen-Methoden drin, wie die große? Die zwei kleinen kannst du doch private machen!

    1310-Logik hats richtig gemacht.



  • Ist doch egal, ich tu so kleine helfer auch oft in der cpp in nen anonymen namespace.



  • Naja, aber wenn sie den Code eines ehemaligen Members unter sich aufteilen, dann sollten sie auch schon was mit der Klasse zu tun haben (auf die privaten Membervariablen zugreifen müssen), also sind sie selbst auch Member.



  • .filmor schrieb:

    Naja, aber wenn sie den Code eines ehemaligen Members unter sich aufteilen, dann sollten sie auch schon was mit der Klasse zu tun haben (auf die privaten Membervariablen zugreifen müssen), also sind sie selbst auch Member.

    Muss nicht unbedingt sein.



  • Dr. Prof schrieb:

    Ist doch egal, ich tu so kleine helfer auch oft in der cpp in nen anonymen namespace.

    Wenn ich das schön höre: "egal". 😡 Kein Wunder das es mit Deutschland bergab geht...



  • Artchi schrieb:

    Dr. Prof schrieb:

    Ist doch egal, ich tu so kleine helfer auch oft in der cpp in nen anonymen namespace.

    Wenn ich das schön höre: "egal". 😡 Kein Wunder das es mit Deutschland bergab geht...

    Danke, du hast mir den Tag gerettet.


Anmelden zum Antworten