Thread OOP, erste Schritte (15 answers)
Opened by hlubenow at 2012-02-21 16:20

moritz
 2012-02-21 16:33
#156253 #156253
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
2012-02-21T15:20:23 hlubenow
1. Ist
Code (perl): (dl )
1
2
$self->{status} # bzw.
$lamp->{status}

wirklich die richtige Notation, um an die Attribute heranzukommen oder gibt es noch eine einfachere, kürzere?


Innerhalb der Klasse ist das richtig. Von ausserhalb sollte man gar nicht auf Attribute zugreifen, sondern nur Methoden aufrufen.


Quote
2. Wie erhält man von außerhalb Zugriff auf $classname? Wieso erhält das überhaupt einen Wert? Wenn ich Lamp->new() aufrufe, übergebe ich doch gar kein Argument.


Das erste Argument ist immer der sogenannte "invocant", also das Objekt, auf dem die Methode aufrufst. Im Falle von
Code: (dl )
Lamp->new
ist das erste Argument einfach der String "Lamp".

Quote
3. Könnte man die geschweiften Klammern um das Package auch weglassen?


Koennte man machen, macht man aber nur, wenn das Package der einzige Inhalt einer .pm-Datei ist. Die Klammern verhindern, dass man sich aus Versehen im falschen Package aufhaelt, oder dass man aus Versehen Variablen wiederbenutzt, die man eigentlich nicht wiederbenutzen will.

Quote
4. Arbeitet man bei diesem $self wirklich mit einer Referenz auf einen anonymen Hash? Scheint mir ebenfalls eine recht komplizierte Kontstruktion.


Ja. Das Objektsystem in Perl 5 ist im Nachhinein dazugefuegt worden, und ist daher nicht immer so einfach, wie es am einfachsten waere.

Quote
5. Oder gibt es vielleicht überhaupt einen Weg, das alles besser zu schreiben?


Du kannst ein Modul wie CPAN:Moose nehmen, was das ganze schoener aussehen laesst. Oder Perl 6, wo das so aussehen wuerde:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use v6;
class Lamp {
has $.status = 'off';
method switchOn { say "Click. Light."; $!status = 'on' }
method switchOff { say "Click. Darkness."; $!status = 'off' }
method printStatus { say "The lamp is $!status now" }
}

my $lamp = $lamp.new;
$lamp.printStatus;
$lamp.switchOn;
$lamp.printStatus;
$lamp.switchOff;
$lamp.printStatus;
say $lamp.status;


Quote
6. Setzt ihr viel OOP mit Perl ein oder kommt ihr meist ohne aus?
Schreibt ihr z.B. Tk-Anwendungen objektorientiert oder eher nicht?


Kommt drauf an. Bei groesseren Sache benutze ich schon meistens OO.

View full thread OOP, erste Schritte