PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Private und Konstante Variablen



Cornix
02.07.2010, 17:15
Guten Tag, und erneut hoffe ich hie Antworten finden zu können.

Ich habe eine Frage welche wohl recht simpel und lächerlich klingen mag, allerdings weis ich als Informationstechnick-Laie, welcher niemals Informatik oder ähnliches studiert oder in großem Maße gelernt hat, tatsächlich nicht was denn genau der Unterschied zwischen privaten und konstanten Variablen darstellt.

Ich weis zum Beispiel, dass ich keinen Attribut Accessor für eine Konstante bestimmen kann, ich weis auch, dass konstante Variablen wahrscheinlich effizienter als private sind.
Aus dem Namen lässt sich zwar schließen, dass eine Konstante einen immerwährend festen Wert besitzt allerdings habe ich durch einen einfachen Test herausgefunden, dass dies nicht stimmt, da man sie mehrmals deklarieren kann.

Bitte klärt mich auf, wofür benutze ich Konstante? Wie benutze ich sie am besten und was gilt dabei beachtet zu werden?
Außerdem, welchen Effekt wird es haben unnötige private Variablen durch konstante aus zu tauschen?

Vielen Dank.
Cornix.

-KD-
02.07.2010, 17:39
Konstanten sind konstant, ändern also ihren Wert nicht. Du kannst ihren Wert lediglich im Scripteditor, außerhalb einer Methode ändern. Innerhalb einer Methode lassen sich Konstanten nur über einen Umweg ändern. Aber selbst dann: Jedes Mal wenn du eine Konstante änderst, wird eine Warnung ausgegeben. Nur die sieht man beim RPGMaker nicht, wenn man das Programm nicht über die Konsole öffnet. Konstanten lassen sich also im Allgemeinen nur "manuell" ändern, nicht aber durch irgendein Script (wie gesagt, über Umwege ist es möglich, aber auch das ist eher unüblich und nur für spezielle Anwendungsfälle gedacht).

Schneller ist der Zugriff auf Konstanten nicht unbedingt. Aber wenn du eine Variable willst, die ihren Wert nicht ändert und auf die man von überall zugreifen kann, dann definierst du dir eben eine Konstante.

Im übrigen sind Instanzvariablen ja auch nicht global. Jedes Objekt hat seine eigene Belegung für die Instanzvariablen. Darum lassen sich Konstanten und Instanzvariablen schlecht vergleichen.


welchen Effekt wird es haben unnötige private Variablen durch konstante aus zu tauschen?Wenn du Informationen hast, die über mehrere Objekte hinweg mitgegeben werden sollen, dann ist eine Instanzvariable ungeeignet. Hier musst du unterscheiden: Sollen mehrere Objekte schreibend und lesend auf die Variable zugreifen, dann solltest du eine Klasseninstanzvariable verwenden. Sollen mehrere Objekte nur lesend auf eine unveränderliche Variable zugreifen, dann solltest du Konstanten verwenden. Soll jedes Objekt einen eigenen "Speicher" haben, dann verwendest du Instanzvariablen.

Cornix
03.07.2010, 00:23
Vielen vielen Dank, soweit habe ich alles verstanden bis auf die Tatsache welchen Vorteil diese Konstante denn nun wirklich hat.

Immerhin hast du gerade selbst gesagt, dass der Zugriff auf die Variable nicht schneller von statten geht. Und globale Variablen können auch von allen Objekten angesprochen werden.

Verbrauchen sie vielleicht weniger Speicherplatz da sie keine Funktionen wie += oder dergleichen besitzen?

MagicMagor
03.07.2010, 08:51
Ich weiß jetzt nicht genau wie Ruby intern Konstanten verwaltet, aber wenn man sich im Prinzip anguckt wie Konstanten auch in anderen Sprachen funktionieren ist der Ausdruck "Konstante Variablen" ein Widerspruch in sich.

Normalerweise sind Konstanten nur ein Hilfsmittel für den Programmier sich Arbeit zu ersparen und den Code lesbarer zu machen, da anstatt einer Zahl eben eine Konstante im Code steht.
Nehmen wir mal einfach an die Richtung wird durch eine Zahl codiert:


