Thread Best Practice : "local < Variable >;" & Bereitstellung (6 answers)
Opened by YAPD at 2021-05-12 13:46

haj
 2021-05-12 16:24
#193267 #193267
User since
2015-01-07
558 Artikel
BenutzerIn

user image
Nun ja, local ist nicht das die richtige Schlüsselwort dafür. Mit local definierst Du keine Variable, sondern Du setzt dynamisch einen Wert für eine "anderswo" definierte. Das funktioniert nur, weil Du die Variable explizit mit einem Package qualifizierst.

Ein mögliches Verfahren wäre, in Deinem Hauptskript die Variable nicht als lexikalische Variable mit my, sondern als global verfügbare mit our zu deklarieren:
Code (perl): (dl )
our $OM = Kernel::OM -> new( );

Dann kannst Du den Objektmanager aus jedem Teil Deines Codes als $main::OM oder kurz $::OM verwenden (Dein Hauptskript läuft, wenn nichts anderes angegeben, im Namensraum main, und den kann man auch weglassen).

Etwas mehr im Sinn der Objektorientierung: Ich nehme an, Du hast nur einen Objektmanager. Man nennt sowas dann ein "Singleton". Na ja, seit dem Film manchmal auch ein "Highlander-Objekt".

So eine Singleton-Klasse hat in der Regel kein new, denn sonst könnte ja jeder Teil Deines Programms einen neuen OM bauen. Statt dessen gibt es eine Methode init, die das Ding einmal einrichtet, und eine Methode instance, die dieses Objekt liefert. Das sind beides Klassenmethoden. In Kürze:
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use 5.024;
use strict;
use warnings;

package Kernel::OM {

    my $OM;

    sub init {
        my $class = shift;
        my %params = @_;
        
        die "Nur eine Initialisierung, bitte!" if $OM;
        
        $OM = bless { %params }, $class;
        return $OM;
    }

    sub instance {
        my $class = shift;
        
        die "Noch nicht initialisiert!" unless $OM;
        
        return $OM;
    }
}

# ------- Benutzt wird das wie folgt: 

use Data::Dump qw/dump/;

# Einmal, am Anfang:
Kernel::OM->init (irgend => 'welche',
                  para   => 'meter')
    or die "Hoppla: Kein Objektmanager!";

# und dann, von überall her:
my $om = Kernel::OM->instance;
dump $om;

View full thread Best Practice : "local < Variable >;" & Bereitstellung