From hjp-vienna-pm-list at hjp.at Tue May 21 15:36:59 2002 From: hjp-vienna-pm-list at hjp.at (Peter J. Holzer) Date: Thu Aug 5 00:23:57 2004 Subject: [vienna.pm] Aufruf namentlich bekannter Methoden Message-ID: <20020521223659.A9820@teal.h.hjp.at> Angenommen, ich habe eine Klasse mit vielen Getter/Setter-Methoden, und m?chte jetzt viele davon aufrufen. Das kann ich nat?rlich sequentiell machen: my $apple = Fruit->new(); print "Diameter: ", $apple->diameter(); print "Color: ", $apple->color(); print "Taste: ", $apple->taste(); print "Has worm: ", $apple->has_worm(); ... was aber ziemlich unelegant ist. besser gef?llt mir da schon: for (( [ diameter => 'Diameter' ], [ color => 'Color' ], [ taste => 'Taste' ], [ has_worm => 'Has worm' ], )) { my ($method, $label) = @$_; print "$label: ", eval "\$f->$method", "\n"; } aber da? ich da den Methodenaufruf in einem String zusammenbasteln und dann eval'uieren muss, st?rt mich rein ?sthetisch und k?nnte bei manchen Applikationen auch negative Auswirkungen auf die Performance haben. Hat jemand eine bessere Idee? hp -- _ | Peter J. Holzer | > Ben?tigt man f?r Linux einen Virenscanner? |_|_) | Schriftf?hrer LUGA | Nein. | | | hjp@luga.at | Linux bootet und l?uft auch ohne Virenscanner __/ | http://www.luga.at/ | einwandfrei. -- Heimo Schoen in al -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 232 bytes Desc: not available Url : http://mail.pm.org/archives/vienna-pm/attachments/20020521/56a3a795/attachment.bin From domm at zsi.at Tue May 21 16:25:21 2002 From: domm at zsi.at (Thomas Klausner) Date: Thu Aug 5 00:23:57 2004 Subject: [vienna.pm] Aufruf namentlich bekannter Methoden In-Reply-To: <20020521223659.A9820@teal.h.hjp.at>; from hjp-vienna-pm-list@hjp.at on Tue, May 21, 2002 at 10:36:59PM +0200 References: <20020521223659.A9820@teal.h.hjp.at> Message-ID: <20020521232521.I414@zsi.at> * * * vienna-pm-list * * * Hi! On Tue, May 21, 2002 at 10:36:59PM +0200, Peter J. Holzer wrote: > Angenommen, ich habe eine Klasse mit vielen Getter/Setter-Methoden, und > m?chte jetzt viele davon aufrufen. > print "$label: ", eval "\$f->$method", "\n"; > aber da? ich da den Methodenaufruf in einem String zusammenbasteln und > dann eval'uieren muss, st?rt mich rein ?sthetisch und k?nnte bei manchen > Applikationen auch negative Auswirkungen auf die Performance haben. > > Hat jemand eine bessere Idee? An sich geht das auch einfach mit $f->$method also ohne eval und String-basteln, zB: #!/usr/bin/perl -w use strict; package test; my $t=bless {},__PACKAGE__; foreach (qw(a b c)) { print $t->$_; } sub a { "a" } sub b { "b" } sub c { "c" } __END__ BTW, den foreach kann man natuerlich auch etwas leserlicher schreiben: foreach my $method (qw(a b c)) { print $t->$method; } -- D_OMM +----> http://domm.zsi.at <-----+ O_xyderkes | neu: Arbeitsplatz | M_echanen | http://domm.zsi.at/d/d162.html | M_asteuei +--------------------------------+ ### You are subscribed to vienna-pm-list as Thomas Klausner http://www.fff.at/fff/vienna.pm/ From hjp-vienna-pm-list at hjp.at Tue May 21 17:11:35 2002 From: hjp-vienna-pm-list at hjp.at (Peter J. Holzer) Date: Thu Aug 5 00:23:57 2004 Subject: [vienna.pm] Aufruf namentlich bekannter Methoden In-Reply-To: <20020521232521.I414@zsi.at>; from domm@zsi.at on Tue, May 21, 2002 at 11:25:21PM +0200 References: <20020521223659.A9820@teal.h.hjp.at> <20020521232521.I414@zsi.at> Message-ID: <20020522001135.B9820@teal.h.hjp.at> On 2002-05-21 23:25:21 +0200, Thomas Klausner wrote: > On Tue, May 21, 2002 at 10:36:59PM +0200, Peter J. Holzer wrote: > > Angenommen, ich habe eine Klasse mit vielen Getter/Setter-Methoden, und > > m?chte jetzt viele davon aufrufen. > > print "$label: ", eval "\$f->$method", "\n"; > > aber da? ich da den Methodenaufruf in einem String zusammenbasteln und > > dann eval'uieren muss, st?rt mich rein ?sthetisch und k?nnte bei manchen > > Applikationen auch negative Auswirkungen auf die Performance haben. > > > > Hat jemand eine bessere Idee? > An sich geht das auch einfach mit > $f->$method Nein: syntax error at ./fruit.pl line 57, near "$method," (perl 5.005_03) Aber $f->$method() funktioniert. Danke, das h?tte ich gleich probieren k?nnen (normalerweise schreibe ich die Klammern als alter C-Programmierer eh immer, keine Ahnung, warum ich sie diesmal weggelassen habe). hp -- _ | Peter J. Holzer | > Ben?tigt man f?r Linux einen Virenscanner? |_|_) | Schriftf?hrer LUGA | Nein. | | | hjp@luga.at | Linux bootet und l?uft auch ohne Virenscanner __/ | http://www.luga.at/ | einwandfrei. -- Heimo Schoen in al -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 232 bytes Desc: not available Url : http://mail.pm.org/archives/vienna-pm/attachments/20020522/6b71b3be/attachment.bin From k.zoechling at wirtschaftsblatt.at Tue May 21 17:33:24 2002 From: k.zoechling at wirtschaftsblatt.at (Karlheinz) Date: Thu Aug 5 00:23:57 2004 Subject: [vienna.pm] Aufruf namentlich bekannter Methoden In-Reply-To: <20020521223659.A9820@teal.h.hjp.at> Message-ID: <20020521223052.PXEJ22718.viefep13-int.chello.at@neu> * * * vienna-pm-list * * * ist es denn wirklich so furchtbar den code On Tue, 21 May 2002 22:36:59 +0200, Peter J. Holzer wrote: > my $apple = Fruit->new(); > > print "Diameter: ", $apple->diameter(); > print "Color: ", $apple->color(); > print "Taste: ", $apple->taste(); > print "Has worm: ", $apple->has_worm(); zu akzeptieren? mir ist schon klar dass die sache etwas "theoretisches" hat und etwas von in-perl-muss-das-doch-eleganter-gehen. aber: ich zum beispiel bin ein ziemlich durchschnittlicher perl programmierer und darf u.a. eine applikation warten die nicht von mir geschrieben wurde, wenig nuetzliche kommentare enthaelt und leider ziemlich voll ist von strukturen der art foreach (@irgendwas) { $t->$_; } das ist okay wenn @irgendwas 10 zeilen darueber definiert ist, aber es ist definitiv nicht mehr okay wenn @irgendwas mal 1000 zeilen vorher ueber eine logik der art if ($x == 1) { @irgendwas = $someopackageobject->method() } else { @irgendwas = $someotherpackageobject->method() } befuellt wurde. IMHO ist solcher code obfuscated, und ich kann euch sagen manchmal hat die tatsache dass die produzenten des codes mit dem ich mich herumschlagen darf nicht greifbar sind aeusserst positive auswirkungen auf deren gesundheit (und mein vorstrafenregister). tut mir leid, das musste ich jetzt loswerden. :*Q karlheinz ### You are subscribed to vienna-pm-list as "Karlheinz" http://www.fff.at/fff/vienna.pm/ From domm at zsi.at Tue May 21 17:30:52 2002 From: domm at zsi.at (Thomas Klausner) Date: Thu Aug 5 00:23:57 2004 Subject: [vienna.pm] Aufruf namentlich bekannter Methoden In-Reply-To: <20020522001135.B9820@teal.h.hjp.at>; from hjp-vienna-pm-list@hjp.at on Wed, May 22, 2002 at 12:11:35AM +0200 References: <20020521223659.A9820@teal.h.hjp.at> <20020521232521.I414@zsi.at> <20020522001135.B9820@teal.h.hjp.at> Message-ID: <20020522003052.J414@zsi.at> * * * vienna-pm-list * * * Hi! On Wed, May 22, 2002 at 12:11:35AM +0200, Peter J. Holzer wrote: > Nein: > syntax error at ./fruit.pl line 57, near "$method," > (perl 5.005_03) Achja, ich hab perl 5.6.1, da braucht man die Klammern nicht. Es geht aber auch mit, ist also wohl die sicherere Methode .. -- D_OMM +----> http://domm.zsi.at <-----+ O_xyderkes | neu: Arbeitsplatz | M_echanen | http://domm.zsi.at/d/d162.html | M_asteuei +--------------------------------+ ### You are subscribed to vienna-pm-list as Thomas Klausner http://www.fff.at/fff/vienna.pm/ From hjp at wsr.ac.at Wed May 22 04:10:12 2002 From: hjp at wsr.ac.at (Peter J. Holzer) Date: Thu Aug 5 00:23:57 2004 Subject: [vienna.pm] Aufruf namentlich bekannter Methoden In-Reply-To: <20020521223052.PXEJ22718.viefep13-int.chello.at@neu>; from k.zoechling@wirtschaftsblatt.at on Wed, May 22, 2002 at 12:33:24AM +0200 References: <20020521223659.A9820@teal.h.hjp.at> <20020521223052.PXEJ22718.viefep13-int.chello.at@neu> Message-ID: <20020522111012.A22829@wsr.ac.at> On 2002-05-22 00:33:24 +0200, Karlheinz wrote: > ist es denn wirklich so furchtbar den code > > On Tue, 21 May 2002 22:36:59 +0200, Peter J. Holzer wrote: > > my $apple = Fruit->new(); > > > > print "Diameter: ", $apple->diameter(); > > print "Color: ", $apple->color(); > > print "Taste: ", $apple->taste(); > > print "Has worm: ", $apple->has_worm(); > > zu akzeptieren? Capture regularity with data, irregularity with code. (Kernighan) (Schamlos von http://wwwinfo.cern.ch/dis/perl/tchrist/style/slide33.html geklaut). > mir ist schon klar dass die sache etwas "theoretisches" hat > und etwas von in-perl-muss-das-doch-eleganter-gehen. Das ist gar nicht theoretisch, und hat mehr mit Maintainability als mit mit Eleganz zu tun (ok, Eleganz ist Teil von Maintainability). Ich sehe hier zwei ganz konkrete Vorteile, das ?ber eine Datenstruktur zu l?sen statt es auszuprogrammieren: 1) Kann ich mir dann sehr einfach aussuchen, welche Felder ich ausgebe und welche nicht - ausprogrammiert w?rde das in eine if-Orgie ausarten. 2) Kann ich die Label-Texte zu den Methoden einfach auszauschen, indem ich eine andere Tabelle nehme (Stichwort Localization). > foreach (@irgendwas) { > $t->$_; > } > > das ist okay wenn @irgendwas 10 zeilen darueber definiert ist, aber es > ist definitiv nicht mehr okay wenn @irgendwas mal 1000 zeilen vorher > ueber eine logik der art > > if ($x == 1) { > @irgendwas = $someopackageobject->method() > } else { > @irgendwas = $someotherpackageobject->method() > } > > befuellt wurde. Das ist aber genau das, worauf es hinauslaufen soll: @methods = $config->interesting_fruit_attributes(); %labels = $locale->fruit->labels(); for (@methods) { print $labels{$_), ": ", $f->$_(), "\n"; } oder so ?hnlich. Welche Attribute ausgegeben werden und welcher Text dabeisteht, steht ganz woanders (vermutlich in einem Config-File) und kann ge?ndert werden, ohne die Programmlogik zu beeinflussen. hp -- _ | Peter J. Holzer | Aeltere Sources (also solche, die schon |_|_) | Sysadmin WSR / LUGA | aelter als 12 Stunden sind) sollte man | | | hjp@wsr.ac.at | bei Linux generell nicht einsetzen - __/ | http://www.hjp.at/ | Real Time Linux?? -- Gerhard Schneider -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 431 bytes Desc: not available Url : http://mail.pm.org/archives/vienna-pm/attachments/20020522/5ad054b9/attachment.bin