if (direction==0)
# do stuff
end
if (direction==1)
# do other stuff
end

Ohne zusätzliche Kommentare ist das nicht unbedingt lesbar.
Jetzt können wir für die Richtung aber Konstanten anlegen und das ganze wird plötzlich deutlich lesbarer:


if (direction==DIR_NORTH)
# do stuff
end
if (direction==DIR_EAST)
# do other stuff
end

Ein weiterer Vorteil von Konstanten ist das man bei einer Änderung nicht an allen Stellen wo der Wert verwendet wird etwas ändern muss, sondern nur dort wo der Konstante dieser Wert zugewiesen wird.

Man könnte das ganze natürlich auch mit globalen Variablen lösen, aber das ist eigentlich eine Zweckentfremdung der globalen Variablen. Daneben haben globale Variablen (also $foo) den Nachteil im globalen Namensraum zu leben, während man Konstanten problemlos in den Namensraum zugehöriger Module packen kann und dennoch jederzeit auf sie zugreifen kann (zB Input::B).

Ich kenne mich zuwenig mit den interna von Ruby aus um sagen zu können ob Konstanten schneller sind als Variablen oder weniger Speicher verbrauchen, aber Konstanten zu benutzen wo man Konstanten benutzen sollte und eben nicht globale Variablen ist guter Programmierstil und vereinfacht auch anderen Programmierern das Lesen des Codes (aha hier wird ein konstanter Wert abgefragt) und erleichtert dem Programmierer vielleicht auch den Wechsel zu anderen Sprachen.
Es gibt nämlich Sprachen wo Konstanten keinerlei Speicher verbrauchen weil sie einfach beim Compilieren durch ihren Wert ersetzt werden.

Nicht immer gibt es einen Vorteil in Performance oder Speicherverbrauch oft ist es auch einfach die Lesbarkeit und Wartbarkeit des Codes die ausreichen um bestimmte Sachen so zu machen und nicht anders.
Ich würde sogar sagen, Lesbarkeit ist wichtiger als Performance, solange nicht die Performance ein bekanntes Problem der bisherigen Lösung ist und die unlesbare Lösung eine massive Performance-Steigerung bringt. Und selbst dann würde ich eher andere Möglichkeiten suchen die Performance zu verbessern, anstatt eine lesbare Lösung durch eine unlesbare zu ersetzen.

Cornix
03.07.2010, 09:54
Vielen Dank, sehr hilfreich. Schon wieder ein wenig gelernt.

-KD-
03.07.2010, 13:03
Verbrauchen sie vielleicht weniger Speicherplatz da sie keine Funktionen wie += oder dergleichen besitzen?
Achtung. Nur Klassen besitzen Methoden (und damit Funktionen). Objekte besitzen Attribute. Variablen sind nur eine Referenz auf ein Objekt. Intern darfst du dir Variablen also nur als Objekt-ID bzw. Speicheradresse vorstellen. Es werden keine Daten in Variablen abgespeichert. Wenn du also z.B. schreibst a = "Hallo", dann ist der String "Hallo" nicht in der Variable a abgespeichert. Er wird im Objektraum abgespeichert. Die Variable a merkt sich nur die Objekt-ID des Strings "Hallo" um im Bedarfsfall auf diesen zuzugreifen.



Man könnte das ganze natürlich auch mit globalen Variablen lösen, aber das ist eigentlich eine Zweckentfremdung der globalen Variablen. Daneben haben globale Variablen (also $foo) den Nachteil im globalen Namensraum zu leben, während man Konstanten problemlos in den Namensraum zugehöriger Module packen kann und dennoch jederzeit auf sie zugreifen kann [...] aber Konstanten zu benutzen wo man Konstanten benutzen sollte und eben nicht globale Variablen ist guter Programmierstil und vereinfacht auch anderen Programmierern das Lesen des Codes (aha hier wird ein konstanter Wert abgefragt) und erleichtert dem Programmierer vielleicht auch den Wechsel zu anderen Sprachen.Magor bringts auf den Punkt. Das sind, denke ich, die ausschlaggebenden Vorteile von Konstanten. Performance-Vorteile bieten sie jedenfalls keine.