Moin!
Unter Perl gibt es ja die Moeglichkeit auf Funktoinen in einem Modul mittels <PAKETNAME>::<Fumktionsname> zuzugreifen.
Statischer Aufruf einer Klassenmethode. Hat gewisse Vorteile (man braucht kein Objekt instanziieren), und gewisse Nachteile (eine Klasse hat keine Objektvariablen und keinen Konstruktor, weil es keine Instanziierung gab).
Wenn man das Paket aber objektorientiert nutzen will, ist das ja nicht ganz unproblmatisch, da es sein koennte dass der Konstruktor noch gar nicht gerufen wurde.
Richtig, und die einzige Chance dagegen ist, dass man das Paket einfach "vernünftig" nutzt. Wenn die Klasse zwingend mindestens eine Instanz benötigt, und ihre Methoden nicht statisch sinnvoll aufgerufen werden können, ist es in der Verantwortung des Programmierers, das zu tun. Andernfalls muß er mit den Konsequenzen leben.
Beispielsweise:
my $log = Log::_getInstance()
or die 'Could not get instance for log' . "\n" ;
eval ("Log::log('Logged in class scope...')")
Wenn die Methode log der Klasse Log statisch aufgerufen wird und das nicht verträgt (weil die Verbindung zu einem offenen Logfile, die durch den Konstruktur hergestellt wird, fehlt), wird sie den Fehler in der Regel selbst bemerken und entsprechende Fehlerwerte zurückgeben. Sollte sie zumindest.
$log->log('Logged correctly')
Die Methode log des Objekts $log hingegen findet ja alles so vor, wie geplant: Eine Instanz, einen aufgerufenen Konstruktor etc. Wenn jetzt noch irgendwas fehlschlagen kann, sind es unerwartete Fehler wie "Festplatte voll". Auch das wäre zu berücksichtigen, aber außerhalb des Themenbereiches hier.
Ist das Eurer Meinung nach
- eval('undef'); # ;-)
- (void*) NULL; // Denn Perl ist nun mal kein C++
- Voelliger Mist
- Verwirrend fuer den Nutzer
- Kalter Kaffee # "Das mach ich doch seit Beginn der Epoche besser..."
- vielleicht doch irgendwie brauchbar
- ...
Um was geht's dir denn konkret? Das Singleton-Pattern kann man auf diverse Arten umsetzen. Man kann sowohl eine separate Klasse zur Instanziierung haben, als auch eine statische getInstance-Methode, oder "nur" eine Funktion mit lokaler statischer Variable...
Aber egal ob Singleton oder normale Instanziierung: Du hast immer das Problem, dass statische Aufrufe, die der Hersteller der Klasse nicht vorgesehen hat, böse sind.
- Sven Rautenberg
"Love your nation - respect the others."