Crysis nerd
Freizeitschrauber(in)
Ich weiß, es klingt wie eine Anfängerfrage, aber ich möchte gerne mal zu einer Sache eure Meinung hören. Und zwar folgendes:
Überall wo man hingeht, wird man angebrüllt "MACH ALLE INSTANZ VARIABLEN PRIVATE MATHAFUCKAAAA!!!11".
Und ich sage: "Nein!" *haha*.
Okay, ernsthaft, was möchte ich?
Erinnern wir uns nochmal zurück: Was ist denn die grundlegende Idee der OOP (Objekt orientierten Programmierung)? Eine der Hauptideen ist auf jeden Fall die Kapselung. Von außen soll man nur das sehen, was für einen Notwendig ist. Die innere Logik bleibt gefällgst auch innen. Und vorallem wichtig beim Prinzip der Kapselung ist, dass nur meine eigenen Funktionen meine internen Daten verändern und ich mir so nichts kaputt mache.
Und da liegt ja auch schon mein Hauptanliegen: Ich habe (rein) interne Daten, damit sie von außen nicht kaputt gemacht werden können. Aber was heißt "kaputt"? Kaputt heißt nämlich, dass mein Objekt in einem inkosistenten Zustand vorliegt. Und was heißt inkonsistent?
Ein Beispiel:
Nehmen wir den std::string aus der C++ Standardbibliothek, eine normale String Klasse. Die Klasse speichert eine Zeichenkette variabler länge und hat einige nette Methoden um auf der Zeichenkette Zeugs zu machen. Aber es gibt auch die Methode size(). Diese gibt die Länge des Strings zurück. Wir möchten jetzt aber nicht die Länge jedes mal berechnen, indem wir die Zeichenkette durchlaufen und nach dem Nullbyte suchen, sondern wir möchten gerne die Länge zwischenspeichern in einer Membervariable und nur verändern, wenn wir die Zeichenkette verändern.
Ok klar? Hier stellen wir jetzt eine Vorraussetzung an die Beziehung der Variablen! Wir verlangen jetzt, dass der Wert, den wir in "length" speichern exakt der Länge der Zeichenkette entspricht. Wenn unsere Vorraussetzung erfüllt ist, ist unser Objekt in einem konsistenten Zustand. Falls allerdings diese Vorraussetzung nicht erfüllt ist, ist unser Objekt in einem inkosistenten Zustand und es wird sehr wahrscheinlich Fehler geben, wenn wir andere Methoden ausführen.
Wenn jetzt unsere Variable length public wäre, könnte ja ein Bösewicht des Weges kommen und diese verändern ohne die Zeichenkette zu verändern. D.h. er bringt unser Objekt in einen inkosistenten Zustand. Daher ist diese Variable eben nicht public.
Das betrifft viele Variablen, sodass viele private gemacht werden sollten. Auch bei Vorraussetzungen an Variablen an sich. Z.B. sollte eine Klasse, die einen Bruch repräsentiert, nie einen Nenner haben, der 0 ist. Das ist die Anforderung an die Klasse, und wenn der Nenner 0 ist, befindet sich das Objekt in einem inkosistenten Zustand.
ABER: Das gilt nicht für alles. Gucken wir uns z.B. eine Vector Klasse an, welche einen 3-dimensionalen Vektor speichern soll. Dazu speichern wir uns 3 Member (x, y und z) des Datentyps float. Supi. Und wenn man sich nach den meisten Tutorials und Lehrbüchern richtet, macht man jetzt die 3 Member private und bauen uns 3 Methoden getX() { return x; } getY()... und getZ()... und nochmal 3 Methoden setX(float xx) { x = xx; } usw..
Tolle Leistung. Haben wir 6 unnötige Methoden, die exakt nur eine Zuweisung tätigen. Jedes mal wenn wir auf die Variable zugreifen wollen oder sie setzen wollen haben wir ein Funktionsaufruf, ein JMP Befehl, einen neuen Stackframe erstellen, den Stackframe wieder abbauen (angenommen der Compiler ist nicht schlau).
Absolut aufwendig und unnötig. Warum sollte man das tun? Unsere Klasse kann durch die Member x,y und z NICHT in einen inkosistenten Zustand kommen. Warum sollten wir unsere Variablen dann schützen?
Wenn doch in den Settern nur exakt eine Zuweisung steht und in den Gettern nur genau eine return Anweisung, weiß man doch schon, dass etwas dumm gelaufen ist.
</Monolog>
Verpass ich was oder seid ihr meiner Meinung? Ich finde, dass sich kaum noch einer Gedanken macht, warum man Membervariablen eigentlich private macht und alle es nurnoch machen, weil man es überall hört. Oder habt ihr noch ein tolles Argument, um mich umzustimmen.
Wäre auf eure Meinung gespannt.
Grüße
Überall wo man hingeht, wird man angebrüllt "MACH ALLE INSTANZ VARIABLEN PRIVATE MATHAFUCKAAAA!!!11".
Und ich sage: "Nein!" *haha*.
Okay, ernsthaft, was möchte ich?
Erinnern wir uns nochmal zurück: Was ist denn die grundlegende Idee der OOP (Objekt orientierten Programmierung)? Eine der Hauptideen ist auf jeden Fall die Kapselung. Von außen soll man nur das sehen, was für einen Notwendig ist. Die innere Logik bleibt gefällgst auch innen. Und vorallem wichtig beim Prinzip der Kapselung ist, dass nur meine eigenen Funktionen meine internen Daten verändern und ich mir so nichts kaputt mache.
Und da liegt ja auch schon mein Hauptanliegen: Ich habe (rein) interne Daten, damit sie von außen nicht kaputt gemacht werden können. Aber was heißt "kaputt"? Kaputt heißt nämlich, dass mein Objekt in einem inkosistenten Zustand vorliegt. Und was heißt inkonsistent?
Ein Beispiel:
Nehmen wir den std::string aus der C++ Standardbibliothek, eine normale String Klasse. Die Klasse speichert eine Zeichenkette variabler länge und hat einige nette Methoden um auf der Zeichenkette Zeugs zu machen. Aber es gibt auch die Methode size(). Diese gibt die Länge des Strings zurück. Wir möchten jetzt aber nicht die Länge jedes mal berechnen, indem wir die Zeichenkette durchlaufen und nach dem Nullbyte suchen, sondern wir möchten gerne die Länge zwischenspeichern in einer Membervariable und nur verändern, wenn wir die Zeichenkette verändern.
Ok klar? Hier stellen wir jetzt eine Vorraussetzung an die Beziehung der Variablen! Wir verlangen jetzt, dass der Wert, den wir in "length" speichern exakt der Länge der Zeichenkette entspricht. Wenn unsere Vorraussetzung erfüllt ist, ist unser Objekt in einem konsistenten Zustand. Falls allerdings diese Vorraussetzung nicht erfüllt ist, ist unser Objekt in einem inkosistenten Zustand und es wird sehr wahrscheinlich Fehler geben, wenn wir andere Methoden ausführen.
Wenn jetzt unsere Variable length public wäre, könnte ja ein Bösewicht des Weges kommen und diese verändern ohne die Zeichenkette zu verändern. D.h. er bringt unser Objekt in einen inkosistenten Zustand. Daher ist diese Variable eben nicht public.
Das betrifft viele Variablen, sodass viele private gemacht werden sollten. Auch bei Vorraussetzungen an Variablen an sich. Z.B. sollte eine Klasse, die einen Bruch repräsentiert, nie einen Nenner haben, der 0 ist. Das ist die Anforderung an die Klasse, und wenn der Nenner 0 ist, befindet sich das Objekt in einem inkosistenten Zustand.
ABER: Das gilt nicht für alles. Gucken wir uns z.B. eine Vector Klasse an, welche einen 3-dimensionalen Vektor speichern soll. Dazu speichern wir uns 3 Member (x, y und z) des Datentyps float. Supi. Und wenn man sich nach den meisten Tutorials und Lehrbüchern richtet, macht man jetzt die 3 Member private und bauen uns 3 Methoden getX() { return x; } getY()... und getZ()... und nochmal 3 Methoden setX(float xx) { x = xx; } usw..
Tolle Leistung. Haben wir 6 unnötige Methoden, die exakt nur eine Zuweisung tätigen. Jedes mal wenn wir auf die Variable zugreifen wollen oder sie setzen wollen haben wir ein Funktionsaufruf, ein JMP Befehl, einen neuen Stackframe erstellen, den Stackframe wieder abbauen (angenommen der Compiler ist nicht schlau).
Absolut aufwendig und unnötig. Warum sollte man das tun? Unsere Klasse kann durch die Member x,y und z NICHT in einen inkosistenten Zustand kommen. Warum sollten wir unsere Variablen dann schützen?
Wenn doch in den Settern nur exakt eine Zuweisung steht und in den Gettern nur genau eine return Anweisung, weiß man doch schon, dass etwas dumm gelaufen ist.
</Monolog>
Verpass ich was oder seid ihr meiner Meinung? Ich finde, dass sich kaum noch einer Gedanken macht, warum man Membervariablen eigentlich private macht und alle es nurnoch machen, weil man es überall hört. Oder habt ihr noch ein tolles Argument, um mich umzustimmen.
Wäre auf eure Meinung gespannt.
Grüße