Globale Variablen der main-Class in einem Objekt bündeln

Objektorientierter Ansatz zum Vermeiden und zum Einschränken des Geltungsbereiches globaler Variablen

Es gibt wohl kaum ein Perl-Script was nicht einer Konfiguration bedarf. Wenn eine Solche nicht gerade ausgelagert wurde, beispielsweise in einer INI-Datei, werden einzelne Variablen global deklariert nach dem Schema:

 my $soll   = 21;
 my $fuse   = 1;
 my $nr     = 0;
 my $power  = 0.3;
 my $period = 10;
 my $state  = '';
 my $sleep  = 60;
 my $heatup = $ARGV[0] ? $ARGV[0] : 0

Was den Nachteil hat, daß beim Entwickeln sehr leicht die Übersicht verloren geht und öfter von oben nach unten gescrollt werden muss. Wesentlich besser ist es daher, anstelle einzelner Variablen ein assoziatives Array anzulegen:

my $CFG = {
 soll   => 21,
 fuse   => 1,
 nr     => 0,
 power  => 0.3,
 period => 10,
 state  => '',
 sleep  => 60,
 heatup => $ARGV[0] ? $ARGV[0] : 0
};

Welches dateiweit zur Verfügung steht. Ein unschätzbarer Vorteil ist, daß man jederzeit einen Dump machen kann um zu prüfen, welche Einzelwerte aktuell gültig sind. Eine Übergabe einzelner Werte in Funktionen ist nicht notwendig, weil die ganze Konfiguration ja global zur Verfügung steht. Oder sollte man vielleicht doch eine Übergabe vornehmen, etwa um mit späteren Erweiterungen besser umgehen zu können und das Script noch wartungsfeundlicher zu machen? Schauen wir, die Sache ist ganz einfach, dafür wird die Hashreferenz mit dem Namen der main-Class gesegnet:

my $main = bless{
 soll   => 21,
 fuse   => 1,
 nr     => 0,
 power  => 0.3,
 period => 10,
 state  => '',
 sleep  => 60,
 heatup => $ARGV[0] ? $ARGV[0] : 0
}, 'main';

Und damit wird die ganze Konfiguration zu einer Instanz der main-Class gemacht. Jeder Funktionsaufruf erfolgt sodann mit dieser Instanz wobei über den Pfeil-Operator die Übergabe stattfindet:

# Puls Weiten Modulation
sub pwm{
    my $self   = shift;
    my $power  = $self->{power};
    my $period = $self->{period};
    my $nr     = $self->{nr};

    $self->{nr}++;

    return 'On'  if $power == 1;
    return 'Off' if $power == 0;

    return ($nr % $period +1)/$period <= $power ? 'On' : 'Off';
}

Anmerkung: Der Artikel zeigt auch, wie der Geltungsbereich globaler Variablen eingeschränkt werden kann; wesentlich dabei ist es, daß der Zugriff nur einmal zentral erfolgt und sich daran anschließende Zugriffe nicht über die gesamte Anwendung verteilt sondern über die Klasseninstanz gekapselt sind. Globale Variablen sind mit dem Problem behaftet, daß sie über den Verlauf einer Anwendung, also auch nach de Instanzerstellung einen anderen Wert annehmen können. Mit der einmaligen Initialisierung einer Eigenschaft der Klasseninstanz wird dieses Problem eleminiert, weil jeder weitere Zugriff nicht über die globale Variable erfolgt sondern über die eigene Eigenschaft. Etwaige Änderungen erfolgen daher auch nicht über die globale Variable sondern stets in der eigenen Instanz.


Anbieter: nmq​rstx-18­@yahoo.de, die Seite verwendet funktionsbedingt einen Session-Cookie und ist Bestandteil meines nach modernen Aspekten in Perl entwickelten Frameworks.