Schrift
[thread]8413[/thread]

Daten aus Array (Seite 2)

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
renee
 2006-10-13 15:06
#70753 #70753
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Der Gnarl,13.10.2006, 12:49][...]

Und welchen Unterschied machts, wenn ich direkt in des Array reingreife oder Klassenmethoden benutze. Ich brauch doch nur den Wert, der da steht und weiter nichts. Ist das schneller, besser oder nur eine rein ideologische Kiste?[/quote]
Es ist einfach sauberer, die Klassenmethoden zu benutzen.

Nehmen wir z.B. die von Dir verwendete Methode answer. Wenn Du direkt auf das Attribut zugreifst, bekommst Du eine Arrayreferenz, mit der Methode bekommst Du das gleich in ein Array dereferenziert.

Besonders bei setter-Methoden ist es wichtig, diese zu verwenden und nicht auf das Attribut direkt zuzugreifen. Häufig werden noch irgendwelche Überprüfungen oder Berechnungen in der setter-Methode verwendet.

In diesem Beispiel ist es auch eine relativ flache Struktur. Jetzt stell Dir aber mal vor, es gibt Klassen die Bauen so eine Struktur auf:

Code: (dl )
attr1 => {hallo => {int => {en => 'hello', es => 'hola'}, de => {hessisch => 'gude'}}}


Da ist es sehr unschön, mit $obj->{hallo}->[int}->{en} zuzugreifen, da ist es doch besser mit $obj->int_hallo('en') darauf zuzugreifen. Das bietet Dir auch eine gewisse Sicherheit. Wenn Du $obj->{halo}->{int}->{en} benutzt, bekommst Du einfach ein 'undef' zurück. Dir fällt also der Schreibfehler nicht auf. Wenn Dir aber der gleiche Schreibfehler bei der Methode passiert, also $obj->int_halo('en') bekommst Du gleich eine Fehlermeldung. Die Methode überprüft vielleicht auch noch, ob es en überhaupt als Schlüssel gibt.

Nur mal so als Beispiel warum man die Methoden verwenden sollte...\n\n

<!--EDIT|renee|1160737713-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Der Gnarl
 2006-10-13 15:10
#70754 #70754
User since
2006-10-13
4 Artikel
BenutzerIn
[default_avatar]
[quote=renee,13.10.2006, 12:56]
Code: (dl )
1
2
3
4
5
my $res = Net::DNS::Resolver->new;

$dns_name = $res->query('198.133.219.25';);
$antwort=($dns_name->answer)[0];
print $antwort->ptrdname;
[/quote]
Funktioniert. (Bis auf den Tipp-Fehler)

Danke nochmal an alle.
sid burn
 2006-10-13 16:36
#70755 #70755
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Stell dir vor du schreibst eine Klasse die eine farbe beinhaltet. Du hast z.B. die Möglichkeit die einzlenen RGB (Rot, Grün, Gelb) Werte zu setzen. (Der untere Code ist rein erfunden)

so erzeugst du die Farbe:
Code: (dl )
my $color = Color->new( 255, 0, 0 );

Und so liest du Sie aus:
Code: (dl )
$color->get_blue()

Code: (dl )
$color->get_red()

Und es gibt noch ein algemeines das den genauen Farbwert angibt.
Code: (dl )
$color->get


Das was du jetzt machst wäre vergleichbar als wenn du auf einmal die einzelnen Werte ausliest.
Code: (dl )
$color->[0]

Code: (dl )
$color->[1]


Das ganze Funktioniert jetzt noch so lange, wie die interne Darstellung stimmt. Sollte der Author von einem Array zu einem hash Wechseln Funktioniert dein Code nicht mehr, und du müsstest überall deinen Code anpassen. Wenn er ein Array benutzt, würde es ja schon Reichen wenn er die Reihenfolge im Array ändert, und du würdest dann auf einmal einen anderen Farbwert benutzen. Versuch mal so ein Problem ausfindig zu machen.

Stell dir vor der Author des Moduls geht jetzt folgendermaßen vor, und speichert die farbe intern auf einmal in YUV oder in CMYK oder sonst irgendwie anders. Dann Funktioniert dein Code ebenfalls nicht mehr.

Das was der Author aber macht ist eine Methode bereit zu stellen, die immer das selbe zurück gibt. Immer wenn du "$color->get" aufrufst bekommst du deinen RGB Wert. intern kann es aber jetzt antürlich sein das erst von CMYK nach RGB umgerechnet wird.

Da du aber direkt auf die Elemente zugreifst, würde dein Code jetzt nicht mehr Funktionieren.

Zum anderen muss es ja nicht so sein das eine "get" Methode einfach nur den Wert zurück gibt wie er gespeichert wird. Es kann auch genauso möglich sein, dass erst noch eine Berechnung gemacht wird, etwas umgewandelt wird etc.

All dies umgehst du wenn du direkt auf die Werte zugreifst, und nicht die Methoden benutzt.\n\n

<!--EDIT|sid burn|1160743231-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2006-10-13 13:36.