Thread [Tk] -textvariable an subroutine binden (16 answers)
Opened by styx-cc at 2017-07-25 12:08

Linuxer
 2017-07-25 17:45
#187028 #187028
User since
2006-01-27
3766 articles
HausmeisterIn

user image
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):

Code (perl): (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
#!/usr/bin/perl
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:

Code (perl): (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
#!/usr/bin/perl
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!

View full thread [Tk] -textvariable an subroutine binden