Thread Schönes Perl - OOP, getter, setter (10 answers)
Opened by styx-cc at 2014-04-04 18:11

rosti
 2014-05-10 13:49
#175457 #175457
User since
2011-03-19
3492 Artikel
BenutzerIn
[Homepage]
user image
Es ist nicht so trivial, wie das manche Tutorials vermitteln mit den Gettern. Schaffe in Deinen Klassen/Modulen Klarheit, ob bei einem Getter auch Argumente erlaubt sind oder nicht. Sind Argumente erlaubt, dürfen die nicht die Instanz verändern, denn das ist Sache eines Setters.

Es ist unerheblich, ob ein Getter intern direkt auf _ein_ privats Attribut zugreift, oder den return-Value unter Zuhilfenahme weiterer privater Attribute kalkuliert. Genau aus diesem Grund leitet sich die Empfehlung ab, dass eine Anwendung nicht selbst direkt auf _ein_ Attribut zugreifen soll, denn es könnte Abhängigkeiten geben, die nur das Modul und der Getter kennt. So ist ein Getter die Schnittstelle nach draußen und so definiert, dass etwaige Abhängigkeiten in den return-Value eingehen.

Getter mit/ohne Argumente
===========================

Beispiel:
Code (perl): (dl )
1
2
3
4
my $sca = Scaliger->new();             # instance 4 today
$sca->wochentag;                       # Samstag
$sca->wochentag( date => '4.10.1582'); # Donnerstag
$sca->wochentag;                       # Samstag 


Ein komfortabler Getter, der mal eben einen anderen Wert berechnet, ohne dass die Instanz verändert wird. Intern wird ein clone erzeugt und dessen Lebensdauer begrenzt sich auf die Methode.

Setter
===========

Eine andere Methode jedoch:
Code (perl): (dl )
1
2
3
4
5
$sca->wochentag; # Samstag
$sca->add(1);
$sca->wochentag; # Sonntag
$sca++;          # use overload "++"
$sca->wochentag; # Montag


Methode add() ist ein Setter, denn es wird die Instanz verändert, alle internen Attribute werden neu kalkuliert. Ausgewählte Setter können Operatoren überlagern, im Beispiel zeigt overload "++" auf add(1).

At least: Es spricht nichts dagegen, einen Getter so zu benennen, wie ein Attribut namentlich lautet. Ein Setter jedoch, setzt nicht irgendein Attribut schlechthin, sondern verändert die Instanz! Getter-Namen like setAttributeName() sind irreführend, weil ein Setter nicht nur _ein_ Attribut ändert.

View full thread Schönes Perl - OOP, getter, setter