Der Einsatz des ternären Operators an dieser Stelle ist schon etwas krude.
Allgemein heisst es; bitte kein
$foo == 3 ? $bar = x : $bar = y;.
Das sollte besser als
$bar = $foo == 3 ? x : y; geschrieben werden.
Und hier bei Deinem Code ist es ja noch verworrener:
$_[1] ? $_[0]->{'counter'} = $_[1] : \$_[0]->{'counter'};
Wenn das zweite Argument WAHR ist, dann wird der Wert als Counter übernommen und der neue Wert zurück gegeben; Wenn der Wert nicht wahr ist, dann wird eine Referenz auf den alten Wert zurück gegeben.... Ja, wie jetzt? Solchen Misch-Masch würde ich vermeiden.
Code-Optimierungen schön und gut, aber es sollte lesbar und verständlich bleiben. Auch nach 3 Monaten Abstinenz von diesem Code.
Ich würde den Setter anders schreiben und zwar so (basierend auf Deinem Code):
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
use strict;
use warnings;
use Tk;
package Test;
sub new {
my $class = shift;
my $self = {
counter => 0,
};
bless $self, ref($class)||$class;
return $self;
}
sub add_to_counter {
my ( $self, $value, ) = @_;
$self->{counter} += $value if $value;
return \$self->{counter};
}
package main;
my $counter = 0;
my $test = Test->new();
my $mw = tkinit();
my $button1 = $mw->Button(-textvariable => \$counter)->pack();
my $button2 = $mw->Button(-textvariable => $test->add_to_counter() )->pack();
$mw->repeat(100 => sub { fetch_data($test) });
MainLoop;
sub fetch_data {
my $obj = shift;
$counter++;
$obj->add_to_counter( 1 );
}
1;
Und das tolle daran, man braucht auch keinen ternären Operator ;-)
Im produktiven Code würde ich wahrscheinlich sogar eine eigene Methode implementieren, die nur die Referenz zurückliefert und diese bei
-textvariable => $object->get_ref() verwenden und die Referenz komplett aus dem Setter entfernen.
Und weil's nur eine kleine Modifikation ist:
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
use strict;
use warnings;
use Tk;
package Test;
sub new {
my $class = shift;
my $self = {
counter => 0,
};
bless $self, ref($class)||$class;
return $self;
}
sub get_counter_ref {
my ( $self, ) = @_;
return \$self->{counter};
}
sub add_to_counter {
my ( $self, $value, ) = @_;
$self->{counter} += $value if $value;
return $self->{counter};
}
package main;
my $counter = 0;
my $test = Test->new();
my $mw = tkinit();
my $button1 = $mw->Button(-textvariable => \$counter)->pack();
my $button2 = $mw->Button(-textvariable => $test->get_counter_ref() )->pack();
$mw->repeat(100 => sub { fetch_data($test) });
MainLoop;
sub fetch_data {
my $obj = shift;
$counter++;
$obj->add_to_counter( 1 );
}
1;
Last edited: 2017-07-25 17:48:46 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!