Struppi: uff uff! our our gib uns heute...

Beitrag lesen

Wichtiger als die privatisierung ist die einheitliche öffentliche Schnittstelle, und diese soll dann unabhängig von der inneren Struktur sein.
Das ist mein Ziel.

Ich glaube hier möchtest du ein singleton haben, das sich in Perl auch leicht realisieren läßt.

#! /usr/bin/perl -w  
use strict;  
  
package Test;  
my $self = bless {}, __PACKAGE__;  
sub new {  
 return $self;  
}  
sub addSub {  
   shift; #falls du die Funktion mit $instanz->addSub ansprechen musst  
   my($name, $sub) = @_;  
  
   no strict 'refs';  
   *{ (ref $self ) .'::' . $name} = $sub;  
}  
  
package main;  
  
my $o = new Test();  
  
$o->addSub('test', \&hallo);  
$o->test('hallo');  
  
sub hallo {  
 shift;  
 print shift;  
}

Es ist einfach so, dass jede sub, der ich ein $self übergebe
automatisch öffentlich wird für das Hauptscript.

Meinst du, dass du deinem Objekt Funktionen hinzufügen möchtest?

#! /usr/bin/perl -w  
use strict;  
  
package Test;  
my $self = bless {}, __PACKAGE__;  
sub new {  
 return $self;  
}  
sub addSub {  
   shift; #falls du die Funktion mit $instanz->addSub ansprechen musst  
   my($name, $sub) = @_;  
  
   no strict 'refs';  
   *{__PACKAGE__ .'::' . $name} = $sub;  
}  
  
package main;  
  
my $o = new Test();  
  
$o->addSub('test', \&hallo);  
$o->test('hallo');  
  
sub hallo {  
 shift;  
 print shift;  
}  

Zwischen Aufrufen der öffentlichen Methoden bleibt die bearbeitete
Instanz konstant.
Deshalb kopiere ich in new() das $self in $c_self, das mit my privat ist.
Es kann also nur innerhalb des eigenen Moduls verwendet werden.

Das ist ein singleton, wie oben beschrieben.

Dann kann auf die immer zur Verfügung gestellten gegenwärtigen Optionen zugegriffen werden, über $PC->('option', 'whichoption').
Ditto kann ich defaultwerte welche die Funktion selbst definiert
gegen lokale Überschreibungen vergleichen
$PC->('default', 'thisfunkton', 'defaultoption' )

Ein Sache, die gerne in Büchern empfohlen wird, ist, nicht zuviel Funktionalität in eine Funktion packen. Sie wird dadurch immer schwerer benutzbarer und auch die Fehlersuche kann sich erheblich erschweren.

Der Rest ist auch für mich nicht 100% verständlich, bzw. ist mir nicht klar was am Ende rauskommen soll. Aber bei dem was ich verstehe scheint es mir du machst es dir umständlich, bzw. willst du zuviel. Ich habe auch lange versucht Funktionen so universell wie möglich zu halten, habe aber mittlerweile eingesehen, dass ein Aufruf von "Hand" oft der Übersichtlichkeit dient und im Zweifelsfall nutze ich lieber Funktionalität die Perl sowieso schon bietet (oder vorhandene Module) bevor ich mir mit komplexen Strukturen oder Funktionen selbst in's Knie schiesse.

Struppi.