2 oder 200 Methoden?



  • Hallo,

    nur mal eine Kurze Frage:
    ich hab das Problem bei einer Methode, das sie viele Parameter braucht. Diese Parameter soll man später auch einzeln ändern können. Soll ich wegen 100 Parameter 200 Methoden( jeweils 100 Setter und 100 Getter ) schreiben?
    Oder soll ich ein Getter und einen Setter schreiben, der zwei Parameter hat:
    1. Welcher Parameter soll verändert werden?
    2. Der Wert des Parameters?

    Ich will aber auch auf Performance achten. Die Setter/Getter stell ich mir schneller vor, als eine Funktion, die eine Switch mit 100 Cases verarbeiten muss. Allerdings würde es den Code aufblähen, 200 Methoden zu schreiben.

    Was sollte ich verwenden?

    MfG. Christoph Ludwig



    Nicht der Code deiner Klasse soll vorrangig ordentlich werden, sondern der Code, der deine Klasse benutzt.
    Aber ich zweifle am Entwurf, wenn da 100 Attribute sind.



  • ok danke!
    naja das mit den 100 war übertrieben, sollte aber nur den Sinn wiederspiegeln und die Situation deutlicher machen 😉



  • Nicht, 200, aber auch nciht 2. Wie Volkard schon sagte soll der Client-Code ordentlich sein. Aber du brauchst mit Sicherheit auch nicht für jedes Attribut Getter und Setter, denn dann könntest dus gleich zu einem struct mit öffentlichen Membern machen, wenn es nur ein "bundle-of-data" ist.



  • ChristophLu schrieb:

    ok danke!
    naja das mit den 100 war übertrieben, sollte aber nur den Sinn wiederspiegeln und die Situation deutlicher machen 😉

    Und damit du jetzt nicht ewig schreibst benutze bitte eine IDE die dir das generiert!

    MfG SideWinder



  • SideWinder schrieb:

    ChristophLu schrieb:

    ok danke!
    naja das mit den 100 war übertrieben, sollte aber nur den Sinn wiederspiegeln und die Situation deutlicher machen 😉

    Und damit du jetzt nicht ewig schreibst benutze bitte eine IDE die dir das generiert!

    MfG SideWinder

    Wie geht das mit vim? 😕





  • std::map



  • ........ schrieb:

    std::map

    Genau mit Straßenwalze Nüsse knacken! 🙄 👍



  • @pumuckel: Naja sobald sich eine Eigenschaft ändert, muss das die Klasse registrieren und Arbeiten ausführen. Ich kann den User nicht nur Variablen ändern lassen. Bei jeder Änderung geschieht im Hintergrund etwas.

    @SlicerWinder: Je nach Änderung prüfe ich auf Gültigkeit und führe verschiedene Arbeiten ja nach Variable aus. Ich könnte höchstens den Funktionsfumpf erstellen, was aber das kleinste Problem ist.



  • Ich würde eher zu vielen kleinen Funktionen tendieren. Ich denke, oft kann es sein, dass man nur etwas ändern will. Du sagst auch, du willst auf Gültigkeit prüfen. Wie zeigst du ungültige Werte an? Per Exception? Was willst du tun, wenn plötzlich 10 Attribute geändert werden und Parameter 3 und 7 ungültig sind?

    Aber um mal realistisch zu bleiben: Von wievielen Attributen sprechen wir hier überhaupt? 100 sind definitiv zu viele.



  • Wir sprechen über Style-Angaben in meiner selbstgeschriebenen GUI. Also sowas wie Position( left, top ), width/height, verschiedene Farbangaben, Aussehensveränderungen( Kanten, Ecken, Farbverläufe, ... ) Alles in allem vielleicht 30 Variablen. Ich hab jetzt Setter und Getter geschrieben. Manches hab ich extra noch einmal zusammengefasst, da es oft vorkommt, das man zum Beispiel Höhe und Breite ändern will( element.setWH( int newWidth, int newHeight ) ) oder nur eines von Beiden( setWidth( int newWidth ), setHeight( int newHeight ) ).
    Bei allen drei Befehlen muss ich auf Gültigkeit prüfen und die Bilder für das Element neu zeichnen.
    Das mache ich automatisiert, damit der User nicht nach jeder Änderung, die er irgendwo in den Code schreibt, einen Befehl schreiben muss, um das Element zu aktualisieren.

    Zu der Exeption:
    Ziemlich viele der Befehle geben bool zurück. Falls ein Fehler auftritt( false wird zurückgeben ), wird eine Errornummer in der Klasse gespeichert( int getLastError() ).

    Somit hat die Klasse insgesamt 92 Methoden, die Hauptsächlich das Erscheinungsbild des Elementes ändern und auslesen( Implementation 1500 Zeilen reiner Code ). Andere Methoden zeigen das Element noch an, führen Eventhandler aus oder verarbeiten Events für das Element.

    MfG. Christoph



  • Schau dir doch mal an, wie das in anderen GUI-Toolkits gemacht wird. Z.B. mit den Farben. Da gibt es nicht für jede Möglichkeit eine eigene Methode (z.B. setWindowBackground(Color c)), sondern eine Klasse Palette, in der man über enums an die Werte gelangt. Dein GUI-Element bietet dann getter und setter für ein ganzes Palette-Objekt.
    Oder Position und Größe: nicht zig Integer nehmen, die du einzeln setzen kannst, sondern z.B. eine Klasse Point, welches die Position des Elements darstellt, und einmal Size, für die Größe. So machst du aus 6 Methoden 2.

    Überleg dir möglichst bald, welche Eigenschaften du zu eigenen Klassen zusammenfassen kannst, damit du nicht zig Methoden anbieten musst, um die einzelnen Werte + irgendwelche Verbindungen (z.B. height, width, height+width) anbieten musst.



  • Ziemlich viele der Befehle geben bool zurück. Falls ein Fehler auftritt( false wird zurückgeben ), wird eine Errornummer in der Klasse gespeichert( int getLastError() ).

    wow. bin ich froh, dass ich damit nicht arbeiten muss.



  • da ist eine map aber wirklich besser, zumal du deine oberfläche dann auch
    einfach per datei laden kannst (bin auch bei einer gui)

    std::map<std::string, void *> vars; // void * nur als beispiel
    
    void RegisterVar(std::string name, void *var)
    {
        vars[name] = var;
    }
    void SetIntVar(std::string name, int data)
    {
        *(int *)vars[name] = data; // c-cast nur als beispiel
    }
    

    man kann sich da sehr schöne typsicehre templates bauen, mit wenig overhead.

    damit hast du nur eine handvoll getter und setter 🙂



  • vim schrieb:

    SideWinder schrieb:

    ChristophLu schrieb:

    ok danke!
    naja das mit den 100 war übertrieben, sollte aber nur den Sinn wiederspiegeln und die Situation deutlicher machen 😉

    Und damit du jetzt nicht ewig schreibst benutze bitte eine IDE die dir das generiert!

    MfG SideWinder

    Wie geht das mit vim? 😕

    Einfach mit dem Makrorekorder. Mit @q starte ich den Rekorder und erzeuge den ersten getter und setter. Mit @ beende ich ihn und mt @q führe ich das Makro bei der nächsten Variablen aus. Mit 99@q wird das Makro auch 99 mal ausgeführt. Man muss bei Aufnehmen ein wenig aufpassen, dass man es generisch macht, aber mit etwas Übung und Kenntnis der richtigen Tastaturkommandos geht das.

    Wenn das häufiger gemacht wird, kann man sich auch ein vim-Skript schreiben.



  • tntnet schrieb:

    ...

    in einer echten IDE schreibt man folgendes:

    gs Typ Variablenname
    

    und es wird eine Variable + Getter + Setter erzeugt. Ohne, dass du jemals etwas "recorden" musst. Makros recorden ist nämlich sowas von 90er.

    MfG SideWinder



  • Also ich hab auch ein eigenes GUI gebaut, das is noch nicht ganz fertig, und ich hab bei mit alles zu Konfigurationsstructs zusammengeschlossen, für jedes gibts bei mir 1x get und 1x set und die Enthalten alles was zusammengehört. Damit kommen bei mir maximal 6 Structs zusammen. Eventuell wäre soetwas ja eine gute Lösung für dich. Gültigkeitsprüfungen amche ich ejdoch nicht, das wäre sehr Aufwendig und im Moment gehe ich davon aus das der Nutzer sie richtig konfiguriert.



  • SideWinder schrieb:

    tntnet schrieb:

    ...

    in einer echten IDE schreibt man folgendes:

    gs Typ Variablenname
    

    und es wird eine Variable + Getter + Setter erzeugt. Ohne, dass du jemals etwas "recorden" musst. Makros recorden ist nämlich sowas von 90er.

    MfG SideWinder

    kann der msvc sowas auch?^^ das addon, auf dessen name ich gerade nicht komme, kanns auf jeden fall - aber kanns der msvc auch von haus aus vll schon?

    bb



  • Das weiß ich nicht, gibt es da soetwas wie "Insert Snippets" oder kommt das auch aus den Addons die ich installiert habe?

    MfG SideWinder


Log in to reply