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..
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.