Thread [Mouse] Attribute zur Laufzeit generieren und vererben (5 answers)
Opened by GwenDragon at 2023-07-24 17:10

haj
 2023-07-25 18:48
#195194 #195194
User since
2015-01-07
531 Artikel
BenutzerIn

user image
2023-07-25T08:48:59 GwenDragon
Quote
Bei all diesen OO-Modulen sind Attribute einfach Keys im Objekt-Hash, da kannst Du jederzeit welche reinschreiben.

Moment, das heißt im gemousten Modul ist
Code: (dl )
$self->{FOO}

ist gleiches wie
Code: (dl )
$self->FOO()
?
Beinuhe! Probier's einfach mit meinem kurzen Beispiel aus, indem Du in der letzten Zeile anstelle von $c->text->Name schreibst: $c->text->{Name}. Funktioniert genauso. Ist aber unsauber und funktioniert nur, solange der Autor der Klasse bei Mouse bleibt und nicht etwa eines der nicht-Hash-Objektframeworks (deren gibt's auch etliche) verwendet.

Es ist auch nicht ganz genau das gleiche. Die Methode ->Name existiert deswegen, weil ich das Attribut Name mit is => 'ro' deklariert habe.

2023-07-25T08:48:59 GwenDragon
Code: (dl )
$self->{FOO} = 42;

ist gleiches wie
Code: (dl )
$self->FOO(42);
?
In meinem Beispiel schon nicht mehr: Der Versuch $c->text->Name('Mehrwert') wird abgelehnt:
Code: (dl )
Cannot assign a value to a read-only accessor of Name

Man sehe: Ich habe das Attribut als 'ro' (readonly) deklariert und nicht als 'rw' (read/write).

Irgendwie blöd, dass $c->text->{Name} = 'Mehrwert'; trotzdem funktioniert.

2023-07-25T08:48:59 GwenDragon
ich dachte, Attribute sind irgendwie tricky versteckt, damit niemand direkt dran rum murksen kann.
Nicht bei den M*-Objekthelfern! Es geht bei denen überwiegend um Komfortgewinn für "anständige" Programmierer: Die Accessor-Methoden werden automatisch generiert, und beim Konstruktor wird der Typ von Parametern automagisch überprüft. OO-Features wie Vererbung, Rollen und Delegation bekommt man auch komfortabel, aber eben ... mit Kollisionsgefahr bei den Hash-Keys.

Das ist ja der Grund, warum andere Objektsysteme entstanden sind: Da gibt's zum einen die ganze Latte von "Inside-Out"-Objektmodulen (von CPAN:Class::Std bis CPAN:Dios), bei denen die Attribute tatsächlich tricky versteckt sind. So tricky, dass der CPAN:Data::Dumper, der Debugger und Serialisierer wie CPAN:Storable erstmal nicht funktionieren - und deswegen haben die sich auch längst nicht so durchgesetzt wie M*.

Und dann gibt's eben mit CPAN:Object::Pad und ab Perl 5.38 feature 'class' die Systeme, bei denen class und method als neue Schlüsselwörter eingeführt wurden. Da sind die Attribute auch nicht mehr direkt zugänglich.


2023-07-25T08:48:59 GwenDragon
Übrigens, das hier war schon früher eine Idee von mir:
    has text => (is => 'ro', isa => 'MyModule::Config::Text');

Muss ich mal sehen wie ich das mache, dass je nach Existenz der Konfigdateien im Dateisystem das richtige Config-Modul geladen wird.
Dafür gibt's etliches auf CPAN, zum Beispiel CPAN:Module::Loader, das in seinem "SEE ALSO"-Kapitel auch einige Alternativen nennt.

View full thread [Mouse] Attribute zur Laufzeit generieren und vererben