Thread Stilfragen (Anfaengerperl) (12 answers)
Opened by shi8dao at 2011-05-13 08:33

shi8dao
 2011-05-13 08:33
#148549 #148549
User since
2011-04-26
28 Artikel
BenutzerIn
[default_avatar]
Da ich erst vor einem Monat angefangen habe Perl zu programmieren, bin ich mir unsicher ob ich 'idiomatisches' Perl schreibe.

Ich habe ein kleines Modul geschrieben mit einer Klasse, deren Objekte im Prinzip nur zwei Attribute haben: 'id' und 'value'. Ich habe versucht, die operatoren ~~, + und "' zu ueberladen.
Erstmal: Mache ich das korrekt? (erste Versuche von mir funktionieren, aber das heisst ja nicht, dass es korrekt ist).
Ist die Benennung mit dem Unterstrich in Ordnung um zu kennzeichnen, dass es 'private' Methoden sind?

Ist der Zugriff auf die Variablen mit get so in Ordnung oder ist das fuer Perl zu umstaendlich (und: lieber 'value' oder direkt value?)?

Sind die Kommentare so in Ordnung (die Kommentare fuer _match und _stringify habe ich mal weggelassen, sonst ist der Post noch viel unnoetig laenger als er schon 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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/usr/bin/perl 
#==============================================================================

=pod

=head1 NAME

counter.pm

=head1 VERSION

1.0

=head1 DESCRIPTION

This module contains the class counter.
It stores an id and a value for this counter.

=head1 AUTHOR

Mein Name I<meine.email@adresse.de>

=head1 CREATED

2011-05-12

=head1 LAST MODIFIED

2011-05-13

=cut
#==============================================================================

use strict;
use warnings;
use v5.10.0;    # 'say' and some other nice features

package Counter;
use overload
    '~~' => \&_match,        # Overload ~~ for easier matching
    '+'  => \&_add,          # Overload + for easier value adding.
    '""' => \&_stringify;    # Overload "" for correct printing 

# Create a new counter with an id. Initialize value with 0
sub new
{
    my ( $class, $id ) = @_;
    my $self = {};
    $self->{'id'}    = $id;
    $self->{'value'} = 0;

    bless( $self, $class );
    return $self;
}

##############################################################################
# A generic getter. Return the value of the attribute.
#
# example:
# my $value = my_counter->get('id');
#
# parameters:
# $attr - The attribute to return.
##############################################################################
sub get
{
    my ( $self, $attr ) = @_;
    return $self->{$attr};
}

##############################################################################
# A generic setter. Set the value of a given attribute.
#
# example:
# my_counter->set('value', 200);
#
# parameters:
# $attr  - The attribute to set.
# $value - The value to set for the attribute.
##############################################################################
sub set
{
    my ( $self, $attr, $value ) = @_;
    $self->{$attr} = $value;
}

##############################################################################
# Add a number to the counter value.
# Don't use this method directly. Use the '+' operator instead.
#
# example:
# my_counter += 100;
#
# parameters:
# $number - The number to add to value.
##############################################################################
sub _add
{
    my ( $self, $number ) = @_;

    my $new_counter = Counter->new( $self->get('id') );
    if ( ref $number )
    {
        $new_counter->set( 'value',
            $self->get('value') + $number->get('value') );
    }
    else
    {
        $new_counter->set( 'value', $self->get('value') + $number );
    }
    return $new_counter;
}

sub _match
{
    my ( $self, $id ) = @_;
    return $self->get('id') ~~ $id;
}

sub _stringify
{
    my $self = shift;
    return $self->get('value');
}

1;

View full thread Stilfragen (Anfaengerperl)