Benutzt ihr Properties?
-
Gregor schrieb:
Aus meiner Sicht erweckt sie den Eindruck einer Zuweisung, was sie nicht ist. [...]
Aber das Präfix "set" in der Methode erweckt auch den Eindruck einer Zuweisung, oder etwa nicht? Und der Sinn der Properties ist es ja, den getter/settern eine "schönere" Syntax zu geben.
-
c++eus schrieb:
Aber das Präfix "set" in der Methode erweckt auch den Eindruck einer Zuweisung, oder etwa nicht? Und der Sinn der Properties ist es ja, den getter/settern eine "schönere" Syntax zu geben.
Aus meiner Sicht wird bei der Verwendung von Gettern und Settern eindeutig klar, dass sich dahinter eine Methode verbirgt, die diverse Dinge beinhalten kann.
-
also, ich finde sie cool und praktisch und geil.
übrigens... ich komme aus auch der c++ welt.dass sie gegen die kapselung verstossen iss doch absoluter schwachfug.
man kann sie ja auch private oder protected oder was weiss ich noch alles, machen.
oder eben gar nichtich denke, dass eine zuweisung
Bla=10;
einfacher ist als
klasse.SetBla(10);
und
if(Bla==10)
is sicher einfacher als
if(klasse.GetBla()==1=)
.............................
-
und was würde man ohne Properties machen in den modernen IDE's. man würde immer noch mit übertrieb Notepad programmieren. kein Designer, keine schöne Komponenten,...
-
Hi,
Gregor schrieb:
IMHO ist die Syntax irreführend.
ich verstehe ja, daß etwa gelernte Java-Entwickler an ihren settern/gettern hängen.
(Ich komme eher aus der C++-Ecke, nörgele immer noch an den Interfaces herum und versuche instinktiv "drum herum" zu programmieren ...)
Aber was ist anauto.AnzahlRaeder = 4;
denn "irreführend"?
-
ich würde wetten, dass danach auto.AnzahlRaeder == 5 ist !?
-
Eure Probleme möchte ich mal haben. Fact ist, dass mir Properties viele Möglichkeiten geben Anwendung (Komponenten) sicherer und stabiler zu machen und auch Designer-fähig zu machen.
Beispielweise nutze ich Properties im Debug-Modus als Private-Members um herauszufinden wer das jeweilige Feld verändert hat. Erleichert mir das Debuggen erheblich.
#if DEBUG private int _Test; private int Test { get { return this._Test; } set { this._Test = value; } } #else private int Test; #endif
-
fffffffff schrieb:
dass sie gegen die kapselung verstossen iss doch absoluter schwachfug.
man kann sie ja auch private oder protected oder was weiss ich noch alles, machen.
oder eben gar nichtDu verstehst Kapselung nicht. Kapselung ist nicht, den Zugriff einzuschränken oder zu Überwachen, sondern zu abstrahieren und konkrete Details zu verbergen (!= gegen unbefugten Zugriff schützen), eine Schnittstelle unabhängig von der Implementierung zu ermöglichen.
-
Scania schrieb:
Beispielweise nutze ich Properties im Debug-Modus als Private-Members um herauszufinden wer das jeweilige Feld verändert hat. Erleichert mir das Debuggen erheblich.
#if DEBUG private int _Test; private int Test { get { return this._Test; } set { this._Test = value; } } #else private int Test; #endif
Da ziehe ich den Debugger vor, der immer anhält, wenn der Wert der Variablen geändert wird.
-
dschensky schrieb:
Aber was ist an
auto.AnzahlRaeder = 4;
denn "irreführend"?
Es könnte zum Beispiel Nebeneffekte haben, die von der Syntax her IMHO nicht zu erwarten sind.
-
fffffffff schrieb:
ich denke, dass eine zuweisung
Bla=10;
einfacher ist als
klasse.SetBla(10);
Siehste, du bist schon auf die Syntax hereingefallen, denn dein "Bla=10;" ist in Wirklichkeit keine Zuweisung.
-
Gregor schrieb:
dschensky schrieb:
Aber was ist an
auto.AnzahlRaeder = 4;
denn "irreführend"?
Es könnte zum Beispiel Nebeneffekte haben, die von der Syntax her IMHO nicht zu erwarten sind.
Naja, ein setWheels() sollte auch keine Nebeneffekte haben - zumindest wuerde ich davon nicht erwarten, dass auf einmal die Fahrertuer aufgeht :p
Ich bin auch kein Freund von Properties - aber ich sehe da weder Vor- noch Nachteile.
Klar, Properties koennen Neulinge verwirren - aber das koennen alle Sprachfeatures.
Und die Kapselung brechen sie auch nicht - wie denn auch? Nur weil die Syntax eine andere ist?
Das einzige was ich doch etwas komisch finde ist, wenn man
foo.bar=3;
machen kann, aber bei einem
print(foo.bar);
einen Fehler bekommt.Allerdings habe ich noch keine 'set-only' Verwendung gesehen.
Trotzdem bevorzuge ich getter/setter - allerdings ohne besonderen Grund (einfach Geschmackssache).
Was ist denn nun aber genau der Nachteil an Properties? Durch ihre Einfuehrung hat man nun statt jeder Zuweisung eine Funktion. Einzig, dass es ungewohnt ist - dass man Member aendert und dann keine Update Funktion oder aehnliches aufrufen muss
-
da ist ja wieder das problem (siehe size_t/hungarian thread). properties muss man irgendwie kennzeichnen (z.b. indem sie komplett gross geschrieben werden) um sie von normalen variablen zu unterscheiden.
btw: aber da gibt's ja noch ganz andere verwirrtechniken in c# z.b. das 'readonly' keyword
-
Shade Of Mine schrieb:
Naja, ein setWheels() sollte auch keine Nebeneffekte haben - zumindest wuerde ich davon nicht erwarten, dass auf einmal die Fahrertuer aufgeht :p
Das Objekt könnte zum Beispiel eine Variable "Reifenzustand" haben, die als Nebeneffekt verändert wird.
Aber nimm mal ein anderes Beispiel. Wie wäre es mit einer Klasse für komplexe Zahlen, die die Properties Real, Imaginary, Argument und Norm hat. Du wirst hier Nebeneffekte haben, es ist also nicht nur ein theoretisches Problem. ...aus meiner Sicht ist es nunmal extrem verwirrend, wenn ein x.A = b. keine Zweisung ist. x.A muss hier ja nichtmal existieren.
BTW: Mit "impliziten Dingen" in Java bin ich auch nicht glücklich. Das neue Autoboxing gefällt mir z.B. überhaupt nicht.
-
Optimizer schrieb:
Das tust du mit den Proberties i.d.R. nicht, da sie oft wirklich nur auf eine Variable abgebildet werden.
ähm, es gibt im Hintergrund, also in der Verarbeitung von Properies, kein Unterschied zwischen einer "Geter-Setter-Methoden"- Lösung
Wenn man ein Fehler in einem Property verursacht, kann man im Debugger auch sehen, dass sich hinter dem Property zwei Methoden (sofern get und set drin sind) verbergen.Properties verbergen genauso gut Variablen wie Methoden. Wenn jemand eine Variable einfach durchreichen oder setzen möchte, kann er dass auch in der Methoden-Variante machen.
Optimizer schrieb:
Ich finde sie nicht generell nutzlos, so wie bei einer Form macht es schon Sinn. Vielleicht ist die Faustregel "statt public variable ein Proberty" nicht so schlecht.
Nutzlos keineswegs. Ich sehe Properies in einer Klasse auch als Eigenschaft an. Methoden sind halt irgendwelche Aktionen in der Klasse, welche ausgeführt werden können. Eine derartige Differenzierung macht durchaus Sinn und hat auch viele Vorteile.
Siehe auch Datenbindung.Optimizer schrieb:
Properties sind eine großartige Sache!
Aber IMHO mit Vorsicht zu genießen. Von allen neuen C# Features hätte ich auf jeden Fall auf dieses am ehesten verzichten können.
Ich bin froh, dass es drin ist.
-
Gregor schrieb:
dschensky schrieb:
Aber was ist an
auto.AnzahlRaeder = 4;
denn "irreführend"?
Es könnte zum Beispiel Nebeneffekte haben, die von der Syntax her IMHO nicht zu erwarten sind.
ja, aber hat das nicht eher was mit schlechten Klassendesign zu tun als mit den Properties selbst ?
Also lass uns da nicht vom Thema abweichen
-
AndreasW schrieb:
ja, aber hat das nicht eher was mit schlechten Klassendesign zu tun als mit den Properties selbst ?
Ne, das hat nichts mit schlechtem Klassendesign zu tun. Solche Nebeneffekte können sich während der Entwicklung einer Klasse ganz automatisch ergeben, wenn sich zum Beispiel die konkrete Implementation durch ein Refactoring ändert.
-
Beispiel die konkrete Implementation durch ein Refactoring ändert.
ok, nenne mir ein Beispiel eines Nebeneffektes. Erkläre dabei welche Rolle dabei das Property selbst spielt, und wie du das mit der Methoden-Variante verhinderst.
-
AndreasW schrieb:
ok, nenne mir ein Beispiel eines Nebeneffektes. Erkläre dabei welche Rolle dabei das Property selbst spielt, und wie du das mit der Methoden-Variante verhinderst.
Ich habe oben bereits ein Beispiel einer Klasse angegeben, die nicht ohne Nebeneffekte programmiert werden kann. Das Problem sind aber nicht die Nebeneffekte ansich, sondern der Eindruck der Zuweisung, der bei der gegebenen Syntax der Properties entsteht. Man hat nicht mehr den Eindruck, dass eine Methode aufgerufen wird, was ich für schlecht halte. Bei Methoden weiß ich, dass sich darin vieles verbergen kann. Wenn ich ein "=" sehe, dann denke ich, dass das eine Zuweisung ist, bei der sonst nichts passiert.
-
Das musst du aber nur denken, wenn es in deinen Klassen public-Variablen gibt, was auf einen Designfehler deuten würde, weil man nie Properties und Publicvars mischen sollte.