Klassenvariablen nicht erwartungskonform
Winfried Mueller <[email protected]>
| Newsgroups | gmane.comp.lang.ruby.german |
|---|---|
| Message-ID | <[email protected]> |
Hallo, vielen Dank erstmal an alle, die mir so schnell bei dem Problem geholfen haben. Hier noch einige Hinweise, die ich mal zur Diskussion stelle: 1. Klassenvariablen verhalten sich m.E. nicht erwartungskonform. In C++ bspw. ist es so, das Klassenvariablen - wie der Name schon sagt - mit der Klasse verbunden sind. Sie werden zwar mit vererbt, trotzdem hat jede Klasse seine eigene Instanz dieser Variablen. In Ruby gibt es nur eine Instanz für alle Klassen in der Vererbungshierarchie - das ist ein anderes Konzept wie ich es aus der OO-Programmierung kenne. Die UML sagt bspw zu Klassenattribut..."liegt vor, wenn nur ein Attributwert für alle Objekte einer Klasse existiert." Hier steht also einer Klasse und nicht der ganzen abgeleiteten Klassen. Gleiches steht in "Programmierung in Ruby". Das gewählte Konzept verwirrt auch, weil sich Klassenmethoden anders verhalten. Diese gilt nämlich genau für diese Klasse und nicht für alle Klassen einer Klassenhierarchie. Überlädt man eine Klassenmethode in einer abgeleiteten Klasse, betrifft das nicht gleich die ganze Hierarchie. Es ist auch fehleranfällig und führt zu Seiteneffekten. Ich glaube deshalb, das es ein Fehler in der Implementierung von Ruby ist, das dieses Verhalten nicht bewußt angestrebt wurde. 2. Konstanten in Klassen verhalten sich eher wie Klassenvariablen (Klassenkonstanten), wie ich sie aus der OO-Programmierung kenne. Es gibt aber erhebliche Einschränkungen, wie meine vorherige Mail gezeigt hat. (Was daran liegt, das man in Klassenmethoden die Konstante voll qualifizieren muß, also Klasse::Konstante) 3. Ich sehe keine Möglichkeit, wie man das Konzept einer Klassenvariable, wie sie in UML üblich ist (Variable gehört zur Klasse und nicht zur Klassenhierarchie), in Ruby umsetzen kann. Für mein Beispiel brauchte ich eine Konstante, was sich über eine Klassenmethode lösen lies. Braucht man aber eine Variable, fällt mir keine Lösung ein. 4. In diesem Zusammenhang fällt mir auch auf, das es hilfreich wäre, wenn ruby sowas wie static Variablen in C/C++ hätte. Dann könnte man nämlich auch eine Klassenvariable mit einer Klassenmethode emulieren. Außerdem ist eine static Variable oft hilfreich, um die Performance von Programmen zu erhöhen. Im Moment ist es ja so, das jedesmal, wenn ein Block verlassen wird, die Variable freigegeben und beim nächsten Eintreten wieder neu angelegt wird. ..Winfried..