Thread Schönes Perl - OOP, getter, setter
(10 answers)
Opened by styx-cc at 2014-04-04 18:11 2014-05-11T08:33:56 Muffi Ja, ich verstehe schon was Du meinst, ist auch richtig und funktioniert. Bis auf den Mehrwert: Den gibts wirklich ;) Ich hole mal ein bischen weiter aus mit einem anderen Beispiel: Wegen einer sauberen Trennung der Fehlerbehandlung bez. Anwendungs- oder Eingabefehler wird der Konstruktor an dieser Stelle NICHT die userid validieren, so kann in $@ nur der Text für eine Exception stehen, die geworfen wird, wenn der Layer 'MySQL' nicht verfügbar ist (keine Verbingung zu MySQL). So stehen in %user zunächst gar keine Daten und die Instanz $userobject hat nur das Attribut userid. Nun kommt der Getter ins Spiel und der hat den Namen FETCH. Code (perl): (dl
)
my $vname = $user{vname}; FETCH wird nun aufgerufen aufgrund der Bindung tie(), FETCH wird mit dem privaten Attribut userid über den Layer nach den Daten greifen und jetzt kommt der springende Punkt, auf den ich hinauswill: 1) Es wird nur vname aus der DB gelesen, 2) Es werden alle Attribute des Users, vname, name, plz, ort, str usw. auf einmal geholt. Klarer Fall, bei (1) wird jedesmal eine Abfrage nach MySQL gesendet. Auch wenn die Session bereits besteht und ein prepared Statement verwendet wird, kostet das Zeit. Im Fall (2) erfolgt die Abfrage nur beim Erstenmal. Jedes weitere FETCH Code (perl): (dl
)
my $ort = $user{ort}; kann auf Attribute zurückgreifen, die bereits in der Instanz vorliegen. Die Validierung, betreff einer sauberen Trennung der Fehlerbehandlung, erfolgt ebenfalls beim Aufruf des Getters FETCH: Wenn die userid nicht valide ist, kann es sich nur um einen Eingabefehler handeln (der Programmierer wendet die Klasse ansonsten richtig an). Mehrwert also: Alle Daten, die organisatorisch zusammengehören, liegen als Attribute im Objekt, in der Instanz der Klasse und es kann performant darauf zzugegriffen werden. Wenns ein bischen mehr Mehrwert sein darf ;) Code (perl): (dl
)
1 2 $userobject->validate(userid => param('userid') ) or die $@; # netter Versuch Es wird keine neue Instanz erstellt, denn ein weiteres Attribut der bereits vorliegenden Instanz ist eine standhafte DB-Verbindung, die wir so nicht neu aufbauen müssen. Die Methode validate() wird userid an den Getter named FETCH durchreichen, fertig ;) validate() ist ein Setter, alle Getter heißen FETCH. Ich denke, die Philosophie der Getter und Setter wird verständlicher, wenn Du mal eine eigene Tie-Klasse schreibst ;) Tags: Performance, Code-Redundanzen, wiederverwertbarer Code, Datenabstraktion. Last edited: 2014-05-11 14:34:46 +0200 (CEST) |