Klassenattribut oder parameter



  • hallo zusammen

    ich wollte wissen wann ihr in einer klasse member variablen verwendet und wann parameter, wenn mehrere methoden auf einen gleichen wert zugriff haben sollen. ich persönlich verwende es je nach art so, dass ich den wert untereinander als parameter übergebe um sicherzustellen, dass ich den korrekten wert erhalte.

    allerdings macht es natürlich mehr sinn eine membervariable zu deklarieren und auf diese haben dann die methoden intern zugriff. nur dachte ich bislang es stellt ein sicherheitsrisiko dar, da ich der annahme gehe, durch einen fehler könnte die variable noch einen alten wert haben, der eigentlich nicht da sein sollte.

    gehe ich richtig der annahme das es grundsätzlich meistens besser ist, membervariablen zu verwenden, anstelle das ganze mehrfach über parameterübergabe zu bewerkstellen? zur not könnte man dann die membervariable an gewissen stellen ungültig setzen. wäre das besser so? wie macht ihr das? ich weiss, es kommt beim programmieren meistens auf das szenario an, aber... 🙂



  • um es noch ein wenig zu verdeutlichen:

    parameterübergabe
    die klasse hat keine membervariable, welche einen wert managed. soll heissen, irgend eine funktion ausserhalb der klasse ruft eine methode der klasse auf und übergibt der methode einen parameter. jetzt arbeitet die klasse intern mit diesem wert und jongliert ihn zwischen den internen methoden nach belieben "on-the-fly" hin und her. es wird grundsätzlich (mit aussnahmefällen) gewährleistet, dass der wert korrekt ist, da er nicht zwischengelagert wird (membervariable) und dort fällschlicherweise von den internen methoden manipuliert werden könnte.

    als membervariable
    die klasse bestitzt eine membervariable welche durch eine funktion ausserhalb der klasse mit daten gefüttert wird. nun arbeiten die klassenmethoden intern mit dieser membervariable. eine parameterübergabe intern wird nicht mehr nötig, aber meiner meinung nach fehleranfälliger.



  • gnork schrieb:

    ich wollte wissen wann ihr in einer klasse member variablen verwendet und wann parameter, wenn mehrere methoden auf einen gleichen wert zugriff haben sollen.

    Gegenfrage: Sind diese Parameter sinnvolle Member, oder eher nicht? Wenn sie logisch zur Instanz gehören, würde ich sie als Member halten, ansonsten als Parameter übergeben.

    cu André



  • Hat die Klasse auch noch andere Aufgaben und entsprechende Member oder soll sie nur Funktionen bereitstellen? Ausschliesslich Memberfunktionen aufzurufen, die gerade so gut statisch sein könnten, ist nämlich nicht sehr sinnvoll. In dem Falle wäre vielleicht eine Funktionssammlung in einem Namensraum besser geeignet.



  • hallo jungs

    asc: das sehe ich eigentlich schon auch so und ich versuche das ganze nun auch so zu handlen. aber sollte man, abhängig vom szenario (z.B. ein objekt welches benutzerinfos speichert), dieses ggf. zerstören, wenn es sein kann, dass ungewollt der falsche benutzer aktuell gespeichert ist? also angenommen eine methode holt sich benutzer infos und legt die werte in das objekt welches als member bereit steht. irgendo passiert dann ein fehler und irgendwann wird das objekt wieder gebraucht und nun sind dort aber benutzer infos enthalten welche noch vom alten sind. sollte man in sollchen fällen vorher darauf achten, das im schlimmsten fall das objekt einfach keine werte mehr enthält? bislang mache ich es so.

    sollche sachen waren eben meine grösste angst. das werte auftauchen die einfach im aktuellen zeitpunkt des zugriffs nicht dort sein sollten.



  • Da gibt es unterschiedliche Möglichkeiten. Diese hangen auch davon ab, inwiefern eine Instanz überhaupt fehlerhaft sein kann...

    Eine davon ist, den Fehler gar nicht unbehandelt zu lassen. Das heisst, die Klasse muss ständig in einem gültigen Zustand sein. Bevor ein fehlerhafter Zustand eintreten kann, wird dieser überprüft, und gegebenenfalls eine Exception geworfen (oder Rückgabewert, je nachdem). Der alte Zustand wird erst ersetzt, wenn er dadurch immer noch gültig bleibt.

    Eine andere Möglichkeit besteht darin, eine Status-Membervariable einzurichten, die angibt, ob das Objekt in einem gültigen Zustand ist. Operationen in der Klasse werden im Fehlerfall unterbunden. Das sieht man bei den C++-Streamklassen, sonst ist diese Methode aber nicht sehr verbreitet.



  • Nexus schrieb:

    Eine andere Möglichkeit besteht darin, eine Status-Membervariable einzurichten, die angibt, ob das Objekt in einem gültigen Zustand ist. Operationen in der Klasse werden im Fehlerfall unterbunden. Das sieht man bei den C++-Streamklassen, sonst ist diese Methode aber nicht sehr verbreitet.

    Die Methode ist mMn auch ekelhaft. Ich hasse, dass das Programm nen Abgang macht, nur weil nen Stream mal nen Problem hat. Ok, man kann das behandeln (bad(), is_open()), aber ich finde es trotzdem nen schlechten Stil..

    @Topic
    Ich speichere nur Dinge in Membervariablen, die ich auch in anderen Methoden verwende als in der, in der es übergeben wird oder genau weiss, dass es später evtl vom User meiner API gebraucht werden könnte oder zur Anzeige von Statistiken unverzichtbar ist etc. ( Regel #7 nach M. Brownlow, Goldene Regeln der SPieleprogrammierung, "Nutze deine Daten" )
    Ich speichere sie NICHT in einer membervariablen, wenn der Wert von einer anderen Klasse kommt und von dort abfragbar ist.
    Aber das ist meine persönliche Handhabung.
    rya.



  • Hm... ich betrachte das meistens so: die für die Klasse wichtigen Typen, die also eine Existenz als Membervariable "verdienen", übergebe ich gleich dem Konstruktor, der sie dann überprüft, castet, zu Attributen macht o.ä., dann hat man das sicher und muss es nicht jedes mal in einer Memberfunktion wiederholen.

    Parameter von Memberfunktionen werden bei mir grundsätzlich nicht zu Attributen. Mit denen mache ich eher Sachen wie "vergleichen", "suchen", "casten" oder weise ihre Inhalte den Attributen zu, anstatt neue zu erstellen. (Setter-Methode) o.a., sie sind eher Mittel zum Zweck, Membervariablen sind bei mir also ne fundamentale Angelegenheit, Params werden als Referenz oder Zeiger übergeben, verdienen also nicht mal ne richtige Existenz und gehen am Ende des Gültigkeitsbreiches eh verloren und haben ihren Zweck vollbracht.


Anmelden zum Antworten