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;
QuoteIst 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?)?
2011-05-13T07:10:59 rostiDie Namen der Methoden (get, set) können verfeinert werden: getsid(), setsid(), getbody(); das ist von der weiteren Verwendung abhängig, womit diese griffiger wird. Sprechende Symbole.
1 2 3 4 5 6 7 8 9
my $sql_cmd = "SELECT foo, bar, baz \ FROM $table_name \ WHERE foo between... \ AND bar >= 1;" my $sqlCmd = join(' ', "SELECT foo, bar, baz", "FROM $table_name", "WHERE foo between... " "AND bar >= 1;", );
2011-05-13T07:50:57 GwenDragonIch weiß nicht, aber du brauchst gar keinen Backslash am Ende der Zeichenlkette bei SQL.
QuoteAber kein CamelCase bei Variablen, FunktionsNamen verwenden. Das ist eher unlesbar. Unterstriche machen es griffiger, finde ich.
1 2 3 4 5
my $query = q( SELECT onkz, ort, info FROM onkz WHERE match(ort), against('münch* weim*' IN BOOLEAN MODE) );
1 2 3 4 5 6 7
my $o = Foo->new; # nicht machen $o->{BAR} = 'Otto'; # bessr machen $o->setBAR('Otto');
2011-05-13T07:54:53 rostiDu wirst mehrere getter/setter brauchen, um auf die inneren Eigenschaften des Objekts zugreifen zu können. Vermeide es, außerhalb der Klasse auf die Eigenschaften _direkt_ zuzugreifen, verwende dazu eine extra Methode.
Code (perl): (dl )1 2 3 4 5 6 7my $o = Foo->new; # nicht machen $o->{BAR} = 'Otto'; # bessr machen $o->setBAR('Otto');
$o->set('BAR', 'Otto')
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
use Carp; #... sub attribute { my $self=shift; my $attr=shift; # teste ob die variable im Objekt existiert if(exists($self->{$attr})) { my $val=$self->{$attr}; # setze neuen Wert wenn angeben $self->{$attr}=shift() if(@_); return $val; } carp(qq(Attribute "$attr" not part of ).__PACKAGE__."!\n"); return undef; } # get-setter: sub id { shift->attribute('id',@_); } sub value { shift->attribute('value',@_); }
QuoteAußerdem sollte man bei generischen settern/gettern testen, ob der Schlüssel schon existiert. Es ist unpraktisch wenn ein Tippfehler als Schlüssel im Objekt landet und nichts macht. Der Programmierende sucht sonst ewig warum etwas nicht funktioniert.
Quoteaber ansonsten schreibt heute kaum noch jemand seine klassen komplett selbst.
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
package myDate; use strict; use warnings; sub TIESCALAR{ my $class = shift; my $time = shift || time; my $self = {}; my @d = localtime($time); $self->{VAL} = { yy => sprintf("%02u", (1900+$d[5])%100), yyyy => sprintf("%04u", (1900+$d[5])), 'yy-mm-dd' => sprintf("%04u-%02u-%02u", $d[5]+1900, $d[4]+1, $d[3]), 'dd.mm.yy' => sprintf("%02u.%02u.%04u", $d[3], $d[4]+1, $d[5]+1900), 'dd.mm.yy x' => sprintf("%02u.%02u.%04u %02u:%02u:%02u", $d[3], $d[4]+1, $d[5]+1900, $d[2], $d[1], $d[0]), }; return bless $self, $class; } sub FETCH{ my $self = shift; return $self->{VAL}; }
2011-05-14T04:40:51 rostiQuoteaber ansonsten schreibt heute kaum noch jemand seine klassen komplett selbst.
Wer Funktionsaufrufe langweilig findet, schreibt Tie-Klassen: