Thread Stilfragen (Anfaengerperl)
(12 answers)
Opened by shi8dao at 2011-05-13 08:33
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; |