Schrift
[thread]11551[/thread]

sort() - Frage



<< >> 10 Einträge, 1 Seite
pktm
 2008-04-01 22:42
#107707 #107707
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Wenn ich sort mit einer benutzerdefinierten Methode aufrufen möchte, wie mache ich das innerhalb eines Moduls?
Da habe ich ja Funtkionen, die über eine Instanz angesprochen werden müssen.
Außerdem möchte ich dieser Funktion eigene Parameter mitgeben.

Im endeffekt möchte ich sowas wie:
my @sortedclass = sort $self->myfunc($myownparam1, $myownparam2) @class;

Wie geht das?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
betterworld
 2008-04-01 22:57
#107708 #107708
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Code: (dl )
sort {$self->blah($a, $b)} @array;
pktm
 2008-04-02 00:42
#107711 #107711
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Danke, hatte die {} nicht gemacht.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
sid burn
 2008-04-03 13:46
#107794 #107794
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Code: (dl )
$self->myfunc($myownparam1, $myownparam2)


Benutzt myfunc() denn irgendetwas aus dem Objekt? Oft sieht man Funktionen wie

Code: (dl )
1
2
3
4
5
6
sub myfunc {
my ($self) = @_;
# nirgendswo wird $self genutzt
...
return;
}


in so einem Fall sollte myfunc() auch keine Methode vom Objekt sein und du kannst es auch einfach als "myfunc()" aufrufen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Gast Gast
 2008-04-03 15:23
#107802 #107802
Vielleicht möchte man aber nicht den Namensraum mit solchen Funktionen "zumüllen".
IMHO macht es Sinn die Sub als Methode zu gebrauchen, klar könnte man Sie auch als Klassenmethode aufrufen, das ist aber oft mehr Schreibarbeit ;)

MfG
sid burn
 2008-04-03 15:43
#107804 #107804
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Gast+2008-04-03 13:23:13--
Vielleicht möchte man aber nicht den Namensraum mit solchen Funktionen "zumüllen".
IMHO macht es Sinn die Sub als Methode zu gebrauchen, klar könnte man Sie auch als Klassenmethode aufrufen, das ist aber oft mehr Schreibarbeit ;)

MfG


Der Namensraum wird so oder so mit der Funktion "zugemüllt". Ob du nun im selben Modul $self->myfunc schreibst oder myfunc() schreibst. Die Methode myfunc() muss im Modul existieren. Und mehr schreibarbeit ist es auch nicht, sondern weniger.

"myfunc()" vs "$self->myfunc()"
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
pktm
 2008-04-03 18:59
#107825 #107825
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Na, über meine Instanz kann ich auf Methoden zugreifen, die wiederum auf gekapselte Daten zugreifen (z.B: meine getter-Methoden).
Außerdem ih die Methode bestandteil eines Packages, das objektorientiert programmiert sein soll.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Gast Gast
 2008-04-05 12:45
#107904 #107904
sid burn+2008-04-03 13:43:04--
Der Namensraum wird so oder so mit der Funktion "zugemüllt". Ob du nun im selben Modul $self->myfunc schreibst oder myfunc() schreibst. Die Methode myfunc() muss im Modul existieren. Und mehr schreibarbeit ist es auch nicht, sondern weniger.

"myfunc()" vs "$self->myfunc()"

Ich bin davon ausgegangen, dass die Methode von aussen aufgerufen wird und nicht Modul intern ist.
Dann macht es keinen Sinn "aussen" so eine Funktion zu erstellen, oder zu importieren, würde ja den Namensraum "zumüllen".
Und es ist warscheinlich mehr Schreibarbeit die Funktion als Klassenmehtode zu verwenden:
"Klasse->myfunc()" vs "$self->myfunc()"

MfG
sid burn
 2008-04-05 19:09
#107918 #107918
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
pktm+2008-04-03 16:59:52--
Na, über meine Instanz kann ich auf Methoden zugreifen, die wiederum auf gekapselte Daten zugreifen (z.B: meine getter-Methoden).
Außerdem ich die Methode bestandteil eines Packages, das objektorientiert programmiert sein soll.


1) Tust du den auch Daten über $self abrufen? Genau das ist meine Ursprüngliche Frage. Wenn du es nicht tust brauchst du es auch nicht als Methode aufrufen. Und bei Subroutinen für sort() ist das in der Regel der Fall. Da du dort überlicherweise nur $a und $b nutzt. Daher muss diese Subroutine nicht als Methode implementiert sein.
2) Wenn du Subroutine wie folgende hast.

Code: (dl )
sub num { $a <=> $b }


Dann ist das ganze nicht mehr OOP wenn du vorher noch ein "my ( $self ) = @_" hinzufügst oder du diese Subroutine über "$self->num" aufrufst. Genauso ist es weniger OOP. Genauer gesagt hat das rein gar nix mit OOP zu tun.

Deine Methode ist eine reine Helfer Methode. Sollte am besten also noch nichtmal über das Objekt selber aufrufbar sein. Solche Funktionen kennzeichnet man auch damit das man einfach nen Uterstrich vor der Subroutine schreibt.

Darüber wo wir gerade Sprechen muss ich gerade an Java Programmierer denken. Nur weil du einfach Sinnlos alles in Klassen haust, und alles über ein Objekt aufrufst. Ist das ganze deswegen nicht automatisch Objektorientiert. Weder hat es automatisch alle Vorteile die man sich von der Objektorientierung erhofft.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
pktm
 2008-04-05 22:38
#107927 #107927
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Mag sein, wenn man nur das Problem mit der sort()-Methode berachtet. Wie du schon richtig angemerkt hast gehört noch mehr dazu. zum Beispiel der Rest meines Programms -.-
Geh einfach einmal davon aus, dass mein Programm noch viel mehr tut, als nur diese sort-Methode aufzurufen.

Zu 1) Ja. hatte ich auch schon geschrieben.
zu 2) k.A. was du genau meinst. Ich habe aber auch keine Lust dir den kompletten Kode zu posten, nur weil ich einen Syntaxfehler gemacht habe.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 10 Einträge, 1 Seite



View all threads created 2008-04-01 22:42.