Schrift
[thread]11771[/thread]

Counter innerhalb einer Klasse? (Seite 2)

Leser: 1


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
Struppi
 2008-05-07 16:07
#109369 #109369
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Wie gesagt, das ist etwas komplett anderes als dein ursprüngliches Beispiel. Du solltest dich vielleicht nochmal mit den Grundbegriffen der OOP auseinandersetzen.

die Frage wäre auch noch, was dich so stört:
Code (perl): (dl )
$self->counter( $self->counter + 5);
Das ist durchaus üblich und wenn du Additionen öfters hast, dann schreib eine add() sub.
JackBauer
 2008-05-07 16:14
#109372 #109372
User since
2008-04-30
16 Artikel
BenutzerIn
[default_avatar]
@KurtZ Das war jetzt eine Analogie zu Java / C++. Dort kann man int x += 5; schreiben als Kurzform für int x = x + 5;

@Struppi Mich stört, dass es scheinbar nur über eine Funktionsaufruf machbar ist, aber vielleicht sehe ich das ja anders, wenn ich mich nochmerh mit OOP in Perl beschäftigt habt. Dein Vorschlag gefällt mir aber erst mal ganz gut, weil ich dabei nicht die Getter/Setter verändern muss.
sid burn
 2008-05-07 16:15
#109373 #109373
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Quote
@sid burn Mit deinen Sources kann ich allerdings nur die Anzahl meiner Objekte zählen, welche widerum für mich nicht interessant ist. Ich benötige einen einfachen counter, den ich innerhalb meiner Insatnz beliebig inkrementieren, dekrementieren und ausgeben kann.

Achso, na dann habe ich dich vollkommen falsch verstanden.
Ich dachte du wolltest nen Klassencounter. Also nen Counter in der Klasse der die Objekte zählt.

Ansonsten ist das was du ja willst nur nen simples attribut das du beliebig incr/decrementieren kannst. Nur anstatt $self->{counter} += 1; möchtest du anscheinend $self->counter += 1.

Also einen Sinn darin sehe ich nicht unbedingt. Lvalue kannst du machen aber ich finde das ist auch zu magisch und wegen experimentel würde ich es auch nicht nutzen. Ein anderer ansatz wäre ansonsten noch eine kleine Counter Klasse wo du die Operatoren überlädst.

Aber ich finde solch eine Technik eher schlecht als gut. Bei $self->counter += 1 vermutet man nicht das dieses auch intern den counter neu setzt da es eben ein Methodenaufruf ist der nur etwas zurück gibt.

Spätestens wenn du sowas schreibst << printf "Anzahl: %d\n", $obj->counter + 1 >> wunderst du dich warum du auch den counter im objekt erhöhst.

Ich würde sowas ehrlich gesagt sein lassen. Welchen Vorteil es brnigen soll ist mir auch ein Rätsel.

Quote
@KurtZ Das war jetzt eine Analogie zu Java / C++. Dort kann man int x += 5; schreiben als Kurzform für int x = x + 5;

Kannst du in Perl doch genauso...

Nur du rufst bei $self->counter eine Methode auf die etwas zurück gibt und möchtest den Wert addieren und das ergebnis soll automatisch wieder gesetzt werden. Das ist was ganz anderes... Vielleicht wird es dir mir Klammern einleuchtender was du tust.

Code: (dl )
$self->counter() += 5


Ich würde es lieber so machen.
Code: (dl )
1
2
3
$self->counter(5); # setzen
$self->add_counter(4); # 4 dazu addieren
$self->del_counter(3); # 3 wieder abziehen


oder folgendermaßen.

Code: (dl )
1
2
3
$self->counter(5); # setzen
$self->counter('+', 4); # 4 dazu addieren
$self->counter('-', 2); # 2 wieder subtrahieren
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Struppi
 2008-05-07 16:18
#109375 #109375
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Sowas kannst du, wenn du OOP programmierst, immer nur über eine Funktion machen. In Perl kannst du es mit lvalue probieren, wenn du das eventuelle Risiko eingehen kannst, dass sich dort vielleicht die Syntax o.ä. ändert.
KurtZ
 2008-05-07 16:22
#109377 #109377
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Struppi+2008-05-07 14:07:58--
Code (perl): (dl )
$self->counter( $self->counter + 5);
Das ist durchaus üblich und wenn du Additionen öfters hast, dann schreib eine add() sub.


ACK, hier ist counter() nun ein reiner setter ohne Zusatzlogik, was mir Namenstechnisch auch sauberer erscheint! Eine Zusatzmethode counter_add() oder counter_inc() wird man sich ja bei Bedarf wohl leisten können.

