globale Variablen in einer Klasse oder mehr Parameter für Funktionen?
-
am beispiel kreis..
globale VAriable ist vll. der falsche Ausdruck.. nenen wir deine Variablen mal Members der Klasse..
1. Im Falle Druchmesser.. den würde ich auch "Privat" deklarieren (Information Hiding) und über get/Set methoden verändern...
2. Parameter mit der alle funktionen rechnen.. sind natürlich auch privat, und würde ich evlt. in einer strukt zsuammenfassen, und diesen in den methoden übergeben, wobei du diese nich übergeben müssetest, weil du in den Membermethoden zugriff auf die member variablen der Klasse hast. (sinn einer klasse)
3. Variablen die fest in einer klasse definiert sind (bspw. PI) , welche du evtl. beim anlegen eineer instanz definierst, würd ich "privat const " machen
Sovviel mal zu deinen ersten Überlegungen...
-
konstanten wie pi sollten lieber statische methoden einer hilfsklasse werden. Math::pi() oder so (wenn const vor überschreiben schützt von mir aus auch als public field). wenn eine klasse solche konstanten benötigt, includiert sie einfach den entsprechenden header und verwendet sie.
-
Naja mit pi war nur ein Beispiel und ziemlich schlecht^^
Also im konkreten Fall, den ich nun aber mal verallgemeiner wollte, habe ich zwei char Variablen, die nur für den "temporären" gebruch sind. Also der "User" bekommt von diesen nichts mit, werden aber in allen Funktionen gebraucht.
Was also machen? Beide als member oder als parameter?
-
Grundsätzlich sollen sich Klassen ja wie "reale" Objekte verhalten.
Z.B. stell dir einen Hund vor, dem du sein Fresschen gibst. Du hältst ihm ein Stück Rind hin und sagst "friss".
Du hast entsprechend das Objekt Hund, von dem du eine Methode aufrufst (friss), als Parameter bekommt der Hund das Stück Fleisch. Es würde keinen Sinn machen, wenn du dem Hund noch seine Zähne übergibst oder ihm sagst, in welcher Geschwindigkeit er kauen soll.Und zu der Sache mit dem Kreis: Der Benutzer der Klasse muss/darf/sollte gar nicht wissen, wie der Umfang ausgerechnet wird, also ob über pi, sinus oder sonstwas.
Der Programmierer muss/sollte/darf einfach nur wissen, dass man zum berechnen des Umfangs den Durchmesser angeben muss, denn daraus wird der Umfang berechnet; alles andere muss der Kreis machen. Quasi darf er nur redundante Eingabedaten fordern, oft ist weniger mehr
-
class Kreis{ const double PI 3.14 const double m_dDurchmesser; public: Kreis(double dDurchmesser) : m_dDurchmesser(dDurchmesser){} double calc_Umpfang(){ return m_Durchmesser*PI; }; double calc_Fläche(){ return ((m_Durchmesser/2)*(m_Durchmesser/2)) *PI; }; };wie du siehst haben die methoden keine parameter.. reicht dir das als Anreiz
-
Darum gehts ja....
sollen die Funktionen Parameter haben oder soll ich alles über die member regeln?
-
Kann man nicht pauschal sagen :p Manche Funktionen brauchen eben Parameter, die Methoden der Kreisklasse von Boris aber nicht.
Programmiere einfach vor dich hin, du wirst schon ein Feeling dafür entwickeln
-
Kommt darauf an, wofür du den entsprechenden Wert brauchst. Nimm zum Beispiel badestrand's Methode Hund::friss() - die Zähne und die Kaugeschwindigkeit des Hundes sind ein Teil von ihm und sollten deshalb als Member gehalten werden, das Futter übergibst du als Parameter.
(Bei deinem Kreis gilt: Der Durchmesser ist Teil des Kreises und damit Member, Pi ist eine Konstante - die legst du entweder global oder als statischen Member an, Parameter brauchst du nur, wenn du die Kreisgröße ändern willst (im Setter des Durchmessers))
-
Noch ein Anreiz:
Als extra Methode Zylinder berechnen, muss man die höhedes Zylinder übergeben, der rest kommt vom Kreis objekt... würde ich nun noch die höhedes Zylinder in das Kreis klasse implementieren, wäre die klasse nicht mehr im logischen denken komplett, aus es wäre eine "Zylinder klasse"
[cpp]Kreis(double dDurchmesser) : m_dDurchmesser(dDurchmesser){}
double calc_Umpfang(){
return m_Durchmesser*PI;
};
double calc_Fläche(){
return ((m_Durchmesser/2)*(m_Durchmesser/2)) *PI;
};
double calc_Zylinder(double dHeight){
return (((m_Durchmesser/2)*(m_Durchmesser/2)) *PI)* dHeight;
};};[/cpp]
-
Pi ist wohl am besten in einem Präprozessor-Define oder einer statischen inline Methode aufgehoben.
Noch besser wäre eine statische Konstante wenn denn C++ damit ordentlich umgehen könnte, was bei floats/doubles leider nicht gegeben ist.