Thread Bitte um Hilfe bei bless Fehler (39 answers)
Opened by bianca at 2019-09-28 17:06

haj
 2019-09-30 18:19
#190598 #190598
User since
2015-01-07
558 Artikel
BenutzerIn

user image
2019-09-30T14:00:41 GwenDragon
Warum trennst du in setter und getter?

...

Oder was meint ihr?

BTW: Schöner Tippfehler bei my $self = .... :)

Das ist, wie so vieles in Perl, Geschmackssache, und hängt wohl auch davon ab, von welcher Art die Attribute sind, mit denen man üblicherweise zu tun hat.

Damian Conway schreibt in seinen Perl Best Practices:
Quote
Provide separate read and write accessors.
Allein das kann man schon als ausreichenden Anlaß für die Trennung durchgehen lassen, da er noch einige Argumente dafür anführt.

Ich habe mir angewöhnt, die Methoden zu trennen, hier sind meine persönlichen Gründe dafür:
  • Ich kann schneller erkennen, ob ein Attribut "read-write" oder "read-only" ist.
  • Ich mag zur Diagnose gelegentlich per grep oder ähnlichem feststellen, an welchen Stellen im Code denn ein Attribut gesetzt worden sein könnte. Wenn Getter und Setter die gleiche Routine sind, dann geht das nicht - im Fall von location(%fields) wird erst zur Laufzeit entschieden, ob ein Getter oder Setter vorliegt.
  • Ich habe oft, so wie hier bei location, den Fall, dass zwei Attribute "zusammenpassen" müssen. In dem Fall verwende ich keinen Setter, sondern eine Methode wie move. Wenn ich Deinen Accessor so anwende:
    Code (perl): (dl )
    $person->location(location => 'vorne links')
    ...dann ist hinterher die Postleitzahl futsch, und es mag mühsam sein, herauszufinden, warum. (Der Getter ist in dem Beispiel, das Du übernommen hast, auch seeehr verdächtig, er gibt einfach das Objekt zurück).
  • Manchmal sind meine Attribute ArrayRefs oder HashRefs. Da brauche ich dann oft Getter, die ein einzelnes Element zurückgeben - und schon habe ich einen Getter mit Attribut.

Ein einfaches Beispiel für den letzten Punkt:
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
use 5.020;
package Sphere;

sub new {
    my $class = shift;
    my $self = {
        location => { x => 1, y => 2, z => 3 },
        radius   => 100,
    };
    bless $self,$class;
}

sub get_location {
    my $self = shift;
    return $self->{location}{shift()};
}

package main;

my $sphere = Sphere->new;
my $y = get_location('y');
say $y;

Wenn die vor letzte Zeile einfach nur my $y = $sphere->location('y'); lauten würde, dann sieht das nach einem Setter aus, und ich würde jedesmal drüber stolpern, was denn 'y' für eine Location sein könnte, und was der Setter wohl zurückgibt.

Tatsächlich trenne ich seit einigen Jahren die Accessoren nicht mehr von Hand, sondern lasse trennen (von CPAN:Moose), und um Damian zu ärgern, nenne ich die Getter wie das Attribut und die Setter haben den Präfix set_ (mit CPAN:MooseX::SemiAffordanceAccessor), weil ich's schon vor Moose so gemacht habe. Mein API hat sich durch die Umstellung auf Moose nicht geändert.

View full thread Bitte um Hilfe bei bless Fehler