@Jack: Besorg dir vielleicht lieber "Perl Best Practices" und benutze das dort propagierte konsistente CPAN:Class::Std, bevor du so wilde Hacks aus dem Internet ziehst und die Sprache neu erfindest. Selbst wenn du dich gegen Class::Std entscheidest hast du wenigstens eine solide Basis.

Das Perl Objektmodell zu tief manipulierbar, als das googeln und c&p dich hier weiterbrächte.
TMTOWTDYOG (there's more than one way to dig your own grave)
sid burn
 2008-05-07 16:24
#109379 #109379
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
KurtZ+2008-05-07 14:22:55--
Struppi+2008-05-07 14:07:58--
Code (perl): (dl )
$self->counter( $self->counter + 5);
Das ist durchaus üblich und wenn du Additionen öfters hast, dann schreib eine add() sub.


ACK, hier ist counter() nun ein reiner setter ohne Zusatzlogik, was mir Namenstechnisch auch sauberer erscheint! Eine Zusatzmethode counter_add() oder counter_inc() wird man sich ja bei Bedarf wohl leisten können.

Nope, es ist auch automatisch ein getter. Sonst würde "$self->counter + 5" ja nicht gehen. $self->counter ohne Argument liefert den aktuellen Stand.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
KurtZ
 2008-05-07 16:30
#109381 #109381
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
JackBauer+2008-05-07 14:14:35--
@KurtZ Das war jetzt eine Analogie zu Java / C++. Dort kann man int x += 5; schreiben als Kurzform für int x = x + 5;


nochmal die Frage intern oder extern???

Intern schreib einfach $self->{counter}+=5;

Extern sind Mutatoren aus Gründen der Wartbarkeit empfehlenswert. Auch in Java!!!

Begründung -> 4. Posting
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-05-07 16:32
#109383 #109383
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
sid burn+2008-05-07 14:24:53--
KurtZ+2008-05-07 14:22:55--
[ACK, hier ist counter() nun ein reiner setter ohne Zusatzlogik, was mir Namenstechnisch auch sauberer erscheint! Eine Zusatzmethode counter_add() oder counter_inc() wird man sich ja bei Bedarf wohl leisten können.

Nope, es ist auch automatisch ein getter. Sonst würde "$self->counter + 5" ja nicht gehen. $self->counter ohne Argument liefert den aktuellen Stand.

Missverständnis, der Setter-Anteil ist rein, statt irgendwas aufzuadieren. Der getter bleibt unverändert zu vorher, deswegen hier nicht extra erwähnt.

Vielleicht besser: Es ist also ein reiner Mutator und wenn eine Methode namensgleich zu einer Variablen ist sollte es per Konvention ein Mutator sein oder man ändert den Namen.
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-05-07 20:44
#109412 #109412
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Noch zwo Tips:

CPAN:Class::Accessor (schlank) und CPAN:Moose (umfangreich)
TMTOWTDYOG (there's more than one way to dig your own grave)
topeg
 2008-05-07 22:40
#109415 #109415
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/perl

use strict;
use warnings;

package Foo;

sub new
{
my $class=shift;
my $self={};
$self->{count}=0;
bless($self,$class);
return $self;
}

sub counter
{
my $self=shift;
if(@_)
{
my $opt=shift;
my $val=@_?shift(@_):undef;
return 0 unless($opt=~/^[+-=]{1,2}|^\d+$/ );
if($opt eq '=')
{
return 0 unless(defined($val));
$self->{count}=$val+0;
}
elsif($opt eq '+=')
{
return 0 unless(defined($val));
$self->{count}+=$val;
}
elsif($opt eq '-=')
{
return 0 unless(defined($val));
$self->{count}-=$val;
}
elsif($opt eq '++')
{ $self->{count}++; }
elsif($opt eq '--')
{ $self->{count}--; }
elsif($opt=~/^\d+$/)
{ $self->{count}=$opt; }
else
{ return 0; }
return 1;
}
else
{ return $self->{count}; }
}

package main;

my $val=Foo->new();

$val->counter( 3 );
print $val->counter."\n";

$val->counter('++');
print $val->counter."\n";

$val->counter('--');
print $val->counter."\n";

$val->counter qw( = 10);
print $val->counter."\n";

$val->counter qw( += 5 );
print $val->counter."\n";

$val->counter qw( -= 20 );
print $val->counter."\n";


So könnte man es auch machen...
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2008-05-07 14:48.