Marc Reichelt: Getter/Setter Methoden vs. properties

Beitrag lesen

Hallo Christian,

überall wird propagiert, dass man das interne Verhalten einer Klasse (z.B. in Java oder C#) nach außen verstecken sollte. Das bedeutet v.a. dass man keine Objekt Variablen benutzen, sondern alles über getter/setter Methoden bzw. Properties ansprechen soll.

Wie ist es in JavaScript? Es ist zwar nicht so streng objektorientiert, aber dennoch möchte man ja sauberen Code schreiben.
Sollte ich also auch dort meine Objekt Variablen in setter/getter Methoden kapseln? Eine private ObjektVariable würde ich mangels des private Schlüsselworts z.B. mit einem "_" Präfix kennzeichnen, was sowieso schon oft Konvention ist.

Wie in vielen Dingen gilt auch bei JavaScript: Entscheidend ist, was du draus machst.

Ich demonstriere den Sinn von get/set-Methoden gerne am Beispiel eines Raumschiffs.
In JavaScript könnte dies beispielsweise so aussehen:

function Spaceship() {  
  this._speed = 0;  
  
  this.getSpeed = function() {  
    return this._speed;  
  }  
  
  this.setSpeed = function(speed) {  
    this._speed = speed;  
  }  
}

Soweit könnte man statt den get/set-Methoden auch einfach das Attribut _speed verwenden, das ist klar.
Möchte man das Raumschiff aber nun im Verlauf der Entwicklung ändern, sodass es nur noch gültige Geschwindigkeiten (Zahlen im Bereich der Lichtgeschwindigkeit) entgegennimmt, ist dies nur mit einer set-Methode möglich.

Das folgende Beispiel illustriert dies:

function Spaceship() {  
  this.LIGHTSPEED = 299792458;  
  this._speed = 0;  
  
  this.getSpeed = function() {  
    return this._speed;  
  }  
  
  this.setSpeed = function(speed) {  
    if (Math.abs(speed) <= this.LIGHTSPEED) {  
      this._speed = speed;  
    }  
  }  
}

Ohne die get/set-Methoden müssten wir nun alle Codestellen anpassen, die das Attribut direkt ändern.

Auch in JavaScript gilt: Der Status eines Objekts wird konsistent gehalten.
Natürlich könnte bösartiger Code einfach das Attribut _speed ändern. Solange aber alle die Regel der Konsistenz einhalten ist die Fehlerbehebung viel einfacher, da er sich auf die Klasse beschränkt.

Grüße

Marc Reichelt || http://www.marcreichelt.de/

--
panic("Oh boy, that early out of memory?");
        linux-2.2.16/arch/mips/mm/init.c
Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)