Mag keine Spaghetti - Vereinfachung für if() Orgie gesucht



  • du sollst alles in ein array packen.

    jedesmal wenn du

    a1, a2, a3,...
    hast, dann schreit das nach: GIB MIR EIN ARRAY



  • yo der verschtetz

    for(int ... 20) zustand[i] = checkbox[i];
    
    void (*fp[20])(void);
    fp[0] = tuDasFunktion;
    ...
    
    for(int ... 20) if(zustand[i]) (*fp[i])();
    


  • Hi,

    du hast ja wahrscheinlich sowas:

    class Win {
    
       private: CheckBox Check1, Chek2, ...
    };
    

    Dann packste am besten alle erstmal zusammen:

    class Win {
    
       private: vector<CheckBox> checkis; 
    };
    

    Und legst die ganzen CheckBoxen mit checkis.push_back(CheckBox(...)) an.

    Dann hast du ja noch deine tuediesunddas(), fillBenzin() etc ...

    void tuediesunddas() { ... };
    void fillBenzin() { };
    

    Dann legst du dir noch eine map an, die sich merkt welche CheckboxNr was tut:

    class Win {
    
       private: 
            typedef void (Win::*functions)(); 
    
            vector<CheckBox> checkis; 
            map<size_t,functions> checkisdo;
    };
    

    Dann registrierste du die ganzen Funktion mit den zugehörigen Checkboxen:

    checkis[0] = &Win::tuediesunddas;
    checkis[1] = &Win::fillBenzin;
    ...
    

    Nun kannst du bequem durch dein Vector durchiterieren und den Status prüfen und jenachdem reagieren:

    for(size_t i = 0; i < checkis.size(); ++i)
        if(checkis[i].isChecked()) (this->*checkisdo[i])();
    

    Alternativ kannst du auch sowas benutzen: map<CheckBox,functions> und zudem boost:function oder tr1::function.



  • Aso..jetzt kapier ichs, danke.



  • *grosskotz an*...oder Du schaffst Dir ein ordentliches Objektnetz nach MVC-Schema, in dem das Framework das übernimmt.*grosskotz aus*
    Nein im Ernst, ich weiß nicht, wie groß Deine Anwendung ist, aber grundsätzlich würde ich maximal nur das zusammen in ein Array werfen, was 'fachlich' auch zusammengehört, also z.B. auch zusammen in der GUI gruppiert ist.
    btw: Hängt natürlich auch von dem ab, was Deine Anwendung machen soll: Was spricht dagegen, für jeden boolschen Wert einen Accessor zu verwenden (also isTankLeer...)? Sauberer ist es allemal.
    Zumindest deute ich Deine Namen 'Zustand' etc. so, das hört sich nicht nach einfacher Ablaufsteuerung an, sondern so, dass da evtl. noch mehr mit gemacht werden muß.



  • Also es geht um eine Checkliste.
    Die Checkboxen gehören alle zusammen.
    Für jedes angeklickte soll eine Funktion ausgeführt werden, wenn man auf "GO" klickt.



  • Hast du die ganzen Beiträge gesehen ?



  • Ja, aber das war die Antwort auf den letzten Beitrag von SammyRukka der Fragen enthielt.

    Meine Frage ist geklärt soweit.



  • Nun gut, bei der Aufgabenstellung würde ich auch nicht auf so'n Grosskotz hören 😃
    Dann passt die beschriebene Lösung ja. Wobei ich an der Stelle trotzdem den if/else if-Verteiler benutzen würde, allein deshalb, weil andere ich ich selbst in 3 Jahren ihn auch noch verstehen würde(n).



  • Aso ^^

    Kannst du mir das mit dem Accessor noch genauer erklären?
    Du meinst in der Fensterklasse solche Funktionen einbauen und die dann von der anderen Klasse aus aufrufen?



  • Naja, für Deinen Fall ist das wohl (wie vermutet) etwas oversized.
    Accessoren benutzt Du eigentlich nur, um den Zugriff auf Deine Attribute zu kapseln/kanalisieren. Das Attribut ist also private und nur die Accessoren (Getter/Setter) sind public. Das gibt Dir u.a. die Möglichkeit so etwas wie Logging, Event-Handling oder Attribut-Plausibilisierungen einzubauen, einfach dadurch, dass Du sicher sein kannst, dass alle Attribut-Änderungen über die Acessoren laufen. Auch Ausnahmen widerum könnten in manchen Fällen sinnvoll sein.

    So richtig wird ein Schuh daraus, wenn Deine Anwendung dann noch einen MVC (Modell-View-Controller) implementiert und Du Deine Modell-Schicht damit versiehst. MVC ist die Trennung in Modellebene und Darstellungsschicht, 'verbunden' durch eine Controllerschicht.
    In dem Fall gibt's dann genug Bedarf an Accessoren (siehe Beispiele).

    In Deinem Fall ist jetzt natürlich die Frage, wo Du den Schnitt ansetzen würdest. Aber wie gesagt, dass ist sicher oversized. Für meinen privaten Spielkram halte ich einen MVC auch nicht wirklich durch.

    Bleib man bei Deiner Lösung und sieh die bei Interesse einfach mal diverse MVC Implementationen an. Solltest Du auch Java beherrschen, dann riskiere mal einen Blick auf das Spingframework.

    Ansonsten:

    Nun gut, bei der Aufgabenstellung würde ich auch nicht auf so'n Grosskotz hören 😃
    Dann passt die beschriebene Lösung ja. Wobei ich an der Stelle trotzdem den if/else if-Verteiler benutzen würde, allein deshalb, weil andere ich ich selbst in 3 Jahren ihn auch noch verstehen würde(n).


Anmelden zum Antworten